为什么Servlet映射中的URL模式应该以斜杠(/)开头?

13

我正在阅读《Head First JSP and 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. 如果 url-pattern 不以斜杠 (/) 开头会发生什么?
  4. 以斜杠 (/) 开头是一个规范吗?

在书中明确提到:

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

你能解释一下吗?

2个回答

7
/在url-pattern中表示使用此web.xml的Web应用程序的根目录。因此,当您提供/ServletBeer.do时,这意味着http://<yourhost>:<port>/<your context Root>/ServletBeer.do。每当您访问此网址时,与之映射的servlet(即com.avinash.TestServlet)将被调用。
并非所有的url映射都必须使用/ - 这完全取决于您希望如何配置它。 /只是一个常规表达式。您还可以在url-pattern中使用*.jsp - 这将在您请求Web应用程序中的任何jsp文件时实际调用此servlet。 请参考12.2规范映射**来自**JSR-000315 Java Servlet 3.0 Final Release的部分

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

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

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

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

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

■ 所有其他字符串仅用于精确匹配


url-pattern 中的 / 表示使用该 web.xml 的 Web 应用程序的根目录。有一个小疑问,您是说如果我的 Web 应用程序部署在 Beer-app 文件夹中,那么您是把 Beer-app 作为 Web 应用程序的根目录吗? - Avinash Reddy
假设你的啤酒应用程序是部署在Tomcat / webapps下的文件夹。那么Beer-app将是应用程序的根目录。如果以上答案符合您的要求,请接受它。 - shikjohari
正如你所说的 http://<yourhost>/ServletBeer.do。当我访问 URL http://localhost:8083/ServletBeer.do 时,我得到 HTTP 状态 404 - /ServletBeer.do。我的应用程序在 beerV1 文件夹中,URL 应该是 http://localhost:8083/beerV1/ServletBeer.do。当我访问以下 URL 时 http://localhost:8083/beerV1/ServletBeer.do,我得到了输出。我的意思是期望的 servlet 被调用并且我可以看到输出。 - Avinash Reddy
是的,更新了,我错过了上下文根。在你的情况下,beerV1是上下文根。 - shikjohari
官方参考已经给出。太棒了!必须为@shikjohari竖起大拇指。 - Rui

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 应该以 / 开头


我找到的另一个问题是2. 正斜杠(/)代表什么?它代表我们的Web应用程序名称吗?正斜杠(/)代表Web应用程序的上下文根。 - Avinash Reddy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接