簡體   English   中英

如何配置GAE / java Servlet的網址路徑

[英]How to configure url paths to GAE/java servlets

我來自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) {
    }

}

您不能有兩個具有相同名稱的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>

那應該做。

由於這是超級基礎,因此我建議您深入了解Java EE的工作原理。 同樣,這是純Java EE配置,與應用程序引擎的具體細節無關。

編輯:

我之前從未見過像這樣實現的OfyHelper。 查詢代碼和實體注冊之間可能存在競爭。

請閱讀有關此主題的Objectify最佳實踐 我這樣進行實體注冊:

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();
    }
}

然后執行類似的查詢

OfyService.ofy()....

它非常可靠,也是Jeff aka stickfigure推薦的,至少我最后聽到了。

確保在OfyService類中導入正確的實體類。 如果您在不同的程序包中有多個Employee類,並且導入了錯誤的一個,則您提到的錯誤也可能發生。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM