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

我正在读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. 正斜杠()代表什么?它是否代表我们的 Web 应用名称?/
  3. 如果 don 不以正斜杠() 开头,会发生什么情况?url-pattern/
  4. 从正斜杠()开始是规范吗?/

书中明确提到:

不要忘记 url 模式中的正斜杠(/)。

你能解释一下吗?


答案 1

in url 模式表示使用此 web .xml的 Web 应用程序的根。所以当你给.这意味着.每当您点击此URL时,将调用您与此映射的servlet,即。//ServletBeer.dohttp://<yourhost>:<port>/<your context Root>/ServletBeer.docom.avinash.TestServlet

您必须在所有URL映射中使用它不是强制性的 - 这完全取决于您想要如何配置它。 只是一个正则表达式。您还可以在 url 模式中使用 - 每次您在 Web 应用程序中请求任何 jsp 时,它实际上都会调用此 servlet。考虑来自 **JSR-000315 Java Servlet 3.0 Final Release 的 12.2 映射规范 ** 部分//*.jsp

12.2 映射规范 在 Web 应用程序部署描述符中,使用以下语法来定义映射:

■ 以'/'字符开头、以'/*'后缀结尾的字符串用于路径映射。

■ 以'*.'前缀开头的字符串用作扩展映射。

■空字符串(“”)是一种特殊的URL模式,它完全映射到应用程序的上下文根,即形式的请求。在这种情况下,路径信息为'/',servlet路径和上下文路径为空字符串(“”)。http://host:port/<contextroot>/

■ 仅包含 '/' 字符的字符串表示应用程序的“默认”servlet。在这种情况下,servlet 路径是请求 URI 减去上下文路径,路径信息为 null。

■所有其他字符串仅用于完全匹配


答案 2

在上面的问题中,我可以找到其中一个问题的答案。

如果 url 模式不以正斜杠(/) 开头会发生什么情况。我已经检查过了,但我不记得了

当我通过删除url模式中的/来启动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模式应以/ 开头


推荐