SpringMVC 学习博客记录

文章目录

  • 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 {@Autowiredprivate CustomInterceptor customInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(customInterceptor)  // 添加拦截器.addPathPatterns("/**")          // 配置拦截请求url( ** 表示拦截所有请求url).excludePathPatterns("/hello"); // 排除某些不需要拦截的请求url(即带有/hello请求不会被拦截)}
}

WebMvcConfigurer重要的方法 :

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

addResourceHandlers 示例:

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

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

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

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

相关文章

文件上传进阶绕过技巧(一)和靶场实战

★★免责声明★★ 文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与学习之用,读者将信息做其他用途,由Ta承担全部法律及连带责任,文章作者不承担任何法律及连带责任。 0、环境准备 请移步《文件上传靶场实战:upl…

数据库的数据会存到文件中

数据库的数据会存到文件中。文件就是操作系统对磁盘block的映射。 文件/块在开头有元数据,包含eof的位置,recode的数量,每个recode的长度。 聚集索引和数据放在一起,索引就是数据主键。 而非聚集索引在另一个地址中单独存储&…

从零学Java 泛型

Java 泛型 文章目录 Java 泛型1 什么是泛型?2 泛型类3 泛型接口4 泛型方法5 泛型集合 Collection 工具类 1 什么是泛型? Java泛型是JDK1.5中引入的一个新特性,其本质是参数化类型,把类型作为参数传递。 常见形式有泛型类、泛型接口、泛型方法。 语法…

SPI接口协议

SPI接口协议 SPI(Serial Peripheral Interface)是由Motorola公司定义的接口协议标准,串行外设接口(SPI)是微控制器和外围IC(如传感器、 ADC、 DAC、移位寄存器、 SRAM等)之间使用最广泛的接口之一。SPI是一种同步、全双工、主从式接口&#x…

你了解计算机网络的发展历史吗?

1.什么是计算机网络 计算机网络是指将一群具有独立功能的计算机通过通信设备以及传输媒体被互联起来的,在通信软件的支持下,实现计算机间资源共享、信息交换或协同工作的系统。计算机网络是计算机技术与通信技术紧密结合的产物,两者的迅速发展…

Lua调用dll(C#)的代码示例

以下是一个简单的示例,演示如何在Lua中调用.NET Framework的DLL。请注意,这个示例假设你已经安装了Lua和.NET Framework,并且有一个名为"MyDll.dll"的.NET DLL。 首先,创建一个名为"MyDll.cs"的C#文件&#…

11853 - Paintball (UVA)

题目链接如下: Online Judge 这道题挺可惜,我思路其实就差了一点点没想出来,还是看了uva 11853 paintball(好题)——yhx_yhx. live-CSDN博客 这里的文字部分才最终写出来。 dfs版本代码如下: #include …

C++系列十五:字符串

字符串 1 、创建和初始化C字符串2. C字符串的常用操作3. C字符串处理函数4. C字符串在实际开发中的应用 C中的字符串是由字符组成的序列。字符串常用于处理文本数据,例如用户输入、文件内容等。C标准库提供了一个名为std::string的类,用于表示和处理字符…

递归——简单粗暴的问题解决方式

相信很多人在刚接触算法时都在递归上栽过跟头(包括我),但是在掌握了这项技能后会有种豁然开朗的感觉! 我用我自己! 怎么会有这么优雅而又简单粗暴的解决问题的方法! \color{red}{怎么会有这么优雅而又简单…

爬虫之牛刀小试(三):爬取中国天气网全国天气

天气网: import requests from bs4 import BeautifulSoup import time from pyecharts.charts import Bar from pyecharts import options as optsurl_hb http://www.weather.com.cn/textFC/hb.shtml url_db http://www.weather.com.cn/textFC/db.shtml url_hd …

Java SE入门及基础(6)

运算符 1.常规运算符( - * /) 示例 /** * 运算符操作 - * / */ public class Example2 { public static void main ( String [] args ) { //变量在使用之前必须完成初始化操作。换言之就是给变量赋值。 // int a, b; // a 5; // b …

跨境电商之店群模式:Shopee店群是什么?卖家如何做好店群?

今天跟大家谈一谈越来越火爆的店群模式,现在大部分做跨境电商的卖家都会建立自己的店群,其中很多做 Shopee的卖家时常会听到一个名词“ Shopee 店群模式”,但很多人都不知道怎么去做,或者在犹豫要不要做,所以东哥我会从…

mac上cmake编译的库A,给其他库B使用报错ld64.lld: error

ld64.lld: error xxxx.a(xxx.c.o) has version 13.5.0, which is newer than target minimum of 10.11.0 根本原因: 在mac上编译库B时,macosx-version-min为10.11,即macosx sdk的最低版本 所以要求cmake编译的库A也应该指定macosx-version-…

谈谈Spring Bean

一、IoC 容器 IoC 容器是 Spring 的核心,Spring 通过 IoC 容器来管理对象的实例化和初始化(这些对象就是 Spring Bean),以及对象从创建到销毁的整个生命周期。也就是管理对象和依赖,以及依赖的注入等等。 Spring 提供…

【Web】CTFSHOW PHP文件包含刷题记录(全)

温故知新。 目录 web78 web79 web80 web81 web82 web83 web84 web85 web86 web87 web88 web78 伪协议base64编码直接读出文件内容就行 ?filephp://filter/convert.base64-encode/resourceflag.php web79 一眼data伪协议包含php脚本 ?filedata://text/plain,<…

算法初学者指南:理解排序算法

前言 排序是计算机科学中的基本问题之一&#xff0c;也是数据处理的核心步骤。从最简单的个人项目到复杂的工业级应用&#xff0c;排序都扮演着关键角色。本文将介绍四种常见的排序算法&#xff1a;冒泡排序、插入排序、快速排序和堆排序&#xff0c;旨在帮助算法初学者理解这些…

Netty-Netty组件了解

EventLoop 和 EventLoopGroup 回想一下我们在 NIO 中是如何处理我们关心的事件的&#xff1f;在一个 while 循环中 select 出事 件&#xff0c;然后依次处理每种事件。我们可以把它称为事件循环&#xff0c;这就是 EventLoop 。 interface io.netty.channel. EventLoo…

数据结构栈、队列、链表、散列表

栈&#xff08;stack&#xff09; 栈&#xff08;stack&#xff09;是限制插入和删除只能在一个位置上进行的表&#xff0c;该位置是表的末端&#xff0c;叫做栈顶&#xff08;top&#xff09;。它是后进先出&#xff08;LIFO&#xff09;的。对栈的基本操作只有 push&#xf…

刷题第十六天-扰乱字符串

扰乱字符串 题目要求 解题思路 初步分析 给定两个字符串T和S&#xff0c;假设T是由S变换而来的 如果T和S长度不一样&#xff0c;必定不能变来如果长度一样&#xff0c;顶层字符串S能够划分 S 1 S_1 S1​和 S 2 S_2 S2​&#xff0c;同样字符串T也能够划分为 T 1 T_1 T1​和…

uniapp、vue、小程序常用的一些验证规则校验方法(例如:手机号。身份证、金额等)

例如&#xff1a; 检查是否为空数组 、是否是空 不为空false 为空true、校验密码、校验手机号格式、校验邮箱格式、校验身份证号格式、校验值长度 不少于6位数、 电话号码加密 15288889999 转化为 152****9999、身份证号码加密、验证输入重量、金额等类型 例如 0.11 2.23…