1. 先来上段常见的代码
1 <!-- MVC Servlet --> 2 <servlet> 3 <servlet-name>springServlet</servlet-name> 4 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 5 <init-param> 6 <param-name>contextConfigLocation</param-name> 7 <param-value>classpath*:/spring-mvc*.xml</param-value> 8 </init-param> 9 <load-on-startup>1</load-on-startup> 10 </servlet> 11 <servlet-mapping> 12 <servlet-name>springServlet</servlet-name> 13 <url-pattern>/</url-pattern> 14 </servlet-mapping> 15 16 <filter> 17 <filter-name>encodingFilter</filter-name> 18 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 19 <init-param> 20 <param-name>encoding</param-name> 21 <param-value>UTF-8</param-value> 22 </init-param> 23 <init-param> 24 <param-name>forceEncoding</param-name> 25 <param-value>true</param-value> 26 </init-param> 27 </filter> 28 <filter-mapping> 29 <filter-name>encodingFilter</filter-name> 30 <url-pattern>/*</url-pattern> 31 </filter-mapping>
正所谓mvc配置千篇一律,不过这个<url-pattern>/</url-pattern> 跟 <url-pattern>/*</url-pattern> 概念还是有点模糊。
2. 两者的解释
2.1 <url-pattern>/</url-pattern>
会匹配到/login这样的路径型的url,不会匹配到模式为*.jsp这样的后缀型url,言外之意就是不拦截jsp文件。
故经过视图解析器后返回jsp视图时不会再进入DispatcherServlet。
说到为什么JSP页面的请求并不会命中这个Servlet,那是因为servlet容器内建的JSP Servlet将会被调用,而这个容器内建的JSP Servlet已经默认地映射在了*.jsp上。但还是能拦截到静态资源,如*.js,*.css。
2.2 <url-pattern>/*</url-pattern>
会匹配所有的url:路径型的和后缀型的url(包括/login,*.jsp,*.js和*.html等)。
故经过视图解析器后返回jsp视图时会再进入DispatcherServlet,导致找不到对应的controller所以报404错。
No mapping found for HTTP request with URI [/Shiro-Spring/WEB-INF/jsp/login.jsp] in DispatcherServlet with name ‘springmvc’
3. /和/*的区别总结
先说一种问题,假设你方法请求后想返回index.jsp界面:return "index";
如果配置成< url-pattern > /* </ url-pattern >这样,即使你配置了如下这些同样会报错。
<!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 前缀 --> <property name="prefix" value="/WEB-INF/jsp/" /> <!-- 后缀 --> <property name="suffix" value=".jsp" /> </bean>
错误提示:
org.springframework.web.servlet.DispatcherServlet noHandlerFound
警告: No mapping found for HTTP request with URI [/myspring/WEB-INF/jsp/index.jsp] in DispatcherServlet with name ‘spring’ 错误,
也就是找不到 index.jsp
通过这种错误配置再来看一下两者区别吧:
< 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等)