我正在使用 Spring 2.5 MVC 并想添加另一个第三方 Servlet。问题是,Spring MVC 捕获了所有请求,因此 Servlet 没有收到任何请求。这是一个 web.xml 片段:
SpringMVC org.springframework.web.servlet.DispatcherServlet 2个
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<servlet>
<description>This is the servlet needed for cache.type servlet, returns the packed resources</description>
<display-name>PackServlet</display-name>
<servlet-name>PackServlet</servlet-name>
<servlet-class>net.sf.packtag.servlet.PackServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>PackServlet</servlet-name>
<url-pattern>*.pack</url-pattern>
</servlet-mapping>
应用程序确实需要/*映射,pack:tag(第三方Servlet)确实需要基于文件扩展名的映射。 有没有可能告诉 Spring 不要处理请求? 谢谢和问候。
最佳答案
其实你不需要spring做任何事情,servlet容器可以帮你解决。
匹配请求发送到哪个servlet时,取决于url-pattern定义的匹配规则。没有 2 个 servlet 可能有相同的模式,但它们可能有重叠的模式。然后应用 4 条规则:
1) 精确匹配优先于通配符匹配 2) 较长的路径模式优先于较短的模式 3) 路径匹配优先于文件类型匹配 4)/匹配任何尚未匹配的内容
<servlet-mapping>
<servlet-name>PackServlet</servlet-name>
<url-pattern>*.pack</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
如果您将/* 用于 SpringMVC,它可能会匹配最长的路径。通过删除 *,您一定会遵循默认 servlet 的 servlet 规范并符合规则 4。
关于java - 如何阻止 Spring MVC 阻塞所有其他 Servlet?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3013132/