Java 构建多个servlet请求url模式

Java 构建多个servlet请求url模式,java,servlets,Java,Servlets,我正在使用servlet从前端获取请求。 我是否能够创建一个servlet,它可以基于url模式执行多个操作? 下面是我的url映射 <servlet> <servlet-name>Hello</servlet-name> <servlet-class>HelloWorld</servlet-class> </servlet> <servlet-mapping> <servlet-name>Hell

我正在使用servlet从前端获取请求。 我是否能够创建一个servlet,它可以基于url模式执行多个操作? 下面是我的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>

你好
你好世界
你好
/HelloServlet
/海洛瑟夫莱通
/Helloservlet2
这意味着,如果我点击下面框中的url,它应该调用自己的功能

  • URL:/HelloServlet:它应该执行函数1
  • URL:/HelloServletOne:它应该执行功能2
  • URL:/HelloServletTwo:它应该执行函数3等
如何通过扩展servlet来实现这一点?

非常感谢代码/链接示例。

您不应该为此使用三种不同的Servlet。您应该使用不同的Servlet方法来实现这一点

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

有关更多详细信息,请参阅

编辑:
请阅读更多关于此的信息。 它说,如果您使用ServletAPI版本2.5或更高版本


另外,请确保您在

中提供了servlet类的完全限定名称,您可以通过签订一个契约来处理同一个servlet的多个请求,该契约包含一个请求参数,如
'ACTION'
。然后在表单中添加此字段作为隐藏字段,其值类似于
'ACTION\u 1'
'ACTION\u 2'
'ACTION\u 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等)发出请求,所以可以使用

getServletPath方法可能只适用于您给定的显式url模式。有关URL的其他信息,请查看我制作的

HttpServletRequest.getRequestURI()
返回URL模式,包括/*和查询参数(如果存在),并且
HttpServletRequest.getPathInfo()
返回与/*匹配的部分(或null表示完全匹配)

在我的例子中,我需要
getPathInfo()
它将返回的位置 基于请求的HelloServlet、HelloServletOne或HelloServletTwo。
谢谢。

您似乎可以这样做,但另一种方法可能是使用一个servlet映射,但使用HTTP谓词以类似于REST的方式区分您采取的操作。goGet方法检索、doPut方法更新、doPost插入、doDelete删除。我想我会朝这个方向走,而不是你建议的servlet映射方法。只是为了正确理解你——你想使用一个servlet(HelloWorld)。根据URL,应该调用HelloWorld servlet中的另一个方法?@DaveHowes可以使用rest服务实现。但我不擅长这一点。如果我能够使用servlet实现这一点,我的工作将变得更容易。:)是的@swinkler。使用单个servlet helloworld,应该对请求的url模式进行分类。这不是我想要的答案。我需要调用一些基于url模式的函数。请检查更新的问题。这可以通过单个url模式实现。但对我来说,客户端api已经公开,我无法进行任何更改。使用这些url模式,我需要区分来自客户端的请求。您能够使用
springmvc
framework吗?如果是,您可以使用
MultiActionController
轻松地执行您想要的操作@MadhukarHebbarYes它可以通过多种方式实现,但根据我要问的问题,它是否能够使用servlet实现。谢谢Hanks@swinkler是的这就是我所期待的答案。这个链接对我也有帮助:
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
  }

}