SpringMVC 学习博客记录

news2025/2/27 10:23:27

文章目录

  • Servlet请求转发和请求包含
    • RequestDispatcher
  • HandlerInterceptor组件
    • 实际运用场景
  • HandlerMapping&RequestMappingInfo(HandlerMapping)
  • HandlerExecutionChain
  • HandlerAdapter
  • 源码学习知识点博客记录


Servlet请求转发和请求包含

RequestDispatcher

Request#getRequestDispatcher()包含两个重要方法:请求转发和请求包含。
一个请求跨多个Servlet时,需要使用请求转发和请求包含。

示例伪代码 :

public void requestDispatcher() throws Exception {
    Request request = new Request(null);
    Response response = new Response();

	// 首先需要获得一个RequestDispatcher 对象
    RequestDispatcher requestDispatcher = request.getRequestDispatcher("/forward");
    requestDispatcher.forward(request,response);// 调用forward()方法进行请求转发
    requestDispatcher.include(request,response);// 调用include()方法进行请求包含

    response.sendRedirect("/redirect");// 调用sendRedirect()方法进行重定向
}

在这里插入图片描述

  • 请求包含: rd.include( request , response);
    在这里插入图片描述

HandlerInterceptor组件

HandlerInterceptor包含三个方法 :

  • preHandle是在找到处理handler对象的HandlerMapping之后,HandlerAdapter调度handler之前执行。

  • postHandle是在HandlerAdapter调度handler之后,DispatcherServlet渲染视图之前执行,可以通过ModelAndView来向视图中添加一些信息等,preHandle返回false不执行postHandle。

  • afterCompletion是在渲染视图结束后执行,主要可以用来进行事后的资源清理。无论 是否发生异常/preHandle返回false 都会执行

其中postHandle和afterCompletion方法是反顺序执行的。也就是说第一个拦截器会最后一个执行。关于HandlerInterceptor的执行顺序我们可以在HandlerExecutionChain类中找到。

完整示例 :

配置自己的Interceptor进容器,需要按照下示例方式

实现WebMvcConfigurer接口,添加@Configuration注解(可免除),在配置类中,重写addIntercepters方法,添加要拦截的url以及url白名单(需要排除拦截的url)

@Component
public class WebMvcConfig implements WebMvcConfigurer {
    @Autowired
    private CustomInterceptor customInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
       registry.addInterceptor(customInterceptor)  // 添加拦截器
               .addPathPatterns("/**")          // 配置拦截请求url( ** 表示拦截所有请求url)
               .excludePathPatterns("/hello"); // 排除某些不需要拦截的请求url(即带有/hello请求不会被拦截)
    }
}

WebMvcConfigurer重要的方法 :

  • addInterceptors:从该方法名就可以了解到该方法是添加拦截器,即将拦截器交给IOC去执行,拦截器需要拦截的路径以及需要排除拦截的路径在该方法中配置。
  • addResourceHandlers:该方法的作用是配置静态资源路径。即某些请求需要读取某个路径下的静态资源内容,需要配置该静态资源的路径,通过该方法可以统一给这些请求配置指定静态资源路径 。

addResourceHandlers 示例:

@Override
   public void addResourceHandlers(ResourceHandlerRegistry registry) {
       registry.addResourceHandler("/**")   // 配置需要添加静态资源的请求url
               .addResourceLocations("classpath:/mydata/");   //配置静态资源路径
   }

将自己的 HandlerInterceptor 添加进Spring容器 :

@Component
public class CustomInterceptor  implements HandlerInterceptor {
    //在Controller执行之前调用,如果返回false,controller不执行
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("---------CustomInterceptor.preHandle--------");
        return true;
    }
    //controller执行之后,且页面渲染之前调用
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("---------CustomInterceptor.postHandle--------");
    }
    //页面渲染之后调用,一般用于资源清理操作
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("---------CustomInterceptor.afterCompletion--------");
    }
}

到此就完成定义自己的一个HandlerInterceptor。

