(续)SSM整合之springmvc笔记(拦截器)(P164-168)

news2025/2/4 6:38:11

目录

一 准备工作  

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()会执行

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/21832.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker概念及安装

一、Docker概述 1 IT架构的演进&#xff1a; 裸金属 → 虚拟机 → 容器→ 函数化、代码化 云计算涌现出很多改变传统IT架构和运维方式的新技术&#xff0c;比如虚拟机、容器、微服务、Serverless&#xff08;无服务&#xff09;&#xff0c;无论这些技术应用在哪些场景&…

智慧能源解决方案-最新全套文件

智慧能源解决方案-最新全套文件一、建设背景存在的问题二、建设架构三、建设方案四、获取 - 智慧能源全套最新解决方案合集一、建设背景 我国工业能耗占全国总能耗比例近70%&#xff0c;许多经济大省工业能耗占比甚至显著高于70%&#xff0c;工业企业能耗增速也明显领先全国其…

Bash脚本debug攻略

初学Bash时, 我从未想过去debug Bash脚本, 也从未想过Bash脚本也能debug. 随着技术的增长, 写的脚本越来越复杂, 使用echo打印日志来调试脚本的方式也越来越捉襟见肘了. 直到某天 通读了一遍Bash Reference Manual, 才发现Bash脚本也是可以debug的. 下面就介绍三种debug Bash脚…

定时器之编码器模式

1.什么是编码器 编码器&#xff08;encoder&#xff09;是将信号或数据进行编制、转换为可用以通讯、传输和存储的信号形式的设备。编码器把角位移或直线位移转换成电信号&#xff0c;前者称为码盘&#xff0c;后者称为码尺。 2.分类 按照读出方式编码器可以分为接触式和非接…

C++学习笔记(面向对象部分开始6500字复习总结)

函数重载 1.对象属性 对象方法 和 类属性 类方法 2.const函数read only&#xff0c;不会修改任何数据 3.class默认private&#xff0c;struct默认public 4.&#xff01;&#xff01;&#xff01;&#xff01;C编译器优化&#xff01;&#xff01;&#xff01;《个人理解》当…

单细胞分析:数据整合(九)

导读 本文将学习跨条件执行单细胞整合&#xff0c;以识别彼此相似的细胞。 1. 目标 跨条件对齐相同的细胞类型。2. 挑战 对齐相似细胞类型的细胞&#xff0c;这样就不会因为样本、条件、模式或批次之间的差异而在后续分析中进行聚类。 3. 推荐 建议先不整合分析&#xff0c;再决…

2020下半年软件设计师上午题错题总结

2020下半年 1、以下关于两个浮点数相加运算的叙述中&#xff0c;正确的是 &#xff08;3&#xff09; 。 A. 首先进行对阶&#xff0c;阶码大的向阶码小的对齐 B. 首先进行对阶&#xff0c;阶码小的向阶码大的对齐 C. 不需要对阶&#xff0c;直接将尾数相加 D. 不需要对阶…

[附源码]java毕业设计网上购物商城

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

33.nacos客户端读取多配置文件实例(springcloud)

1.配置文件的读取方式【重点】nacos 配置中心通过 namespace、dataId 和 group 来唯一确定一条配置。 Namespace&#xff1a;即命名空间。默认的命名空间为 public&#xff0c;我们可以在 Nacos 控制台中新建命名空间&#xff1b;dataId&#xff1a;即配置文件名称 Group &…

比 O(nlog(n)) 做得更好——创造合适的条件

我们可以比 O(nlog(n)) 更快地排序。 长按关注《Python学研大本营》&#xff0c;加入读者群&#xff0c;分享更多精彩 扫码关注《Python学研大本营》&#xff0c;加入读者群&#xff0c;分享更多精彩 介绍 我将介绍一种我称之为 groupSort 的排序方法。我没有直接解决排序问题…

基于小波变换编码的纹理图像分割

