SpringMVC 第一次复学笔记

news2024/9/21 16:42:42

        服务器启动时,创建spring容器;dispatcherServlet启动时,直接创建springmvc容器初始化一次,实现了springmvc和spring的整合。

SpringMVC里的组件

        处理器映射器(HandlerMapping)负责匹配映射路径对应的Handler,返回可执行的处理器链对象HandlerExecutionChain对象。

        处理器适配器(HandlerAdapter)负责匹配HandlerExecutionChain对应的适配器进行处理器调用,返回视图模型对象

        视图解析器(ViewResolver)负责对视图模型对象进行解析。

三者简而言之的职责就是定位,执行,跳转。

@RequestParam的属性

        value是对应的参数名;required是是否必须,默认为false,如果为true的话,将必须填写该参数,若没有则报错;defaultValue是默认参数值;

        还有特别注意用基本类型接收不能为空,所以一般用包装类去接收参数

文件上传

@RequestHeader

        @RequestHeader加参数获取指定的请求头数据,不加获取所有的请求头数据

@CookieValue

        @CookieValue获取客户端携带的Cookie数据,比@RequestHeader更深了一层

@RequestAttribute

        直接从request域里获取数据,相当于getAttribute

注意

        HttpServletRequest和HttpServletResponse这种不需要去加注解注入,直接加到局部变量上即可,若发现局部变量上有这种参数,springMVC会帮其自动注入。

        无论是<mvc:resources>还是<mvc:default-servlet-handler>标签都会向容器内注入一个handlerMapping,会覆盖掉本身的handlerMapping。导致@RequestMapping这种映射注解无法解析,所以需要手动配置一个handlerMapping的Bean,覆盖这个覆盖。

        <mvc:annotation-dirven>标签会自动注册RequestMappingHandlerMapping、注册RequestMppingHandlerAdapter并注入Json消息转换器等

        转发使用return “forward:/index.jsp”的形式,重定向使用return “redirect:/index.jsp”,ModelAndView的形式如下:

@ResponseBody

        @ResponseBody可以通知SpringMVC把它当作响应体的方式做出响应,而不是视图。

Interceptor

    Interceptor和Filter比较

        流程先过filter再到DispatcherServlet再分发到具体的Controller,Filter是javaweb的原生技术,可以拦截一切请求并过滤,早于任何Servlet;Interceptor属于SpringMVC技术,只能拦截进入了SpringMVC的请求,主要拦截Controller请求,晚于DispatcherServlet执行。

    Interceptor的接口方法

        preHandle对拦截到的请求进行预处理,返回true放行执行处理器方法,false表示不放行。参数:Handler是拦截到的Controller方法。

        postHandle可以对controller之后执行,对拦截到的请求进行后处理,比如对模型数据和视图等进行修改。参数:Handler是拦截到的Controller方法,modelAndView是返回的视图模型对象。

        afterCompletion在视图渲染完后(整个流程完毕之后),进行最后的处理,若请求流程中有异常,可以处理异常对象。参数:Handler是拦截到的Controller方法,ex是异常对象。

        执行顺序类似一个双向链表,先从前往后,1(pre) ~> 2 (pre) ~> 3 (pre) ~> 3(post) ~> 2(post) ~> 1(post) ~> 3(after) ~> 2(after) ~> 1(after),就是先是从头节点next到最后, 然后再after到最前面。

        注意:当前的after执不执行只和当前的preHandle的返回结果有关系,为false,则不执行,post的执不执行在于是否接收到了controller的执行结果,有一个pre为false,都将导致链路上的所有post都无法执行。举个例子若在3处pre返回false,,流程就变成  1(pre) ~> 2 (pre) ~> 3 (pre) ~> 2(after) ~> 1(after)

@EnableWebMvc注解解析

        @EnableWebMvc  =  mvc的注解驱动(加mapping,adapter等等bean) +  注册静态资源处理器   配置拦截器。

        注解驱动实现直接是使用@Bean注解注入了所需要的bean,处理器和拦截器则是通过自动注入WebMvcConfigurer类型的集合,来搜寻容器中WebMvcConfigurer类型的bean,通过实现WebMvcConfigurer重写它的一系列方法。

全注解原理

        在servlet3.0环境中,web容器提供了一个接口,实现了该接口后,就会在对应的类加载路径的META-INF/services目录里创建一个该接口全限定名的配置文件,指定该接口的实现类使用全限定名的方式,然后web容器启动后就会运行该实现类,完成一些初始化操作。

        然后Spring就对此特性进行了实现,所以我们只需要去实现Spring提供好的抽象类并重写其中的一些方法即可,比如:Spring容器创建配置类的配置,SpringMVC容器创建配置类的配置,映射路径配置等。