实际运用场景

HandlerInterceptor在实际开发中运用的场景

HandlerMapping&RequestMappingInfo(HandlerMapping)

HandlerExecutionChain

HandlerAdapter

源码学习知识点博客记录

HandlerAdapter实现类及RequestMappingHandlerAdapter调用过程

RequestMapping的注册及请求匹配过程

Controller的扫描注册及匹配过程

DispatcherServlet请求执行的过程

MVC重要组件及DispatcherServlet执行过程

Handler、HandlerMapping和HandlerAdapter作用及区别

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

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

相关文章

微服务技术要点

一、服务注册到nacos 1.下载nacos,修改nacos启动模式为单机模式,另外需要在环境变量配置JAVA_HOME,否则启动不起来。 2.启动类加注解EnableDiscoveryClient 3.application.yml配置nacos地址 spring:cloud:nacos:discovery:server-addr: 127.0.0.1:884…

JDK-JVM

JVM JDKJDK内部体系结构:JVM 与 跨平台JVM在程序运行过程中的运行细节,内存分配 和 流转模型。JVM结构体系1. 虚拟机栈2. 线程栈2.1. 栈帧2.2. 数据结构栈 与 线程栈 的关系:2.3.栈帧的内部结构:2.4 方法中的数据 在栈帧中的流转过…

MyBatis第三课

目录 回顾 #和$区别 #(预编译SQL)和$(即时SQL,它是进行的字符串拼接)的区别,其中之一就是预编译SQL和即时SQL的区别 原因: 回顾 两者的共同点 MaBits可以看作是Java程序和Mysql的沟通桥梁&…

网页设计与网站建设作业html+css+js,一个简易的游戏官网网页

一个简易的游戏网页 浏览器查看 目录结构 部分代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport&…

【c++】利用嵌套map创建多层树结构

通常树的深度都大于1&#xff0c;即树有多层&#xff0c;而树结构又可以用c的map容器来实现&#xff0c;所以&#xff0c;本文给出了一种多层树结构的实现思路&#xff0c;同时也给出了相应的c代码。 整体思路概述 首先定义一个节点类Node类&#xff0c;要包括children&#x…

EI论文复现:考虑多能互补的综合能源系统/虚拟电厂/微电网优化运行程序代码!

本程序参考EI论文《基于多能互补的热电联供型微网优化运行》&#xff0c;文章通过储能设备解耦热电联系&#xff0c;建立基于多能互补的综合能源系统/虚拟电厂/微电网优化运行模型。模型包含系统供给侧的多能互补协调与需求侧的综合能源响应两个方面&#xff0c;使供给侧通过能…

基于springboot时间管理系统源码和论文

在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括时间管理系统的网络应用&#xff0c;在外国时间管理系统已经是很普遍的方式&#xff0c;不过国内的管理系统可能还处于起步阶段。时间管理系统具有时间管理功能的选择。时间管…

XTuner 大模型单卡低成本微调实战

文章目录 配置环境微调部署与测试自定义微调 XTuner 大模型单卡低成本微调 原理可查看 XTuner 大模型单卡低成本微调原理 配置环境 创建一个名为xtuner&#xff0c;python3.10版本虚拟环境 conda create --name xtuner0.1.9 python3.10 -y创建一个xtuner019文件夹&#xff0c…

WebGL在虚拟现实(VR)的应用

WebGL在虚拟现实&#xff08;VR&#xff09;领域的应用日益增多&#xff0c;它为在Web浏览器中创建交互式的虚拟现实体验提供了强大的支持。以下是一些WebGL在VR领域的应用示例&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&am…

Word插件-大珩助手-手写电子签名

手写签名 支持鼠标写&#xff0c;支持触摸屏写&#xff0c;点击画笔按钮切换橡皮擦&#xff0c;支持清空画板重写&#xff0c;点击在word中插入签名&#xff0c;可插入背景透明的签字图 素材库-保存签名 将写好的签字图复制粘贴到素材库中&#xff0c;以便永久使用&#xff…

