我想知道使用单个或双通配符来描述servlet映射上的url模式有什么不同。
例如:下面有什么区别?
1)
<servlet-mapping id="...">
<servlet-name>BuyServlet</servlet-name>
<url-pattern>/buy/*</url-pattern>
</servlet-mapping>
2)
<servlet-mapping id="...">
<servlet-name>ShopServlet</servlet-name>
<url-pattern>/shop/**</url-pattern>
</servlet-mapping>
编辑: @Andrew是对的,规范只涉及一个通配符(*)。
我仔细检查了我的代码并注意到我找到双通配符(**)的位置是在Spring SimpleUrlHandlerMapping bean中。
在这种情况下,它是有道理的。根据{{3}},它使用the class doc,其中声明:
映射使用以下规则匹配URL:匹配一个 字符 *匹配零个或多个字符 **匹配路径中的零个或多个“目录”
答案 0 :(得分:26)
servlet规范(版本2.5)的第11.2节规定如下:
在Web应用程序部署描述符中,使用以下语法进行定义 映射:
- 使用以“/”字符开头并以“/ *”后缀结尾的字符串 用于路径映射。
- 以'*。'前缀开头的字符串用作扩展名映射。
- 仅包含'/'字符的字符串表示“默认”servlet 应用程序。在这种情况下,servlet路径是请求URI减去上下文 路径和路径信息为空。
- 所有其他字符串仅用于完全匹配。
所以我猜第二种变体(**
)没有意义。
P.S。我刚刚尝试设置这样的映射,似乎只有这个精确的URL /shop/**
才能匹配(Tomcat 6.0.32)。
答案 1 :(得分:6)
Servlet规范本身(版本3.0,第12.2章)仅定义了两种通配符映射:
E.g。 “/ foo / ”将匹配以“http:// server / context / foo /”开头的所有URL请求,“ .jsp”将匹配以“.jsp”结尾的所有URL请求。
遵循规范,空字符串(“”)和单个斜杠(“/”)具有特定含义。 “所有其他字符串仅用于完全匹配。”
严格遵循规范,你的第二个例子根本不是通配符模式,但应该只匹配“/ shop / **”。但是,大多数Servlet容器都不那么严格,允许在任意位置使用*通配符或提供更复杂的模式匹配选项。
答案 2 :(得分:2)
在规范中没有谈论第二种情况。
以'/'字符开头并以'/ *'后缀结尾的字符串用于 路径映射
All other strings are used for exact matches only.
根据规格,第二次仅考虑完全匹配。它可能因服务器提供商而异。