如何配置GAE / java servlet的url路径

萨纳穆里(Manjunath Satyamurthy)

我来自python flask / django。我正在尝试使用GAE-java构建应用程序。我只是对Google Appengine文档了解得不够多。

据我了解,创建.jsp文件本身会将其映射为jsp文件名作为url路径。但是,如果我想编写自己的get方法和post方法怎么办?我到底需要做什么?

现在,我的项目结构如下所示。

在此处输入图片说明

而我的web.xml如下

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

    <filter>
      <filter-name>ObjectifyFilter</filter-name>
      <filter-class>com.googlecode.objectify.ObjectifyFilter</filter-class>
    </filter>
    <filter-mapping>
      <filter-name>ObjectifyFilter</filter-name>
      <url-pattern>/*</url-pattern>
    </filter-mapping>
    <listener>
      <listener-class>com.signup.OfyHelper</listener-class>
    </listener>

    <servlet>
        <servlet-name>signup</servlet-name>
        <jsp-file>/signup.jsp</jsp-file>
    </servlet>

    <servlet>
      <servlet-name>signup</servlet-name>
      <servlet-class>com.signup.SignupServlet</servlet-class>
    </servlet>

    <servlet-mapping>
      <servlet-name>signup</servlet-name>
      <url-pattern>/signup</url-pattern>
    </servlet-mapping>

</web-app>

我的signup.jsp如下

<html>
  <head>
    <title>Sign Up</title>
    <link href="/static/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
    <link href="/static/css/AdminLTE.min.css" rel="stylesheet" type="text/css" />
  </head>

  <body class="login-page">
    <div class="login-box">
      <div class="login-logo">
        <b>SRH Fleet</b>
      </div>
      <div class="login-box-body">
        <p class="login-box-msg">Sign in</p>
        <form action="/signup" method="post">
          <div class="form-group has-feedback">
            <input name="firstName" class="form-control" placeholder="Firstname" />
            <span class="glyphicon glyphicon-envelope form-control-feedback"></span>
          </div>
          <div class="form-group has-feedback">
            <input name="lastName" class="form-control" placeholder="Lastname" />
            <span class="glyphicon glyphicon-lock form-control-feedback"></span>
          </div>
          <div class="form-group has-feedback">
            <input name="phoneNumber" class="form-control" placeholder="Phone Number" />
            <span class="glyphicon glyphicon-lock form-control-feedback"></span>
          </div>
          <div class="form-group has-feedback">
            <input name="loginTime" class="form-control" placeholder="Login time (hh/mm)" />
            <span class="glyphicon glyphicon-lock form-control-feedback"></span>
          </div>
          <div class="form-group has-feedback">
            <input name="logoutTime" class="form-control" placeholder="Logout Time" />
            <span class="glyphicon glyphicon-lock form-control-feedback"></span>
          </div>
          <div class="form-group has-feedback">
            <input name="employeeClass" class="form-control" placeholder="Employee class" />
            <span class="glyphicon glyphicon-lock form-control-feedback"></span>
          </div>
          <div class="form-group has-feedback">
            <input name="location" class="form-control" placeholder="Location" />
            <span class="glyphicon glyphicon-lock form-control-feedback"></span>
          </div>
          <div class="row">
            <div class="col-xs-4">
              <button align="center" type="submit" class="btn btn-primary btn-block btn-flat">Sign Up</button>
            </div>
          </div>
        </form>
      </div>
    </div>
  </body>
</html>

还有我的ServletClass如下

package com.signup;

import java.io.IOException;
import java.util.Properties;
import java.util.Date;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.googlecode.objectify.ObjectifyService;

public class SignupServlet extends HttpServlet {

    @Override
    public void doPost(HttpServletRequest request,
        HttpServletResponse response) throws IOException{
        String firstName = request.getParameter("firstName");
        String lastName = request.getParameter("lastName");
        String phoneNumber = request.getParameter("phoneNumber");
        Date date = new Date();
        String employeeClass = request.getParameter("employeeClass");
        String location = request.getParameter("location");

        Employee newUser = new Employee(firstName, lastName, phoneNumber,
            date, date, employeeClass, location);

        ObjectifyService.ofy().save().entity(newUser).now();
        response.getWriter().println("Done");

    }

}

我收到这个错误

在此处输入图片说明

这是我的OfyHelper.java

package com.signup;

import com.googlecode.objectify.Objectify;
import com.googlecode.objectify.ObjectifyFactory;
import com.googlecode.objectify.ObjectifyService;

import javax.servlet.ServletContextListener;
import javax.servlet.ServletContextEvent;


public class OfyHelper implements ServletContextListener {
    public void contextInitialized(ServletContextEvent event) {
        ObjectifyService.register(Employee.class);
        ObjectifyService.register(Vehicle.class);
    }

    public void contextDestroyed(ServletContextEvent event) {
    }

}
konqi

您不能有两个具有相同名称的servlet,因此应为两个servlet配置一个不同的名称。

<servlet>
    <servlet-name>signupJsp</servlet-name>
    <jsp-file>/signup.jsp</jsp-file>
</servlet>

<servlet>
  <servlet-name>signupServlet</servlet-name>
  <servlet-class>com.signup.SignupServlet</servlet-class>
</servlet>

然后您创建两个条目

<servlet-mapping>
  <servlet-name>signupJsp</servlet-name>
  <url-pattern>/signup.html</url-pattern>
</servlet-mapping>

<servlet-mapping>
  <servlet-name>signupServlet</servlet-name>
  <url-pattern>/signup</url-pattern>
</servlet-mapping>

那应该做。

Since this is super basic i recommend your dig into how Java EE works. Also this is pure Java EE configuration and has nothing to to with app engine specifics whatsoever.

EDIT:

I have not seen an OfyHelper implemented like that before. It's probably a racing condition between your query code and your entity registration.

Please read the Objectify best practices regarding this topic. I do my entity registration like this:

public class OfyService {
    static {
        ObjectifyService.register(Employee.class);
        ObjectifyService.register(Vehicle.class);
    }

    public static Objectify ofy() {
        return ObjectifyService.ofy();
    }

    public static ObjectifyFactory factory() {
        return ObjectifyService.factory();
    }
}

and then do queries like

OfyService.ofy()....

which works very reliable and is also what Jeff aka stickfigure recommends, well last i heard at least.

Make sure you import the correct entity classes in your OfyService class. If you have multiple Employee classes in different packages and import the wrong one the error you mentioned can happen as well.

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章