目录
一 准备工作
1. 创建spring_mvc_extension com.atguigu
2 .导入依赖
3. 添加web模块
4 .web.xml
5 . springmvc.xml
6 index.html
7 控制层
8 success.html
9 .添加到tomcat
10 测试
二 . 测试拦截器
1 . index.html
2 . FirstInterceptor
三 拦截器的配置
四 拦截器的三个抽象方法
五 多个拦截器的执行顺序
1. 在创建一个拦截器SecondInterceptor
2. 配置拦截器
3. 重新启动
总结
一 准备工作
1. 创建spring_mvc_extension com.atguigu
2 .导入依赖
<packaging>war</packaging> <dependencies> <!-- SpringMVC --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.1</version> </dependency> <!-- 日志 --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> <!-- ServletAPI --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <!-- Spring5和Thymeleaf整合包 --> <dependency> <groupId>org.thymeleaf</groupId> <artifactId>thymeleaf-spring5</artifactId> <version>3.0.12.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency> </dependencies>
3. 添加web模块
4 .web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
5 . springmvc.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 https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--扫描控制层组件-->
<context:component-scan base-package="com.atguigu"></context:component-scan>
<!-- 配置Thymeleaf视图解析器 -->
<bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
<property name="order" value="1"/>
<property name="characterEncoding" value="UTF-8"/>
<property name="templateEngine">
<bean class="org.thymeleaf.spring5.SpringTemplateEngine">
<property name="templateResolver">
<bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
<!-- 视图前缀 -->
<property name="prefix" value="/WEB-INF/templates/"/>
<!-- 视图后缀 -->
<property name="suffix" value=".html"/>
<property name="templateMode" value="HTML5"/>
<property name="characterEncoding" value="UTF-8" />
</bean>
</property>
</bean>
</property>
</bean>
<!--
配置默认的servlet处理静态资源
当前工程的web.xml配置的前端控制器DispatcherServlet的url-pattern是/
tomcat的web.xml配置的DefaultServlet的url-pattern也是/
此时,浏览器发送的请求会优先被DispatcherServlet进行处理,但是DispatcherServlet无法处理静态资源
若配置了<mvc:default-servlet-handler />,此时浏览器发送的所有请求都会被DefaultServlet处理
若配置了<mvc:default-servlet-handler />和<mvc:annotation-driven />
浏览器发送的请求会先被DispatcherServlet处理,无法处理在交给DefaultServlet处理
-->
<mvc:default-servlet-handler />
<!--开启mvc的注解驱动-->
<mvc:annotation-driven />
<!--配置视图控制器-->
<mvc:view-controller path="/" view-name="index"></mvc:view-controller>
<!--配置文件上传解析器-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
</bean>
</beans>
6 index.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h1>index.html</h1>
</body>
</html>
7 控制层
@Controller
public class TestController {
@RequestMapping("/test/hello")
public String testHello(){
return "success";
}
}
8 success.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>成功</title>
</head>
<body>
<h1>success.html</h1>
</body>
</html>
9 .添加到tomcat
10 测试
二 . 测试拦截器
1 . index.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h1>index.html</h1>
<a th:href="@{/test/hello}">测试拦截器</a>
</body>
</html>
2 . FirstInterceptor
package com.atguigu.interceptor;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 拦截器的三个方法:
* preHandle():在控制器方法执行之前执行,其返回值表示对控制器方法的拦截(false)或放行(true)
* postHandle():在控制器方法执行之后执行
* afterCompletion():在控制器方法执行之后,且渲染视图完毕之后执行
*
* 多个拦截器的执行顺序和在SpringMVC的配置文件中配置的顺序有关
* preHandle()按照配置的顺序执行,而postHandle()和afterCompletion()按照配置的反序执行
*
* 若拦截器中有某个拦截器的preHandle()返回了false
* 拦截器的preHandle()返回false和它之前的拦截器的preHandle()都会执行
* 所有的拦截器的postHandle()都不执行
* 拦截器的preHandle()返回false之前的拦截器的afterCompletion()会执行
*/
@Component
public class FirstInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("FirstInterceptor-->preHandle");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("FirstInterceptor-->postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("FirstInterceptor-->afterCompletion");
}
}
三 拦截器的配置
SpringMVC
中的拦截器用于拦截控制器方法的执行
SpringMVC中的拦截器需要实现HandlerInterceptor
<!--拦截器的配置 -->
<mvc:interceptors>
<!-- bean和ref标签所配置的拦截器默认对DispatcherServlet处理的所有的请求进行拦截-->
<!-- <bean class="com.atguigu.interceptor.FirstInterceptor"/>
<ref bean="firstInterceptor" />-->
<mvc:interceptor>
<!--当前上下文路径需要拦截的一层目录-->
<!-- <mvc:mapping path="/*" />-->
<!--当前所有的需要拦截的请求路径--> <!--配置需要拦截的请求的请求路径,/**表示所有请求-->
<mvc:mapping path="/**" />
<!--不需要拦截的请求路径--> <!--配置需要排除拦截的请求的请求路径-->
<mvc:exclude-mapping path="/abc" />
<!--配置拦截器-->
<ref bean="firstInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
/* 上下文路径的一层目录
/**
四 拦截器的三个抽象方法
SpringMVC
中的拦截器有三个抽象方法:
preHandle
:控制器方法执行之前执行
preHandle()
,其
boolean
类型的返回值表示是否拦截或放行,返
回
true
为放行,即调用控制器方法;返回
false
表示拦截,即不调用控制器方法
postHandle
:控制器方法执行之后执行
postHandle()
afterCompletion
:处理完视图和模型数据,渲染视图完毕之后执行
afterCompletion()
五 多个拦截器的执行顺序
①若每个拦截器的
preHandle()
都返回
true
此时多个拦截器的执行顺序和拦截器在
SpringMVC
的配置文件的配置顺序有关:
preHandle()
会按照配置的顺序执行,而
postHandle()
和
afterCompletion()
会按照配置的反序执行
②若某个拦截器的
preHandle()
返回了
false
preHandle()
返回
false
和它之前的拦截器的
preHandle()
都会执行,
postHandle()
都不执行,返回
false的拦截器之前的拦截器的
afterCompletion()
会执行
1. 在创建一个拦截器SecondInterceptor
package com.atguigu.interceptor;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Date:2022/7/10
* Author:ybc
* Description:
* 拦截器的三个方法:
* preHandle():在控制器方法执行之前执行,其返回值表示对控制器方法的拦截(false)或放行(true)
* postHandle():在控制器方法执行之后执行
* afterCompletion():在控制器方法执行之后,且渲染视图完毕之后执行
*
* 多个拦截器的执行顺序
*/
@Component
public class SecondInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("SecondInterceptor-->preHandle");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("SecondInterceptor-->postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("SecondInterceptor-->afterCompletion");
}
}
2. 配置拦截器
<!--拦截器的配置 -->
<mvc:interceptors>
<ref bean="firstInterceptor" />
<ref bean="secondInterceptor" />
</mvc:interceptors>
3. 重新启动
现在我们把配置顺序修改一下
<!--拦截器的配置 -->
<mvc:interceptors>
<ref bean="secondInterceptor" />
<ref bean="firstInterceptor" />
</mvc:interceptors>
重新启动
总结
拦截器的三个方法: * preHandle():在控制器方法执行之前执行,其返回值表示对控制器方法的拦截(false)或放行(true) * postHandle():在控制器方法执行之后执行 * afterCompletion():在控制器方法执行之后,且渲染视图完毕之后执行 * * 多个拦截器的执行顺序和在SpringMVC的配置文件中配置的顺序有关 * preHandle()按照配置的顺序执行,而postHandle()和afterCompletion()按照配置的反序执行 * * 若拦截器中有某个拦截器的preHandle()返回了false * 拦截器的preHandle()返回false和它之前的拦截器的preHandle()都会执行 * 所有的拦截器的postHandle()都不执行 * 拦截器的preHandle()返回false之前的拦截器的afterCompletion()会执行