我正在阅读Head First JSP和Servlets一书。我正在浏览servlet的映射。我怀疑是
<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>
url-pattern
应以正斜杠(/
)开始?/
)代表什么?它代表我们的webapp名称吗?url-pattern
没有以正斜杠(/
)开头,会怎样?/
)开头的规范吗?在书中明确提到:
不要忘记url-pattern中的正斜杠(/)。
你能解释一下吗?
答案 0 :(得分:6)
url-pattern中的/
表示使用此web.xml的Web应用程序的根目录。所以当你给/ServletBeer.do
时。这意味着http://<yourhost>:<port>/<your context Root>/ServletBeer.do
。当您点击此URL时,将调用已映射到此com.avinash.TestServlet
的servlet。
您必须在所有网址映射中使用/
并非强制要求 - 这完全取决于您希望如何配置它。 /
只是一个正则表达式。您还可以在url-pattern中使用*.jsp
- 每次在Web应用程序中请求任何jsp时,它都会实际调用此servlet。
考虑** JSR-000315 Java Servlet 3.0最终版本 12.2映射规范**
12.2映射规范在Web应用程序部署描述符中,以下语法用于定义映射:
■以“/”字符开头并以“/ *”结尾的字符串 后缀用于路径映射。
■以“*。”前缀开头的字符串用作扩展名 映射。
■空字符串(&#34;&#34;)是一个精确映射到的特殊URL模式 应用程序的上下文根,即表单的请求
http://host:port/<contextroot>/
。在这种情况下,路径信息是'/' servlet路径和上下文路径为空字符串(“”)。■仅包含'/'字符的字符串表示&#34;默认&#34; 应用程序的servlet。在这种情况下,servlet路径是 请求URI减去上下文路径,路径信息为空。
■所有其他字符串仅用于完全匹配
答案 1 :(得分:0)
关于上述问题,我可以找到其中一个问题的答案。
如果url-pattern不以正斜杠(/)开头会发生什么。我已经检查了但是我不记得了
当我通过删除url-pattern中的/来启动tomcat时出现以下错误
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)
这表明如果我们不使用扩展映射强制,则url-pattern应以/
开头