- 由于客户端是通过URL地址访问web服务器中的资源,所以servlet程序若想被外界访问,必须把servlet程序映射到一个URL地址上,这个工作在web.xml文件中使用<servlet>元素和<servlet-mapping>元素完成。
- <servlet>元素用于注册servlet,它包含两个主要的子元素,<servlet-name>和<servlet-class>,分别用于设置servlet的注册名称和servlet的完整类名。
- 一个<servlet-mapping>元素用于映射一个已注册的servlet的一个对外访问路径,它包含有两个子元素:<servlet-name>和<url-pattern>,分别用于指定servlet的注册名称和servlet的对外访问路径。
- 同一个servlet可以被映射到多个URL上,即多个<servlet-mapping>元素的<servlet-name>子元素的设置值可以是同一个servlet的注册名。
- url-pattern完全匹配,必须以正斜杠/开始。
- 在servlet映射到的URL中也可以使用*通配符,但是只能有两种固定的格式:一种扩展名匹配,格式是"*.扩展名",注意绝对不能以/开头;另一种是目录匹配,格式是以正斜杠(/)开头并以"/*"结尾。
<servlet-mapping>
<servlet-name>MyName</servlet>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>MyName</servlet-name>
<url-pattern>/action/*</url-pattern>
</servlet-mapping>
- 映射匹配举例
对于如下的一些映射关系:
√ servlet1 映射到 /abc/*
√ servlet2 映射到 /*
√ servlet3 映射到 /abc
√ servlet4 映射到 *.do
问题:
√ 当请求URL为"/abc/a.html","/abc/*" 和 "/*" 都匹配,哪个servlet响应
servlet引擎将调用servlet1。
√ 当请求URL为"/abc"时,"/abc/*" 和 "/abc"都匹配,哪个servlet响应
servlet引擎将调用servlet3。
√ 当请求URL为"/abc/a.do"时,"/abc/*" 和 "*.do"都匹配,哪个servlet响应
servlet引擎将调用servlet1。
√ 当请求URL为"/a.do"时,"/*" 和 "*.do"都匹配,哪个servlet响应
servlet引擎将调用servlet2。
√ 当请求URL为"/xxx/yyy/a.do"时,"/*" 和 "*.do"都匹配,哪个servlet响应
servlet引擎将调用servlet2。
总结:
√ 优先级:完全匹配 > 目录匹配 > 扩展名匹配