虽然一直用,因为基本不会遇到问题。
这里弄清楚一下
对tomcat,有4种
/* wildcardWrappers
*. extensionWrappers
/ defaultWrapper
其他 exactWrappers
优先级是
1.精确匹配最优先,exactWrappers
2.前缀匹配,wildcardWrappers /*
3.扩展名匹配,extensionWrappers *.
4.显示welcome
5.使用默认的servlet来处理,defaultWrapper /
到这里,就能区分开/*和/的区别了
例子,springmvc里,定义了/*来处理所有的请求给springmvc的DispatcherServlet,也定义了一个@RequestMapping为index.jsp,web目录里面也放一个index.jsp
如果输入http://xxxx/index.jsp,那么请求会被/*给拦截给springmvc,因为rule2比rule3优先。
如果springmvc的servlet里定义的是/, index.jsp就不会被拦截给springmvc,因为rule3比rule5高。
同时,我们还可能会碰到这样的问题
springmvc里面定义/*拦截,然后@RequestMapping定义为index,做一个viewResolver,指向WEB-INF/views/login.jsp。这个时候,如果访问index,会出现什么结果?
a。index会被springmvc拦截,然后去访问 WEB-INF/views/login.jsp
b。 结果WEB-INF/views/login.jsp又被springmvc再次拦截了(rule2比rule3优先级高)
结果导致出现
No mapping found for HTTP request with URI [/xiu_template/WEB-INF/views/login.jsp] in DispatcherServlet with name 'spring.mvc'
出来不了我们想要的东西。
解决法子,最简单的自然是定义springmvc为比如url-pattern *.html,然后访问index.html,然后去WEB-INF/views/login.jsp,然后去的*.jsp的servlet。是没有问题的。
如果就是不想用扩展名的的方法咋办?? url-pattern是没有exclude的。
其实,只要在web.xml里面多顶一个前缀匹配就ok了。default的名字,是固定的。tomcat还可以写为jsp,因为真正的名字是jsp(可以通过serveletcontext找到getServletRegistrations后知道里面注册的servelet是org.apache.jasper.servlet.JspServlet,名字是jsp)。
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/WEB-INF/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/resources/*</url-pattern>
</servlet-mapping>
追到这里,就不由想到难道springmvc就不能处理jsp或者static的东西了?查了一下,发现早就有一个
<mvc:default-servlet-handler/>来对应这个事情,定义了这个,拦截了后不能mapping的就给这个default了。
这下才算是完满了。 web.xml里面清爽了。
default-servlet-handler自动发现server(tomcat)的默认serlet,交个它来出来自己搞不定的事情。
那是不是说定义了这个东西,事情就算完了?我发现如果网站在default-servlet-handler和spring-security搭配起容易出问题。
没有评论:
发表评论