Servlet url-pattern的匹配规则
1.精确匹配
资源路径必须一致才能匹配成功
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/a.html</url-pattern>
</servlet-mapping>
浏览器输入: http://localhost:8080/a.html 匹配成功
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/b</url-pattern>
</servlet-mapping>
浏览器输入: http://localhost:8080/b 匹配成功
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/a/test.html</url-pattern>
</servlet-mapping>
浏览器输入: http://localhost:8080/a/test.html 匹配成功
2.通配符匹配
使用*来匹配0个或多个字符
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
代表输入任何不同的资源路径地址都能匹配成功
浏览器输入: http://localhost:8080/a/b/c 匹配成功
浏览器输入: http://localhost:8080/test.html 匹配成功
3.通配符路径匹配
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/a/*</url-pattern>
</servlet-mapping>
代表输入任何以 a 路径开头的资源路径地址都能匹配成功
浏览器输入: http://localhost:8080/a/test 匹配成功
浏览器输入: http://localhost:8080/a/abc/xyz 匹配成功
浏览器输入: http://localhost:8080/a/a.html 匹配成功
4.后缀匹配
使用*.xx结尾,表示资源路径以任意多个字符开头并以.xx结尾就能匹配成功
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
浏览器输入: http://localhost:8080/xxx.do 匹配成功
浏览器输入: http://localhost:8080/a/a.do 匹配成功
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
浏览器输入: http://localhost:8080/xxx.jsp 匹配成功
浏览器输入: http://localhost:8080test/abc.jsp 匹配成功
5.匹配任意的url
当以上方式匹配规则都没有匹配成功时。
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<!--当url-pattern配置成/*的时候,Tomcat会将所有没匹配成功的请求交给对应的Servlet进行处理-->
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--当url-pattern配置成/的时候,多数情况下与/*效果一致,但是,当访问的路径正好对应jsp文件时,Tomcat会访问的是jsp文件而不是把请求交给对应的Servlet处理-->
注:
<url-pattern>/*.jsp</url-pattern> 不正确
<url-pattern>he*.jsp</url-pattern>不正确
<url-pattern>/aa/*/bb</url-pattern> 是精确匹配,url必须是 /aa/*/bb,*已不代表通配的含义。
匹配优先级:
精确匹配>通配符匹配>后缀匹配>任意匹配
注:如果都没有匹配,则进入 web容器查找静态资源,返回静态资源。如果web容器也找不到资源则返回404。
Web服务器对请求地址的处理过程:
1.精确匹配
资源路径必须一致才能匹配成功
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/a.html</url-pattern>
</servlet-mapping>
浏览器输入: http://localhost:8080/a.html 匹配成功
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/b</url-pattern>
</servlet-mapping>
浏览器输入: http://localhost:8080/b 匹配成功
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/a/test.html</url-pattern>
</servlet-mapping>
浏览器输入: http://localhost:8080/a/test.html 匹配成功
2.通配符匹配
使用*来匹配0个或多个字符
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
代表输入任何不同的资源路径地址都能匹配成功
浏览器输入: http://localhost:8080/a/b/c 匹配成功
浏览器输入: http://localhost:8080/test.html 匹配成功
3.通配符路径匹配
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/a/*</url-pattern>
</servlet-mapping>
代表输入任何以 a 路径开头的资源路径地址都能匹配成功
浏览器输入: http://localhost:8080/a/test 匹配成功
浏览器输入: http://localhost:8080/a/abc/xyz 匹配成功
浏览器输入: http://localhost:8080/a/a.html 匹配成功
4.后缀匹配
使用*.xx结尾,表示资源路径以任意多个字符开头并以.xx结尾就能匹配成功
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
浏览器输入: http://localhost:8080/xxx.do 匹配成功
浏览器输入: http://localhost:8080/a/a.do 匹配成功
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
浏览器输入: http://localhost:8080/xxx.jsp 匹配成功
浏览器输入: http://localhost:8080test/abc.jsp 匹配成功
5.匹配任意的url
当以上方式匹配规则都没有匹配成功时。
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<!--当url-pattern配置成/*的时候,Tomcat会将所有没匹配成功的请求交给对应的Servlet进行处理-->
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--当url-pattern配置成/的时候,多数情况下与/*效果一致,但是,当访问的路径正好对应jsp文件时,Tomcat会访问的是jsp文件而不是把请求交给对应的Servlet处理-->
注:
<url-pattern>资源路径 要么只能以/开头,要么只能以*开头。
<url-pattern>/app/*.jsp</url-pattern> 不正确<url-pattern>/*.jsp</url-pattern> 不正确
<url-pattern>he*.jsp</url-pattern>不正确
<url-pattern>/aa/*/bb</url-pattern> 是精确匹配,url必须是 /aa/*/bb,*已不代表通配的含义。
匹配优先级:
精确匹配>通配符匹配>后缀匹配>任意匹配
注:如果都没有匹配,则进入 web容器查找静态资源,返回静态资源。如果web容器也找不到资源则返回404。
Web服务器对请求地址的处理过程:
首先到当前web应用的web容器下的web.xml文件查找是否有匹配的url-pattern资源路径,有则交由 url-pattern对应的servlet-name的 Servlet处理该请求并响应给浏览器,没有则交给tomcat的内置的DefaultServlet处理,DefaultServlet程序到web容器的根目录下查找是否存在一个名称为xxx.html的静态文件,如果找到该文件,则读取该文件内容,返回给浏览器,如果找不到该文件,则返回404错误页面。
注:先找动态资源,再找静态资源