13

我正在阅读 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. 是否以正斜杠(/)开头的规范?

而且书中明确提到:

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

你可以解释吗?

4

2 回答 2

7

url-pattern 中的/表示使用此 web.xml 的 Web 应用程序的根。所以当你给/ServletBeer.do. 这意味着http://<yourhost>:<port>/<your context Root>/ServletBeer.do。当你点击这个 url 时,你已经映射到这个 ie 的 servletcom.avinash.TestServlet将被调用。

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

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

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

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

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

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

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

于 2015-02-04T07:37:28.973 回答
0

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

如果 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 模式应该以 / 开头

于 2015-02-25T17:29:53.680 回答