DispatcherServlet

        dispatcherServlet初始化主要是获得了一个SpringMVC的容器,并设置了一个parent就是Spring容器,若没有这个SpringMVC容器就会去创建;还有通过监听,继承等机制最终实现了九大组件的Bean注入。

        那HandlerMapping组件举例,他的注册流程就是检查Spring容器内有没有HandlerMapping类型的Bean,若有则注册已经有的。若没有,则注册默认的。

        发请求的时候,最终调用doDispatch方法,里面调用了getHandler方法,就是去遍历HandlerMapping集合,去用HandlerMapping执行一个方法去获得一个Handler,然后使用这个Handler根据条件(作用范围等)组装成一个Interceptor链并和handler组成一个Chain对象并返回。若获得不到Handler就用下一个HandlerMapping,这就实现了静态资源,接口的访问隔离,即使用不同的HandlerMapping去处理。若得到了Handler就直接方法返回了这个Chain。

        注意:HandlerAdaptar只会去执行目标方法,而不会去执行前后置方法,前后置方法由HandlerMapping去调用,因为它里面有拦截器链可以完成该操作。通过传参可以知道HandlerAdaptar执行目标方法必须需要HandlerMapping的前置条件,因为执行方法需要一个handler,在源码中恰恰是mappedHandler.getHandler()形式存在的,可以知道这个HandlerAdaptar所使用的handler是从HandlerMapping里获取的。

异常处理

        SpringMVC的异常处理主要有以下三种方式:

        简单异常处理器:使用SpringMVC中内置的异常处理器去处理SimpleMappingExceptionResolver,直接去注册Bean即可。

        自定义异常处理器:要去实现HandlerExceptionHandler,自定义异常去处理。它更加丰富参数上有request,response域等。

        注解方式:使用@ControllerAdvice + @ExceptionHandler 来处理。要返回JSON格式数据的话可以直接结合@ResponseBody或者直接使用组合注解@RestControllerAdivece。

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

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

相关文章

小琳Python课堂:Python全局解释器锁(GIL)的深入解析与应用

小琳Python课堂开讲啦&#xff01;今天我们来深入探讨Python中的一个重要概念——全局解释器锁&#xff08;GIL&#xff09;。&#x1f512; 技术细节角度 单线程执行保证&#xff1a;GIL确保了在任何时刻只有一个线程在执行Python字节码。互斥锁实现&#xff1a;GIL通过在解…

无人机之发动机篇

一、无人机发动机的分类 无人机发动机根据工作原理和应用场景的不同&#xff0c;主要分为以下几类&#xff1a; 电动马达&#xff1a; 特点&#xff1a;清洁、高效、体积小巧、重量轻便、噪音低、对环境影响小。 应用&#xff1a;多用于小型或微型无人机&#xff0c;因其续航…

Nature Microbiology|WISH标签技术:评估微生物组中单株水平的种群动态

微生态研究搞了n多年&#xff0c;益生菌还是那么几个&#xff0c;为什么&#xff1f; 一个共识是单一菌株的添加往往难以解决复杂问题。微生物群体的相互作用和平衡不应被忽视。实际上&#xff0c;我们需要在群体层面进行添加或干预&#xff0c;才能真正发挥益生菌的作用。然而…

AD原理图无法输入中文的问题及解决办法

电脑系统&#xff1a;Windows 11 专业版 AD版本&#xff1a;20.0.14 解决方法&#xff1a; 方法1、在word打好&#xff0c;复制到AD 方法2、尝试快捷键ctrlshift、ctrl空格、windows空格

超声波眼镜清洗机有用吗?清洁力好的超声波清洗机推荐

在当今快节奏的生活中&#xff0c;维持良好的卫生状况已成为日常不可或缺的一部分&#xff0c;尤其对于追求高品质生活方式的人来说更为重要。因此&#xff0c;选择一款高效便捷的超声波清洗机成为了提升居家清洁体验的理想方案。面对市面上琳琅满目的品牌&#xff0c;甄选出既…

24全网最全stable diffusion模型讲解!快来!!新手必收藏!!

前言 手把手教你入门绘图超强的AI绘画程序Stable Diffusion&#xff0c;用户只需要输入一段图片的文字描述&#xff0c;即可生成精美的绘画。给大家带来了全新Stable Diffusion保姆级教程资料包&#xff08;文末可获取&#xff09; AI模型最新展现出的图像生成能力远远超出人…

扫雷游戏(上)

开学快乐 今天我们来写扫雷的代码 一、了解扫雷是怎么玩儿的 首先这里放一个扫雷游戏的链接扫雷游戏网页版 - Minesweeper 然后我们点进去耍了一阵&#xff0c;发现扫雷首先要有一个棋盘&#xff0c;然后在玩家不知道的情况下设置雷在不同的格子&#xff0c;玩家点到雷就炸死…

arm调试-- gdb与gdbserver的安装与使用

