【发布时间】: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") 的行为与 <servlet-name>MyServlet</servlet-name> 相同
我已经在 Tomcat 7 上对此进行了测试。
这是因为在调用 DispatcherServlet 时尚未加载 MyServlet,因此不知道 MyServlet 的名称吗?如果是这样,@WebServlet(name="...") 注释有什么意义;)
请不要回答“为什么不使用过滤器?”之类的问题。等等。这更多是关于注释与web.xml的背景
提前致谢!
(ps.如果你找到更合适的,请更改标题;))
【问题讨论】:
标签: annotations servlet-3.0 servlet-dispatching