SSM框架下的 web.xml 中的拦截分析<url-pattern>/</url-pattern>与<url-pattern>/*</url-pattern>
我们在配置 mvc 的配置文件时,总能发现一些现象,就是映射路径突然加了个星啊,突然又少加个星。
比如:整合 Mybatis ,配置数据源有一个路径是
<property name="configLocation"
value="classpath*:config/sqlmapper.xml"></property>
这里的 classpath 后面就加了一个星,有时候加上报错,有时候去掉报错就会很头疼,这个我还没去研究。
但是在实践过程中又发现一类似的问题,就是上面说的 <url-pattern>/</url-pattern> 与 <url-pattern>/*</url-pattern>,这个是在
web .xml 里面的。经过查阅资料得到下面的解释。
-
<url-pattern> / </url-pattern>
会匹配到/login这样的路径型的url,不会匹配到模式为*.jsp这样的后缀型url,言外之意就是不拦截jsp文件。故经过视图解析器后返回jsp视图时不会再进入DispatcherServlet。说到为什么JSP页面的请求并不会命中这个Servlet,那是因为servlet容器内建的JSP Servlet将会被调用,而这个容器内建的JSP Servlet已经默认地映射在了*.jsp上。但还是能拦截到静态资源,如*.js,*.css。
-
<url-pattern>/*</url-pattern>
会匹配所有的url:路径型的和后缀型的url(包括/login,*.jsp,*.js和*.html等)。
故经过视图解析器后返回jsp视图时会再进入DispatcherServlet,导致找不到对应的controller所以报404错。
-
/和/*的区别总结
先说一种问题,假设你方法请求后想返回index.jsp界面:return "index";
如果配置成< url-pattern > /* </ url-pattern >这样,即使你配置了如下这些同样会报错。
<!-- 3.定义视图解析器
配置jsp 显示ViewResolver -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/jsp/"/><!-- 前缀 -->
<property name="suffix" value=".html"/><!-- 后缀 -->
</bean>
通过这种错误配置再来看一下两者区别吧:
< url-pattern > / </ url-pattern > 不会匹配到*.jsp,即:*.jsp不会进入spring的 DispatcherServlet类 。
< url-pattern > /* </ url-pattern > 会匹配*.jsp,会出现返回jsp视图时再次进入spring的 DispatcherServlet 类,重复的去分配到方法里面,最终导致找不到对应的controller所以报404错。
总之,关于web.xml的url映射的小知识:
< url-pattern>/</url-pattern> 会匹配到/login这样的路径型url,不会匹配到模式为*.jsp这样的后缀型url
< url-pattern>/*</url-pattern> 会匹配所有url:路径型的和后缀型的url(包括/login,*.jsp,*.js和*.html等)