我有一个入口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。如果找到更合适的标题,请更改标题;))
答案 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);