目录
1. 创建spring_mvc_extension com.atguigu
war org.springframework spring-webmvc 5.3.1 ch.qos.logback logback-classic 1.2.3 javax.servlet javax.servlet-api 3.1.0 provided org.thymeleaf thymeleaf-spring5 3.0.12.RELEASE commons-fileupload commons-fileupload 1.3.1

- "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>CharacterEncodingFilterfilter-name>
- <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
- <init-param>
- <param-name>encodingparam-name>
- <param-value>UTF-8param-value>
- init-param>
- <init-param>
- <param-name>forceEncodingparam-name>
- <param-value>trueparam-value>
- init-param>
- filter>
- <filter-mapping>
- <filter-name>CharacterEncodingFilterfilter-name>
- <url-pattern>/*url-pattern>
- filter-mapping>
-
- <filter>
- <filter-name>HiddenHttpMethodFilterfilter-name>
- <filter-class>org.springframework.web.filter.HiddenHttpMethodFilterfilter-class>
- filter>
- <filter-mapping>
- <filter-name>HiddenHttpMethodFilterfilter-name>
- <url-pattern>/*url-pattern>
- filter-mapping>
-
- <servlet>
- <servlet-name>SpringMVCservlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
- <init-param>
- <param-name>contextConfigLocationparam-name>
- <param-value>classpath:springmvc.xmlparam-value>
- init-param>
- <load-on-startup>1load-on-startup>
- servlet>
- <servlet-mapping>
- <servlet-name>SpringMVCservlet-name>
- <url-pattern>/url-pattern>
- servlet-mapping>
-
-
-
- web-app>
- "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>
-
-
- <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>
-
-
- <mvc:default-servlet-handler />
-
-
- <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>
- html>
- <html lang="en" xmlns:th="http://www.thymeleaf.org">
- <head>
- <meta charset="UTF-8">
- <title>首页title>
- head>
- <body>
- <h1>index.htmlh1>
-
- body>
- html>
- @Controller
- public class TestController {
-
- @RequestMapping("/test/hello")
- public String testHello(){
- return "success";
- }
-
- }
- html>
- <html lang="en" xmlns:th="http://www.thymeleaf.org">
- <head>
- <meta charset="UTF-8">
- <title>成功title>
- head>
- <body>
- <h1>success.htmlh1>
- body>
- html>

10 测试
- html>
- <html lang="en" xmlns:th="http://www.thymeleaf.org">
- <head>
- <meta charset="UTF-8">
- <title>首页title>
- head>
- <body>
- <h1>index.htmlh1>
- <a th:href="@{/test/hello}">测试拦截器a>
-
- body>
- html>

- 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中的拦截器需要实现HandlerInterceptor
-
- <mvc:interceptors>
-
-
-
- <mvc:interceptor>
-
-
-
- <mvc:mapping path="/**" />
-
- <mvc:exclude-mapping path="/abc" />
-
- <ref bean="firstInterceptor" />
- mvc:interceptor>
- mvc:interceptors>
/* 上下文路径的一层目录


/**



- 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");
- }
- }
-
- <mvc:interceptors>
- <ref bean="firstInterceptor" />
- <ref bean="secondInterceptor" />
- mvc:interceptors>

现在我们把配置顺序修改一下
-
- <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()会执行