servlet的匹配规则
1、url参与匹配的是哪部分
在介绍servlet的匹配规则之前,先要说明一点,匹配的时候并不是用完整的url来和'<servlet-mapping>'中的'<url-pattern>'进行匹配。
而是用完整url减去当前应用的上下文的路径之后的部分来和'<url-pattern>'进行匹配。
举个例子,譬如,
请求的url是: 'http://localhost:8080/appDemo/user/users.html'
该应用是appDemo,那么当前应用的上下文路径是: 'http://localhost:8080/appDemo'
那么相减之后的部分就是: '/user/users.html' ,也就是用相减之后的这一部分与`<url-pattern>`进行匹配。
2、 servlet的四种匹配规则
● 精确匹配 :<url-pattern>中配置的项与url相应部分完全一致才能匹配上。
● 路径匹配:以/字符开头,并以/*结尾的字符串用于路径匹配。
例如
①、
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/user/*</url-pattern>
</servlet-mapping>
路径以/user/开始,后面的路径可以任意。比如下面的url都会被匹配:
http://localhost:8080/appDemo/user/users.html
http://localhost:8080/appDemo/user/addUser.action
http://localhost:8080/appDemo/user/updateUser.actionl
②、
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
【/*】它涵盖的范围最大,它可以匹配所有的request请求。
● 扩展名匹配 :以*.开头的字符串被用于扩展名匹配。
例如: <servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>*.jsp</url-pattern> //任何扩展名为jsp的url请求都会匹配
</servlet-mapping>
● 缺省匹配:缺省匹配的写法是唯一的,就是<url-pattern>/</url-pattern>。
3、匹配优先级别
精确匹配 > 路径匹配 > 扩展名匹配 > 缺省匹配
4、路径匹配和扩展名匹配不能同时使用
【注意】: <url-pattern>/aa/*/bb</url-pattern> //这个是精确匹配,url必须是/aa/*/bb,这里的*不是通配的含义
/ 、/* 的区别
1、<url-pattern>/</url-pattern>属于servlet中一种特殊的匹配模式。该模式有且只有一个实例,且优先级别最低,不会覆盖其他的url-pattern,
只会替换servlet容器中內建的default servlet,该模式同样会匹配所有的请求。
2、而servlet,通常是配成<url-pattern>/</url-pattern>,这样就只会匹配形如/login这样的路径型的url,而不会匹配到模式为*.jsp这样的
后缀型url。之所以jsp页面不会命中这个servlet,是因为servlet容器內建的JSP Servlet会被调用,而这个JSP Servlet设置的匹配规则是.jsp,
而由于扩展名匹配的优先级高于缺省匹配,因此轮不到缺省匹配的servlet去处理模式为*.jsp这样的后缀型url。
3、servlet如果配成<url-pattern>/*</url-pattern>,就很可能会出问题。因为这样的servlet会拦截所有的请求,而且请求会在此servlet中结束,
也就是说轮不到其他serevlet来处理请求。模式为*.jsp或*.js这样的后缀型url也会被匹配到,因此当浏览器请求一个js资源的时候,也会被该
servlet拦截,最后会由于在控制器中找不到对应的处理方法,而报404这样的错误。
4、而filter,因为处理编码问题的过滤器是要涵盖所有的请求的,因此要使用路径匹配中能涵盖所有请求的<url-pattern>*/</url-pattern>。
<url-pattern>/</url-pattern>只在servlet中才会匹配所有的请求。
interceptor、filter、servlet的匹配比较
★ springmvc的DispatcherServlet通常是配为:
<url-pattern>/</url-pattern>:表示拦截除静态资源外的所有请求。
★ filter过滤器通常是配为:
<url-pattern>/*</url-pattern>:表示拦截所有请求(包括静态资源)。
★ 要注意的是,SpringMVC的interceptor拦截器的匹配规则和上面servlet的匹配规则是不一样的。
<mvc:mapping path="/document/*"/>
<mvc:mapping path="/document/**"/>
前者拦截的是/document/save或者/document/delete,而不能拦截/document/path1/save。 即只可以拦截当前目录下的所有请求
而后者拦截的是/document/save或者/document/path1/save或者/document/path1/path2/save,即可以拦截当前目录及其子目录下的所有请求。
interceptor、filter、servlet的对比
1、所在位置:servlet、filter、listener是配置到web.xml中,interceptor不配置到web.xml中,struts的拦截器配置到struts.xml中,
spring的拦截器配置到spring.xml中。
2、加载顺序:web.xml 的加载顺序是:context- param -> listener -> filter -> servlet
3、interceptor和filter的执行顺序:接收到http请求时先执行filter再执行interceptor,
最后返回html代码前先执行interceptor再执行filter。
如果把整个请求看做生产流水线,那么filter是在头部和尾部,而interceptor是在脖子部位和膝盖部位。