<url-pattern>/</url-pattern>
servlet
的url-pattern
设置为/
时, 它仅替换servlet容器
的默认内置servlet
,用于处理所有与其他注册的servlet
不匹配的请求。直白点说就是,所有静态资源(js,css,image,html等)的访问都将交给该servlet处理,而jsp页面则交给servlet容器
内置的JSP servlet
处理。会匹配到 /hello 这样的路径型的url,不会匹配到模式为*.jsp这样的后缀型url,言外之意就是不拦截jsp文件。故经过视图解析器后返回jsp视图时不会再进入DispatcherServlet。
说到为什么JSP页面的请求并不会命中这个Servlet,那是因为servlet容器内建的JSP Servlet将会被调用,而这个容器内建的JSP Servlet已经默认地映射在了*.jsp上。但还是能拦截到静态资源,如*.js,*.css。
<url-pattern>/*</url-pattern>
servlet
的url-pattern
设置为/*
时,它会覆盖其他所有的servlet
,包括servlet容器
提供的所有servlet
,如缺省servlet
和JSP servlet
。 无论你发出什么请求,都会在该servlet
拦截处理。通常我们不会这么做。如果你只是想使用/*
,那么你可以在Filter
中使用,它处理完后会将url
交给servlet
处理。会匹配所有的url:路径型的和后缀型的url(包括/login,*.jsp,*.js和*.html等)。故经过视图解析器后返回jsp视图时会再进入DispatcherServlet,导致找不到对应的controller所以报404错。
/和/*的区别总结
先说一种问题,假设你方法请求后想返回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> 会匹配到/hello这样的路径型url,不会匹配到模式为*.jsp这样的后缀型url
< url-pattern>/*</url-pattern> 会匹配所有url:路径型的和后缀型的url(包括/hello,*.jsp,*.js和*.html等)