1

@WebServlet注释与web.xmlservlet 映射的优先顺序是什么?更具体地说,我们有一个用例,我们宁愿不修改web.xml但需要覆盖其中一个 servlet 映射。我们web.xml有类似的东西:

<servlet>
   <servlet-name>foo</servlet-name>
   <servlet-class>com.whatever.simple.foo</servlet-class>
</servlet>
<servlet-mapping>
   <servlet-name>foo</servlet-name>
   <url-pattern>/foo/*</url-pattern>
</servlet-mapping>

我们正在考虑使用以下方法覆盖它:

@WebServlet("/foo/*")
public class OurCustomImplementation extends HttpServlet {
}

所以问题是:

  • 规范是否允许我们添加一些参数来这样做(例如覆盖或优先参数)?
  • 规范是否保证我们的类将始终覆盖web.xml
  • Tomcat 9+ 是否允许这样做,即使可能使用一些扩展?
4

1 回答 1

2

Servlet 3.1 Final 和 4.0.Final 规范都在 12.2 Specification of Mappings 中说:

如果有效的 web.xml(在合并来自片段和注释的信息之后)包含映射到多个 servlet 的任何 url 模式,则部署必须失败。

所以规范显然不允许这样做。

替代解决方案:创建一个 WebFilter,它将转发到另一个 url,您的覆盖 servlet 处理。或者只是在过滤器本身中做你的事情。

于 2021-01-12T15:53:34.053 回答