部分转自:
http://blog.csdn.net/zhaizu/article/details/9897083
http://tianya23.blog.51cto.com/1081650/1001568
常见映射
<servlet> <servlet-name>TestServlet</servlet-name>——————3 <servlet-class>Demo.TestServlet</servlet-class>—— 4 </servlet> <servlet-mapping> <servlet-name>TestServlet</servlet-name>——————2 <url-pattern>/testDemo</url-pattern>———————1 </servlet-mapping>
访问顺序为1—>2—>3—>4,其中2和3的值必须相同。
url-pattern 标签中的值是要在浏览器地址栏中输入的 url,可以自己命名,这个 url 访问名为 servlet-name 中值的 servlet,两个 servlet-name 标签的值必须相同,因为通过 servlet 标签中的 servlet-name 标签映射到 servlet-class 标签中的值,最终访问 servlet-class 标签中的 class。路径url匹配规则
精确匹配:以”/”开头,字母(非”*”)结尾
比如: <url-pattern>/demo/test.do</url-pattern> 只匹配这个/demo/test.do这个url
目录匹配:以”/”开头,”/*”结尾
比如: <url-pattern>/demo/*</url-pattern>匹配前缀为demo的url <url-pattern>/*</url-pattern>
扩展名匹配:以”*.”开头,扩展名结尾
比如: <url-pattern>*.htm</url-pattern>匹配后缀为htm的url
匹配过程:
当一个请求发送到servlet容器的时候,容器先会将请求的url减去当前应用上下文的路径作为servlet的映射url,比如我访问的是http://localhost/test/aaa.html,我的应用上下文是test,容器会将http://localhost/test去掉,剩下的/aaa.html部分拿来做servlet的映射匹配。这个映射匹配过程是有顺序的,而且当有一个servlet匹配成功以后,就不会去理会剩下的servlet了
先精确匹配,再路径匹配
路径匹配:先最长路径匹配,再最短路径匹配
最后是扩展名匹配。
如果前面三条规则都没有找到一个servlet,容器会根据url选择对应的请求资源。如果应用定义了一个default servlet,则容器会将请求丢给default servlet。
More
静态文件的url映射
http://blog.csdn.net/u010045971/article/details/50843906