2

我有一个入口 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 {
    ...

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

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

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

提前致谢!

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

4

2 回答 2

0

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

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

如果 servlet 被注释为:

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

或更好:

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

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

getServletName()
于 2013-04-10T13:40:38.133 回答
0

仅仅通过注释@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);
于 2017-11-15T22:00:41.137 回答