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
The url-pattern element of a servlet-mapping or a filter-mapping associates a filter or servlet with a set of URLs. When a request arrives, the container uses a simple procedure for matching the URL in the request with a url-pattern in the web. xml file. Section 4.7.
A URL pattern is a set of ordered characters to which the Google Search Appliance matches actual URLs that the crawler discovers. You can specify URL patterns for which your index should include matching URLs and URL patterns for which your index should exclude matching URLs.
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).
The Servlet specification itself (Version 3.0, Chapter 12.2) defines only two kinds of wildcard mapping:
E.g. "/foo/*" will match all requests for URLs starting with "http://server/context/foo/" and "*.jsp" will match all requests for URL ending with ".jsp".
Following the specification, the empty string ("") and a single slash ("/") have specific meanings. "All other strings are used for exact matches only."
Following the specification strictly, your second example is not a wildcard pattern at all, but should only match "/shop/**" exactly. Most Servlet containers are however less strict and allow using the * wildcard at arbitrary locations or offer even more complex pattern matching options.
No where in specification talking about second case.
As per servlet specification 12.2
A string beginning with a ‘/’ character and ending with a ‘/*’ suffix is used for path mapping
All other strings are used for exact matches only.
As per specification second would be considered for exact match only. It may vary based on server providers.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With