多个Servlet请求URL模式的框架化

4

我正在使用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>

这意味着如果我按照下面的框架访问URL,它应该调用自己的功能。

  • URL:/HelloServlet:应执行功能1
  • URL:/HelloServletOne:应执行功能2
  • URL:/HelloServletTwo:应执行功能3等。

如何通过扩展servlet实现这一点?
非常感谢提供代码/链接示例。


1
看起来你可以这样做,但是另一种方法可能是使用一个servlet映射,但使用HTTP动词来区分采取的操作,类似于REST。goGet方法检索,doPut方法更新,doPost插入,doDelete删除。我认为我会选择这个方向,而不是你建议的servlet映射方法。 - DaveH
只是为了理解你的意思 - 你想使用一个servlet(HelloWorld)。根据URL,应该调用HelloWorld servlet内的不同方法? - swinkler
可以使用REST服务来实现。但是我不擅长这方面。如果能用Servlet实现,我的工作会更轻松。:) - Madhukar Hebbar
是的@swinkler。使用单个servlet helloworld,请求的url模式应该被分类。 - Madhukar Hebbar
4个回答

11

关于你的url-pattern,你需要知道调用了哪个URL。因为请求可以由不同的HTTP方法(GET、POST等)发起,所以你可以使用FrontController模式的部分内容。

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-patterns。有关URL的其他信息,请查看此链接


谢谢@swinkler,是的,这就是我期望的答案。这个链接也帮了我很多:https://dev59.com/aW445IYBdhLWcg3wTIjm - Madhukar Hebbar

0
您可以通过与请求参数(如'ACTION')达成协议来处理同一servlet的多个请求。然后,在您的表单中添加此参数作为隐藏字段,其值为'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模式实现。但是对于我来说,客户端API已经暴露出来,我无法进行任何更改。使用这些URL模式,我需要区分来自客户端的请求。 - Madhukar Hebbar
你能够使用 spring-mvc 框架工作吗?如果可以,你可以轻松地使用 MultiActionController 实现你想要的功能。@MadhukarHebbar - MChaker
可以通过多种方式实现,但是根据问题,我正在询问是否能够使用servlets来实现。谢谢。 - Madhukar Hebbar

0

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

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

请参考servlet api文档以获取更多详细信息。

编辑:
这里阅读更多信息。 它说如果您使用Servlet API版本2.5或更高版本,则您提供的URL映射必须起作用。

此外,请确保在<servlet-name>中提供了完全限定的servlet类名


这不是我要找的答案。我需要根据URL模式调用一些函数。请检查更新后的问题。 - Madhukar Hebbar

0

我已经进入了。

HttpServletRequest.getRequestURI() 返回包括查询参数在内的 URL 模式,其中包括 /*,而 HttpServletRequest.getPathInfo() 返回与 /* 匹配的部分(对于精确匹配为 null)。

在我的情况下,我需要使用 getPathInfo(),它将根据请求返回 HelloServlet、HelloServletOne 或 HelloServletTwo。谢谢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接