是否可以为Jetty的servlet映射使用正则表达式?

时间:2011-01-25 19:49:05

标签: java servlets jetty

我有一个映射

<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来做我想做的事情?

2 个答案:

答案 0 :(得分:6)

Servlet映射始终​​使用最具体的匹配,因此路径<context>/service/master将始终映射到master

这是来自Servlet 3.0 spec的第一个映射规则:

  
      
  1. 容器将尝试查找请求路径的完全匹配   到servlet的路径。一个   成功匹配选择servlet。
  2.   
  3. 容器将递归尝试匹配最长的路径前缀。这个   通过逐步降低路径树来完成   一次一个目录,使用'/'   字符作为路径分隔符。该   最长匹配决定了servlet   地选择。
  4.   
  5. 如果网址路径中的最后一个段包含扩展名(例如   .jsp),servlet容器会尝试   匹配处理的servlet   请求延期。一个   扩展名被定义为   最后一段'。'之后的最后一段。   字符。
  6.   
  7. 如果前三个规则都没有导致servlet匹配,那么   容器将尝试服务   适合资源的内容   请求。如果是“默认”servlet   为应用程序定义,它会   使用。许多容器提供   用于服务的隐式默认servlet   内容。
  8.   

答案 1 :(得分:1)

您可以尝试使用Google Guice。 com.google.inject.servlet.ServletModule.serveRegex(String regex,String ... regexes) 将允许你在映射中使用正则表达式。

http://code.google.com/p/google-guice/wiki/ServletModule