静态资源过滤
- 在DispatchServlet前端控制器中配置的url-pattern的地址为/,这样只会拦截所有的请求,不会拦截.jsp和.jspx的请求
- 而配置的url-pattern的地址为/*,会拦截所有得到请求,包括jsp和jspx,仍然会由DispatcherServlet, 解析jsp地址, 不能根据jsp页面找到handler, 会报错
第一种方式
-
由于DispatchServlet拦截了所有请求,包括css、js、jpg…,有时候我们不希望拦截这些静态资源的请求,会在mvc配置文件中加入
<mvc:default-servlet-handler/>
-
在使用mvc:default 的时候,要加入mvc命名空间
-
xmlns:mvc="http://www.springframework.org/schema/mvc" http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
- org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler,它会像一个检查员,对进入DispatcherServlet的URL进行筛查,如果发现是静态资源的请求,就将该请求转由Web应用服务器默认的Servlet处理,如果不是静态资源的请求,才由DispatcherServlet继续处理。
第二种方式
- 在mvc配置文件中,指定springmvc去处理资源
<mvc:resources location="/img/" mapping="/img/**"/>
<mvc:resources location="/js/" mapping="/js/**"/>
<mvc:resources location="/css/" mapping="/css/**"/>
-
location:指location指定的目录不要拦截,直接请求,这里指在根目录下的resources文件下的所有文件
-
mapping:值在resources文件下的所有文件(**代表所有文件)
-
根目录下resources的所有文件不会被DispatcherServlet拦截,直接访问,当做静态资源交个Servlet处理
-
- 使用resources过滤掉不需要dispatcherservlet的资源(即静态资源,例如css、js、html、images)。
- 在使用resources时必须使用annotation-driven,否则resources元素会阻止任意控制器被调用
第三种方式
- 在web.xml中,指定过滤哪些请求不经过DispatchServlet
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.gif</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
Controller
@Controller
@RequestMapping("user")//这里的配置是为了区分有多个同名的save访问路径
public class UserController {
@RequestMapping("save")//这样,访问这个方法直接就是 localhost:8080/项目名/user/save
public ModelAndView save(User user){
System.out.println(user);
ModelAndView modelAndView = new ModelAndView();
//将请求过来的user对象存在模型中,转发出去
modelAndView.addObject("user",user);
//跳转到a.jsp
modelAndView.setViewName("a");
return modelAndView;
}
}
xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--自动扫描包,让指定包下的注解生效,由IOC容器统一管理-->
<context:component-scan base-package="com.mlyr.c"/>
<!--注解映射器-->
<!--<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>-->
<!--注解适配器-->
<!--<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>-->
<!--使用 mvc:annotation-driven代替上边注解映射器和注解适配器配置
mvc:annotation-driven默认加载很多的参数绑定方法,比如json转换解析器就默认加载了,
如果使用mvc:annotation-driven不用配置上边的RequestMappingHandlerMapping和RequestMappingHandlerAdapter
-->
<mvc:annotation-driven/>
<!--不拦截静态资源-->
<mvc:default-servlet-handler/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>