feg*_*emo 19 java spring servlets spring-mvc java-ee
我想知道使用单个或双个通配符来描述servlet映射上的url模式有什么不同.
例如:下面有什么区别?
1)
<servlet-mapping id="...">
<servlet-name>BuyServlet</servlet-name>
<url-pattern>/buy/*</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)
2)
<servlet-mapping id="...">
<servlet-name>ShopServlet</servlet-name>
<url-pattern>/shop/**</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)
编辑:@Andrew是对的,规范只讨论一个通配符(*).
我仔细检查了我的代码并注意到我找到双通配符(**)的地方是在Spring SimpleUrlHandlerMapping bean中.
在这种情况下,它是有道理的.根据类doc,它使用AntPathMatcher,它指出:
映射使用以下规则匹配URL:匹配一个字符*匹配零个或多个字符**匹配路径中的零个或多个"目录"
And*_*nov 30
servlet规范(版本2.5)的第11.2节规定如下:
在Web应用程序部署描述符中,以下语法用于定义映射:
- 以"/"字符开头并以"/*"后缀结尾的字符串用于路径映射.
- 以"*"开头的字符串 prefix用作扩展映射.
- 仅包含'/'字符的字符串表示应用程序的"默认"servlet.在这种情况下,servlet路径是请求URI减去上下文路径,路径信息为null.
- 所有其他字符串仅用于完全匹配.
所以我猜第二个变种(**
)没有意义.
PS我刚刚尝试设置这样的映射,似乎只有这个精确的URL /shop/**
匹配(Tomcat 6.0.32).
Servlet规范本身(版本3.0,第12.2章)仅定义了两种通配符映射:
例如,"/ foo/"将匹配以"http:// server/context/foo /"开头的所有URL请求,". jsp"将匹配以".jsp"结尾的所有URL请求.
遵循规范,空字符串("")和单个斜杠("/")具有特定含义."所有其他字符串仅用于完全匹配."
严格遵循规范,你的第二个例子根本不是通配符模式,但应该只匹配"/ shop/**".但是,大多数Servlet容器都不那么严格,允许在任意位置使用*通配符或提供更复杂的模式匹配选项.
归档时间: |
|
查看次数: |
39530 次 |
最近记录: |