Servlet:在使用注释而不是web.xml时,按名称向Servlet转发请求?

时间:2013-03-12 13:22:40

标签: annotations servlet-3.0 servlet-dispatching

我有一个入口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 dispatcher = getServletContext()。getNamedDispatcher(“MyServlet”);   dispatcher.forward(请求,响应);

这完美无缺。但是,我想使用没有web.xml的“新”Servlet 3注释,因此我这样做:

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

但是现在,我的DispatcherServlet中的getServletContext().getNamedDispatcher("MyServlet")返回 null 而不是MyServlet的相应调度程序,尽管我希望@WebServlet(name="MyServlet")的行为与{<servlet-name>MyServlet</servlet-name>相同1}}

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

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

提前致谢!

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

2 个答案:

答案 0 :(得分:0)

如果未指定带名称的urlMapping,则需要添加完整的类名。像

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

如果servlet注释为:

,它对我有用
@WebServlet(urlPatterns="/Servlet", name="Servlet")

或更好:

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

此外,您可以尝试使用以下命令获取servlet名称:

getServletName()

答案 1 :(得分:0)

仅使用@WebServlet注释不足以将Servlet加载到Web容器中;您必须至少包含一个网址格式,如果您不想公开Servlet以仅保留内部转发,请将网址设置为以&#39; / WEB-INF /&#39;开头。

请记住&#39; name&#39;属性是错误的,所以不要使用它。

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

要转发请求,请调用以下内容:

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