【问题标题】:Servlet: forward request to Servlet by its name when using annotations instead of web.xml?Servlet:使用注释而不是 web.xml 时按名称将请求转发给 Servlet?
【发布时间】:2013-02-28 00:56:45
【问题描述】:

我有一个入口 servlet(称为 DispatcherServlet),它根据配置参数将 /* 处的所有传入 GET 和 POST 请求重定向到其他 servlet。为了将请求分派给其他 servlet,我使用它们的名称而不是路径,因为我的 DispatcherServlet 在监听 /* 时会陷入无限循环。

“旧”方式是在 web.xml 描述符中为 servlet 命名:

<servlet>
  <servlet-name>MyServlet</servlet-name>
  <servlet-class>mypackage.MyServlet</servlet-class>
</servlet>

之后,可以通过名称来寻址 servlet,例如,当使用 RequestDispatcher 时。我的 DispatcherServlet 中的代码如下所示:

RequestDispatcher 调度程序 = getServletContext().getNamedDispatcher("MyServlet"); dispatcher.forward(request, response);

这非常有效。但是,我想使用没有 web.xml 的“新”Servlet 3 注释,因此我这样做:

@WebServlet(name="MyServlet")
public class MyServlet extends HttpServlet {
    ...

但是现在,我的 DispatcherServlet 中的 getServletContext().getNamedDispatcher("MyServlet") 返回 null 而不是 MyServlet 的适当调度程序,尽管我希望 @WebServlet(name="MyServlet") 的行为与 &lt;servlet-name&gt;MyServlet&lt;/servlet-name&gt; 相同

我已经在 Tomcat 7 上对此进行了测试。 这是因为在调用 DispatcherServlet 时尚未加载 MyServlet,因此不知道 MyServlet 的名称吗?如果是这样,@WebServlet(name="...") 注释有什么意义;)

请不要回答“为什么不使用过滤器?”之类的问题。等等。这更多是关于注释与web.xml的背景

提前致谢!

(ps.如果你找到更合适的,请更改标题;))

【问题讨论】:

    标签: annotations servlet-3.0 servlet-dispatching


    【解决方案1】:

    仅用@WebServlet 注释不足以将Servlet 加载到Web 容器中;您必须包含至少一种 URL 模式,如果您不想公开 Servlet 以使其仅用于内部转发,请将 URL 设置为以“/WEB-INF/”开头。

    请记住,'name' 属性有问题,所以不要使用它。

    @WebServlet(urlPatterns = "/WEB-INF/thisServlet")
    public class FooServlet extends HttpServlet {
    ...
    }
    

    要转发请求,请调用如下代码:

    servletContext.getNamedDispatcher(FooServlet.class.getName()).forward(request, response);
    

    【讨论】:

      【解决方案2】:

      如果您没有指定名称的 urlMapping,则需要添加完整的类名。喜欢

      RequestDispatcher dispatcher = getServletContext().
                                               getNamedDispatcher("mypackage.MyServlet");
      

      如果 servlet 被注释为:

      @WebServlet(urlPatterns="/Servlet", name="Servlet")
      

      或更好:

      @WebServlet(urlPatterns="/Servlet", displayName="Servlet", name="Servlet")
      

      另外,您可以尝试通过以下方式获取您的 servlet 名称:

      getServletName()
      

      【讨论】:

        猜你喜欢
        • 2016-07-05
        • 2017-01-06
        • 2016-03-08
        • 2011-06-20
        • 2014-02-25
        • 1970-01-01
        • 2013-06-18
        • 1970-01-01
        • 2011-11-04
        相关资源
        最近更新 更多