目录 1.算法概述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 我们使用11或13维特征向量表示图像中的每个像素。两个特征用于表示像素之间的空间关系&#xff1b;由图像尺寸规格化的x和y像素坐标。对于灰度图像&#xff0c;一个特征是低通表示&#…

Python编程从入门到实践 第十一章:测试代码 练习答案记录

Python编程从入门到实践 第十一章&#xff1a;测试代码 练习答案记录 练习题导航Python编程从入门到实践 第十一章&#xff1a;测试代码 练习答案记录11.1 测试函数11.1.1 单元测试和测试用例11.1.2 可通过的测试11.1.3 未通过的测试11.1.4 测试未通过时怎么办11.1.5 添加新测试…

Flutter/Dart 中的 extension 方法

Flutter Dart 中的 extension 方法 前言 我们将讨论 extension 方法如何对我们有用&#xff0c;以及为什么您的代码因为它们而变得更加精确和可读的原因。 简介 在本文中&#xff0c;我们将学习 Dart 中的 extension 方法。也许你想知道那是什么&#xff0c;它是如何工作的&…

HIve数仓新零售项目DWS层的构建(Full join)模型

HIve数仓新零售项目 注&#xff1a;大家觉得博客好的话&#xff0c;别忘了点赞收藏呀&#xff0c;本人每周都会更新关于人工智能和大数据相关的内容&#xff0c;内容多为原创&#xff0c;Python Java Scala SQL 代码&#xff0c;CV NLP 推荐系统等&#xff0c;Spark Flink Kaf…

全自动调节灯光强度的实现(仿真+程序+文档)

目 录 摘 要 I Abstract II 绪论 1 1.1 选题背景及意义 1 1.2 国内外研究现状 1 1.3 研究主要内容 3图书馆学习桌台灯智能控制系统简介与方案分析 4 2.1 大学图书馆照明控制现状 4 2.2 图书馆学习桌台灯智能控制系统简介 4 2.3 系统控制方案分析 4 2.4 本章小节 5系统硬件设计…

JavaScript练手小技巧:我破解了原神官网全屏滚动的秘密

这个标题有点夺人眼球&#xff0c;哈啊哈~骗点击率的。 “原神”官网当真的做的很漂亮&#xff0c;虽然我没玩过这个游戏&#xff0c;但是禁不住喜欢这个网站啊。 https://ys.mihoyo.com/ 最近居家教学上网课。除了上课&#xff0c;实在不想做学校安排的其它任务&#xff0c…

热量衡算习题课

第一部分 --- 传热计算综合例题 1.qm是质量流量&#xff0c;T1&#xff0c;2和 t1,2对应的是热流体和冷流体分别在管道进口和出口的温度 2.吊塔tm是传热温差 3.α1是热流体的对流传热系数&#xff0c;α2是冷流体的对流传热系数&#xff0c;K是整个对流传热过程的总的传热系…

【Linux】在Xilinx平台上实现UVC Gadget(2)- 解决dwc3驱动bug

【Linux】在Xilinx平台上实现UVC Gadget&#xff08;2&#xff09;- 解决dwc3驱动bug一、bug描述二、具体修改方法1. 找到内核源码位置并复制到其他目录2. Petalinux里面设置使用自定义内核源码1) 选第2个Linux Components Selection2) 选linux-kernel&#xff0c;回车&#xf…

【笔试题】【day22】

文章目录第一题&#xff08;循环队列的元素个数&#xff09;第二题&#xff08;二叉排序树插入规则&#xff09;第三题&#xff08;线性探测的平均查找长度&#xff09;第四题&#xff08;关键字比较次数与初始序列无关的&#xff09;第一题&#xff08;循环队列的元素个数&…

m短波宽带通信系统的信道建模matlab仿真

目录 1.算法概述 1.1 Watterson信道模型理论简介 1.2 Nakagami信道模型 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 宽带短波信道的研究是设计宽带大容量短波通信的基础&#xff0c;但是传统的短波信道的研究仅限于窄带信号传输&#xff0c;这已经…