一、安装 1.下载gdb源码 https://ftp.gnu.org/gnu/gdb/gdb-7.11.1.tar.gz 2. 解压编译gdb以及gdbserver (1)gdb PC端 tar -zxvf gdb-7.11.1.tar.gz cd gdb-7.11.1 mkdir _install ./configure --targetaarch64-linux-gnu --disable-werror --prefix/home/jinhao/gdb-7.1…

Maven聚合与继承

聚合 当我们一次想要构建多个项目时&#xff0c;而不是到每一个模块的目录下分别执行mvn命令。这个时候就需要使用到maven的聚合特性 这里第一个特殊的地方是packaging&#xff0c;值设置为pom。我们正常开发的其他模块中都没有声明packaging&#xff0c;默认使用了默认值jar&a…

Android Studio 最新版本保姆级安装使用教程

Android Studio 2024 最新版本保姆级安装使用教程 1、官网下载2、安装Standard默认配置Custom配置 3、视频教程 这里是Android Studio 2024最新版本保姆级安装教程&#xff0c;高级版本基本上通用~ Android 是为世界各地的所有用户打造的&#xff0c;无论从设计、功能还是整体价…

操作系统面试真题总结(五)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 线程切换要保存哪些上下文&#xff1f; 当发生线程切换时&#xf…

8、Django Admin后台中添加Logo

在项目settings.py文件 # 导入os&#xff0c;并且修改DIRS内容如下所示 import os TEMPLATES [{BACKEND: django.template.backends.django.DjangoTemplates,DIRS: [os.path.join(BASE_DIR, templates/)],APP_DIRS: True,OPTIONS: {context_processors: [django.template.con…

Mudo03 vscode配置相应的文件的搜索路径,库文件的搜索路径以及想要的链接库

使用muduo库&#xff0c;需要链接libmuduo_base.so、libmuduo_net.so 、libpthread.so VScode上如何配置相应的头文件的搜索路径&#xff1f;库文件的搜索路径&#xff1f; 文件的搜索路径&#xff1a; -I&#xff1a;头文件搜索路径 -L&#xff1a;库文件搜索路径 -Imuduo_ne…

docker安装nginx1.27.0

关于拉取不到镜像问题可以到这篇文章进行镜像配置 一、docker拉取nginx1.27.0镜像 docker pull nginx:1.27.0二、创建映射容器的文件目录 mkdir -p -m 777 /mydata/nginx/conf/conf.d mkdir -p -m 777 /mydata/nginx/log mkdir -p -m 777 /mydata/nginx/html 三、创建文件de…

IDEA下载及安装教程(24年7月更新)

IDEA全称IntelliJ IDEA&#xff0c;是由JetBrains公司开发的用于Java编程设计的软件&#xff0c;是一款高效的IDE工具&#xff0c;也是许多Java开发者喜爱的开发工具&#xff0c;具有全行代码补全功能和兼容性与可拓展性&#xff0c;同时也具有较高的使用度与知名度。今天&…

物业|基于SprinBoot+vue的物业管理系统(源码+数据库+文档)

物业管理系统 基于SprinBootvue的物业管理系统 一、前言 二、系统设计 三、系统功能设计 系统登录实现 后台模块实现 管理员模块实现 物业管理模块实现 业主模块实现 维修员模块实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、…

【数学建模国赛思路预约】2024高教社杯全国大学生数学建模竞赛助攻——思路、可运行代码、成品参考

2024年全国大学生数学建模大赛马上就要开始了&#xff0c;大家有没有准备好呢&#xff0c;今年将会和之前一样&#xff0c;将会在比赛赛中时期为大家提供比赛各题的相关解题思路、可运行代码参考以及成品论文。 一、分享计划 1、 赛中分享内容包括&#xff08;2023国赛为例&am…

Windows cmd 输入 Python 弹出应用商城

文章目录 1 使用场景1.1 打开 "运行" 窗口1.2 输入 Python&#xff0c;弹出 Windows 应用商城 2 解决办法2.1 打开 "管理应用执行别名"2.2 取消勾选2.3 验证 1 使用场景 1.1 打开 “运行” 窗口 快捷键&#xff1a;Win r&#xff0c;并输入 cmd 1.2 输入…

Dubbo学习圣经:从入门到精通 Dubbo3.0 + SpringCloud Alibaba 微服务基础框架

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格&#xff0c;并且拿了很多大厂offer。 其中 SpringCloud 工业级底座 &#xff0c;是大家的面试核心&…

Qt:玩转QPainter后转之时钟(步骤详细、包含源码)

前言 简单了解了QPainter之后当然是要找两个例子练练手啦。 正文 先看效果图 在绘制之前我们要先构思好自己要绘制的对象可以分成几部分&#xff0c;比如我要绘制时钟的话&#xff0c;我可以分成&#xff1a;外边框(圆环或者圆)&#xff0c;圆形背景&#xff0c;刻度&…