为什么servlet映射中的url-pattern以正斜杠(/)开头

时间:2015-02-04 07:18:38

标签: java servlets url-pattern servlet-mapping

我正在阅读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>
  1. 为什么url-pattern应以正斜杠(/)开始?
  2. 正斜杠(/)代表什么?它代表我们的webapp名称吗?
  3. 如果url-pattern没有以正斜杠(/)开头,会怎样?
  4. 这是一个以正斜杠(/)开头的规范吗?
  5. 在书中明确提到:

      

    不要忘记url-pattern中的正斜杠(/)。

    你能解释一下吗?

2 个答案:

答案 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应以/

开头