问题
I was reading Head First JSP and Servlets book. I was going through the mapping of servlet. And my doubt here is
<servlet>
<servlet-name>test</servlet-name>
<servlet-class>com.avinash.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>test</servlet-name>
<url-pattern>/ServletBeer.do</url-pattern>
</servlet-mapping>
- Why should the
url-pattern
start with forward slash(/
)? - What does the forward slash(
/
) represent? Does it represent our webapp name? - What happens if the
url-pattern
do not start with forward slash(/
)? - Is it a specification to start with forward slash(
/
)?
And in the book it is clearly mentioned:
Don't forget the forward slash(/) in the url-pattern.
Can you explain?
回答1:
The /
in the url-pattern means the root of the web application that uses this web.xml. So when you give /ServletBeer.do
. That means http://<yourhost>:<port>/<your context Root>/ServletBeer.do
. When ever you hit this url, the servlet you which have mapped with this i.e com.avinash.TestServlet
will be invoked.
Its not mandatory that you have to use /
in all your url mapping - that purely depends on how you want to configure it. /
is just a regular expression. You can also use *.jsp
in your url-pattern - which will actually invoke this servlet everytime you request any jsp in your web- application.
Consider the section 12.2 Specification of Mappings ** from **JSR-000315 Java Servlet 3.0 Final Release
12.2 Specification of Mappings 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.
■ The empty string ("") is a special URL pattern that exactly maps to the application's context root, i.e., requests of the form
http://host:port/<contextroot>/
. In this case the path info is ’/’ and the servlet path and context path is empty string (““).■ 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
回答2:
On the above questions i could find answer for one of the questions.
What happens if the url-pattern do not start with forward slash(/). I have checked it but i don't remember
When i started tomcat by removing the / in the url-pattern i got the following error
Caused by: java.lang.IllegalArgumentException: Invalid <url-pattern> ServletBeer.do in servlet mapping
at org.apache.catalina.core.StandardContext.addServletMapping(StandardContext.java:3267)
at org.apache.catalina.core.StandardContext.addServletMapping(StandardContext.java:3242)
at org.apache.catalina.deploy.WebXml.configureContext(WebXml.java:1324)
at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1348)
at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:880)
at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:378)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5343)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
This indicates that if we are not using extension mapping compulsory the url-pattern should start with /
来源:https://stackoverflow.com/questions/28315618/why-should-url-pattern-in-servlet-mapping-start-with-forward-slash