Issue
I'm wondering what is the difference of using a single or double wildcards to describe a url-pattern on a servlet mapping.
For example: what is the difference below?
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>
EDIT: @Andrew is right, the specification talks about only one wildcard (*).
I double checked my code and noticed that the place where I found double wildcards (**) was in a Spring SimpleUrlHandlerMapping bean.
In that case, it makes sense. As per the class doc, it uses AntPathMatcher, which states:
The mapping matches URLs using the following rules: ? matches one character * matches zero or more characters ** matches zero or more 'directories' in a path
Solution
Section 11.2 of servlet specification (version 2.5) states the following:
In the Web application deployment descriptor, the following syntax is used to define mappings:
- A string beginning with a ‘/’ character and ending with a ‘/*’ suffix is used for path mapping.
- A string beginning with a ‘*.’ prefix is used as an extension mapping.
- A string containing only the ’/’ character indicates the "default" servlet of the application. In this case the servlet path is the request URI minus the context path and the path info is null.
- All other strings are used for exact matches only.
So I guess the second variant (**
) doesn't make sense.
P.S. I've just tried to set up such mapping and it seems that only this exact url /shop/**
will be matched (Tomcat 6.0.32).
Answered By - Andrew Logvinov