在SpringMVC中,我们通常会在web.xml文件中配置要拦截的url请求,这个时候就需要用到url-pattern来进行配置了。下面是一个web.xml的示例
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<!-- 指定的SpringMVC配置文件的路径 -->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!--拦截匹配规则的url请求,进入springmvc框架处理-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
1. 配置方式
● 带后缀配置,比如:.action、.do、.show等,该种方式比较精确和方便;
● / 配置,该种方式会拦截所有的请求,不会拦截.jsp文件,但是会拦截.html等静态资源(静态资源:除了servlet和jsp之外的js、css、png等),默认使用该方式。
● /*配置,该种方式会拦截所有的请求,包括.jsp
2. / 方式配置
- 存在问题: 拦截.html、.jsp、.css等静态资源,
- 原因:因为tomcat容器中有一个web.xml(父),自己的项目中也有一个web.xml(子),是一个继承关系父web.xml中有一个DefaultServlet, url-pattern 是一个 /此时我们自己的web.xml中也配置了一个 / ,覆写了父web.xml的配置。
不拦截.jsp的原因:因为父web.xml中有一个JspServlet,这个servlet拦截.jsp文件,而我们并没有覆写这个配置, 所以springmvc此时不拦截jsp,jsp的处理交给了tomcat - 解决方案:
方案一:在springmvc的配置文件中添加以下内容
<mvc:default-servlet-handler/>
原理: 添加该标签配置之后,会在SpringMVC上下文中定义一个DefaultServletHttpRequestHandler对象这个对象如同一个检查人员,对进入DispatcherServlet的url请求进行过滤筛查,如果发现是一个静态资源请求,那么会把请求转由web应用服务器(tomcat)默认的DefaultServlet来处理,如果不是静态资源请求,那么继续由SpringMVC框架处理。
方案二:在springmvc的配置文件中添加以下内容
<mvc:resources location="classpath:/" mapping="/resources/**"/>
原理:SpringMVC框架自己处理静态资源,mapping:约定的静态资源的url规则,location:指定的静态资源的存放位置