我有一个映射
<servlet-mapping>
<servlet-name>service</servlet-name>
<url-pattern>/service/*</url-pattern>
</servlet-mapping>
但我也想要 /服务/主 映射到主servlet。
<servlet-mapping>
<servlet-name>master</servlet-name>
<url-pattern>/service/master</url-pattern>
</servlet-mapping>
我认为这里存在冲突,因为调用/ service / *会立即触发服务servlet。有没有办法让我在servlet-mapping中使用某种排除方法,或者可以使用regexp来做我想做的事情?
答案 0 :(得分:6)
Servlet映射始终使用最具体的匹配,因此路径<context>/service/master
将始终映射到master
。
这是来自Servlet 3.0 spec的第一个映射规则:
- 容器将尝试查找请求路径的完全匹配 到servlet的路径。一个 成功匹配选择servlet。
- 容器将递归尝试匹配最长的路径前缀。这个 通过逐步降低路径树来完成 一次一个目录,使用'/' 字符作为路径分隔符。该 最长匹配决定了servlet 地选择。
- 如果网址路径中的最后一个段包含扩展名(例如 .jsp),servlet容器会尝试 匹配处理的servlet 请求延期。一个 扩展名被定义为 最后一段'。'之后的最后一段。 字符。
- 如果前三个规则都没有导致servlet匹配,那么 容器将尝试服务 适合资源的内容 请求。如果是“默认”servlet 为应用程序定义,它会 使用。许多容器提供 用于服务的隐式默认servlet 内容。
醇>
答案 1 :(得分:1)
您可以尝试使用Google Guice。 com.google.inject.servlet.ServletModule.serveRegex(String regex,String ... regexes) 将允许你在映射中使用正则表达式。