Tomcat 9+:使用@WebServlet 注释覆盖 Servlet 映射
Tomcat 9+: overriding Servlet mapping using @WebServlet annotation
@WebServlet
注释与 web.xml
servlet 映射的优先顺序是什么?
更具体地说,我们有一个用例,我们不想修改 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 {
}
所以问题是:
- 规范是否允许我们为此添加一些参数(例如覆盖或优先参数)?
- 规范是否保证我们的class将始终覆盖
web.xml
?
- Tomcat 9+ 是否允许这样做,即使可能使用一些扩展?
Servlet 3.1 Final 和 4.0.Final 规范在 12.2 映射规范中说:
If the effective web.xml (after merging information from fragments and
annotations) contains any url-patterns that are mapped to multiple servlets then the deployment must fail.
所以规范显然不允许这样做。
替代解决方案:创建一个 WebFilter,它向另一个 url 执行转发分派,由您的重写 servlet 处理。或者只是在过滤器本身做你的事情。
@WebServlet
注释与 web.xml
servlet 映射的优先顺序是什么?
更具体地说,我们有一个用例,我们不想修改 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 {
}
所以问题是:
- 规范是否允许我们为此添加一些参数(例如覆盖或优先参数)?
- 规范是否保证我们的class将始终覆盖
web.xml
? - Tomcat 9+ 是否允许这样做,即使可能使用一些扩展?
Servlet 3.1 Final 和 4.0.Final 规范在 12.2 映射规范中说:
If the effective web.xml (after merging information from fragments and annotations) contains any url-patterns that are mapped to multiple servlets then the deployment must fail.
所以规范显然不允许这样做。
替代解决方案:创建一个 WebFilter,它向另一个 url 执行转发分派,由您的重写 servlet 处理。或者只是在过滤器本身做你的事情。