构建多个 servlet 请求 url 模式

Framing multiple servlet request url pattern

我正在使用 servlet 从前端获取请求。 我可以制作一个可以根据 url 模式进行多项操作的 servlet 吗? 这是我的 url 映射

<servlet>
<servlet-name>Hello</servlet-name>
<servlet-class>HelloWorld</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/HelloServlet</url-pattern>
<url-pattern>/HelloServletOne</url-pattern>
<url-pattern>/HelloServletTwo</url-pattern>
</servlet-mapping>

这意味着如果我点击下面框架中的 url,它应该会调用它自己的功能。

如何通过扩展 servlet 来实现这一点?
Code/link 非常感谢示例。

您不应为此目的使用三个不同的 Servlet。您应该使用 Servlet 的不同方法来实现此目的。

使用doGet方法获取数据。
使用 doPost 方法插入数据。
使用doPut方法更新数据。
使用 doDelete 方法删除数据。

详情请参考servlet api documentation

编辑:
阅读更多相关信息 here。 它说如果您使用 servlet api 版本 2.5 或更高.

,您提供的 url 映射必须有效 另外,请确保您在 <servlet-name>.

中提供了 servlet class 的完全限定名称

您可以通过制定具有请求参数的合同来处理同一个 servlet 的多个请求,例如 'ACTION'。然后在您的表单中将其添加为隐藏字段,其值如 'ACTION_1''ACTION_2''ACTION_3'。因此,在 doPost() 中,您可以检查此参数值并可以在同一个 servlet 中调用相应的处理方法。

class YourServlet extends HttpServlet{

      public void doPost(HttpReq req, HttpResp resp){
               String action = reg.getParameter('ACTION');
               if('ACTION_1'.equals(action)){
                   doAction_1();
               }
               if('ACTION_2'.equals(action)){
                   doAction_2()
               } 
               if('ACTION_3'.equals(action)){
                   doAction_3()
               }
               else {
                   defaultAction();
               }
      }

}

关于您的 url-模式,您需要知道 URL 的名称。由于不同的 http 方法(GET、POST 等)可能会发出请求,因此您可以使用 FrontController Pattern

的部分内容
import java.io.IOException;

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

public class HelloServlet extends HttpServlet {

  private static final String SERLVET = "HelloServlet";
  private static final String SERLVET_ONE = "HelloServletOne";
  private static final String SERLVET_TWO = "HelloServletTwo";

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    processRequest(req, resp);
  }

  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    processRequest(req, resp);
  }

  private void processRequest(HttpServletRequest req, HttpServletResponse resp) {
    String path = req.getServletPath();
    switch (path) {
      case SERLVET:
        // ... call your function1
        break;
      case SERLVET_ONE:
        // ... call your function2
        break;

      case SERLVET_TWO:
        // ... call your function3
        break;
      default:
        break;
    }

    // do something else
  }

}

getServletPath 方法可能仅适用于您提供的显式 url 模式。有关 URL 的其他信息,请查看 this link

我制作成。

HttpServletRequest.getRequestURI() returns URL 模式包括 /* 和查询参数(如果存在),以及 HttpServletRequest.getPathInfo() returns 由 /* 匹配的部分(或完全匹配为空)。

在我的例子中,我需要 getPathInfo() returns HelloServlet、HelloServletOne 或 HelloServletTwo 基于请求。 谢谢