我正在读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>
- 为什么
url-pattern
应该以正斜杠(/
)开头? - 正斜杠(
/
)代表什么?它是否代表我们的网络应用程序名称? - 如果
url-pattern
不以正斜杠(/
)开头会发生什么情况? - 以正斜杠(
/
)开头是一个规范吗?
在书中明确提到:
不要忘记网址模式中的正斜杠(/)。
你能解释一下吗?
url模式中的/
表示使用此Web.xml的Web应用程序的根目录。所以当你给/ServletBeer.do
.这意味着http://<yourhost>:<port>/<your context Root>/ServletBeer.do
.当你点击这个 url 时,你用这个映射的 servlet,即com.avinash.TestServlet
将被调用。
您必须在所有 url 映射中使用 /
并不是强制性的 - 这完全取决于您要如何配置它。 /
只是一个正则表达式。你也可以在你的 url-pattern 中使用 *.jsp
- 每次你在 Web 应用程序中请求任何 jsp 时,它都会调用这个 servlet。考虑 **JSR-000315 Java Servlet 3.0 最终版本中的 12.2 映射规范 ** 部分
12.2 映射规范 在 Web 应用程序部署描述符中,以下语法用于定义映射:
■ 以"/"字符开头并以"/*"结尾的字符串 后缀用于路径映射。
■ 以前缀"*."开头的字符串用作扩展名 映射。
■ 空字符串 (") 是一种特殊的 URL 模式,它正好映射到 应用程序的上下文根,即表单的请求
http://host:port/<contextroot>/
.在本例中,路径信息为"/" 并且 servlet 路径和上下文路径为空字符串 (")。■ 仅包含"/"字符的字符串表示"默认" 应用程序的 servlet。在这种情况下,servlet 路径是 请求 URI 减去上下文路径,路径信息为 null。
■ 所有其他字符串仅用于完全匹配
在上述问题上,我可以找到其中一个问题的答案。
如果 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模式应该以/