【问题标题】:Why should url-pattern in servlet mapping start with forward slash(/)为什么 servlet 映射中的 url-pattern 应该以正斜杠(/)开头
【发布时间】:2015-04-03 15:14:20
【问题描述】:

我正在阅读 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. 正斜杠(/)代表什么?它是否代表我们的网络应用名称?
  3. 如果url-pattern 不以正斜杠(/) 开头会怎样?
  4. 是以斜杠(/)开头的规范吗?

而且书中明确提到:

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

你能解释一下吗?

【问题讨论】:

    标签: java servlets url-pattern servlet-mapping


    【解决方案1】:

    url-pattern 中的/ 表示使用此web.xml 的Web 应用程序的根。所以当你给/ServletBeer.do。这意味着http://&lt;yourhost&gt;:&lt;port&gt;/&lt;your context Root&gt;/ServletBeer.do。当你点击这个 url 时,你映射的 servlet 即com.avinash.TestServlet 将被调用。

    您必须在所有 url 映射中使用 / 不是强制性的 - 这完全取决于您要如何配置它。 / 只是一个正则表达式。你也可以在你的 url-pattern 中使用*.jsp——它实际上会在你每次在你的 web 应用程序中请求任何 jsp 时调用这个 servlet。 考虑 **JSR-000315 Java Servlet 3.0 Final Release 中的 12.2 Specification of Mappings ** 部分

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

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

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

    ■ 空字符串 ("") 是一种特殊的 URL 模式,它准确地映射到 应用程序的上下文根,即表单的请求 http://host:port/&lt;contextroot&gt;/。在这种情况下,路径信息是 '/' servlet 路径和上下文路径为空字符串(“”)。

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

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

    【讨论】:

    • url-pattern 中的 / 表示使用此 web.xml 的 Web 应用程序的根。一个小疑问。你的意思是说我的 webapp 是否部署在文件夹 Beer-app 中。那么您是否将 Beer-app 称为 Web 应用程序的根目录
    • 可以说你的 Beer-app 是部署在 tomcat/webapps 下的文件夹。那么 Beer-app 将是您的应用程序的根。如果以上答案是您想要的,请接受
    • 正如你所说的 http:///ServletBeer.do。当我将 URL 设为localhost:8083/ServletBeer.do 时,我得到 HTTP 状态 404 - /ServletBeer.do。我的应用程序在 beerV1 文件夹中,url 应该是localhost:8083/beerV1/ServletBeer.do。当我按如下localhost:8083/beerV1/ServletBeer.do 访问网址时,我得到了输出。我的意思是说预期的 servlet 被命中,我可以看到输出
    • 是的,更新我错过了上下文根。在你的情况下 beerV1 是上下文根
    • 官方已经给出参考。伟大的!必须为@shikjohari 鼓掌
    【解决方案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-pattern 应该以 / 开头

    【讨论】:

    • 我发现的另一个问题是 2。正斜杠(/)代表什么。它是否代表我们的 webapp 名称。斜杠 (/) 表示 Web 应用程序的上下文根。
    猜你喜欢
    • 2011-05-21
    • 2015-03-13
    • 1970-01-01
    • 2011-09-21
    • 2016-09-28
    • 2012-05-26
    • 2015-09-13
    • 2016-03-12
    • 1970-01-01
    相关资源
    最近更新 更多