Visual Studio Code1.67版本已正式发布,新增Rust指南

Visual Studio Code1.67版本已正式发布&#xff0c;该版本包含大量增强生产力的更新项&#xff1a; 资源管理器文件嵌套 通过这次更新&#xff0c;用于浏览和管理文件和文件夹的Visual Studio Code的资源管理器工具现在支持基于名称嵌套相关文件。 资源管理器现在支持根据文…

【Linux操作】国产Linux服务管理操作

【Linux操作】国产Linux服务管理操作 前言SAMBA配置服务器端1. 安装相关包2. 配置/etc/samba/smb.conf&#xff0c;在此文件末尾添加如下内容&#xff0c;并保存退出。3. 创建/home/share并更改权限4. 启动samba服务 客户端• Windows客户端• 麒麟客户端 Telnet1、telnet语法2…

机器学习中的线性回归

线性回归 概念 利用 回归方程(函数) 对 一个或多个自变量(特征值)和因变量(目标值)之间 关系进行建模的一种分析方式。 分类 一元线性回归&#xff1a;y wx b 目标值只与一个因变量有关系 多元线性回归&#xff1a; y w_1x_1 w_2x_2 w_3x_3 … b 目标值只与多个…

Linux Ubuntu搭建我的世界Minecraft服务器实现好友远程联机MC游戏

文章目录 前言1. 安装JAVA2. MCSManager安装3.局域网访问MCSM4.创建我的世界服务器5.局域网联机测试6.安装cpolar内网穿透7. 配置公网访问地址8.远程联机测试9. 配置固定远程联机端口地址9.1 保留一个固定tcp地址9.2 配置固定公网TCP地址9.3 使用固定公网地址远程联机 前言 Li…

SpringSecurity6 | 登录失败后的跳转

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 循序渐进学SpringSecurity6 ✨特色专栏: MySQL学习 🥭本文内容: SpringSecurity6 | 失败后的跳转 📚个人知识库: Leo知识库,欢迎大家…

Qt/QML编程学习之心得:使用camera摄像头(35)

汽车应用中,camera起到了越来越多的作用,数字化的作用,这点无可争议,而作为GUI设计工具,如何让Camera类的应用能更好的发挥作用呢? You can use Camera to capture images and movies from a camera, and manipulate the capture and processing settings that get appl…

C#MQTT编程03--连接报文

1、报文回顾 MQTT协议中一共有14个报文&#xff0c;如下图 从上图看&#xff0c;我们要特别要注意以下3个点&#xff1a; (1)值&#xff0c;14个报文的排列&#xff0c;不是随意的&#xff0c;每个报文都有自己的值&#xff0c;而值在报文中是要用到的。后面例子会介绍到。 …

【含完整代码】Java定时任务之xxl-job[超详细]

前言 个人博客&#xff1a;www.wdcdbd.com 在Java中使用定时任务是一件很常见的事情&#xff0c;比如使用定时任务在什么时间&#xff0c;什么时候&#xff0c;去发布一些信息&#xff0c;或者去查询一些日志等相关的代码。这时&#xff0c;我们就要开发定时任务这中功能来实现…

理解TCP/IP协议

一、协议 在计算机网络与信息通讯领域里&#xff0c;人们经常提及 “协议” 一词。互联网中常用的协议有HTTP、TCP、IP等。 协议的必要性 简单来说&#xff0c;协议就是计算机与计算机之间通过网络通信时&#xff0c;事先达成的一种 “约定”。这种“约定”使不同厂商的设备…

精通业务:资深程序员的核心优势

在IT行业&#xff0c;我们常常听到关于技术实力、项目经验、团队协作等方面的讨论&#xff0c;但有一个重要因素常常被忽视&#xff0c;那就是对业务的了解。 对于资深程序员来说&#xff0c;懂业务和不懂业务之间的区别&#xff0c;犹如一道深邃的鸿沟&#xff0c;决定着他们…