SpringMVC

静态资源过滤

  • 在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
    

image-20210303140836588

  • 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处理

    1. 使用resources过滤掉不需要dispatcherservlet的资源(即静态资源,例如css、js、html、images)。
    2. 在使用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>

不经风雨,怎见彩虹?
原文地址:https://www.cnblogs.com/MLYR/p/14487006.html