Spring MVC 原理(四)

Spring MVC 原理

Spring 的模型-视图-控制器(MVC)框架是围绕一个 DispatcherServlet 来设计的,这个 Servlet会把请求分发给各个处理器,并支持可配置的处理器映射、视图渲染、本地化、时区与主题渲染等,甚至还能支持文件上传。

MVC 流程

image-20231219205147053

Http 请求到 DispatcherServlet

(1) 客户端请求提交到 DispatcherServlet。

HandlerMapping 寻找处理器

(2) 由 DispatcherServlet 控制器查询一个或多个 HandlerMapping,找到处理请求的Controller。

调用处理器 Controller

(3) DispatcherServlet 将请求提交到 Controller。

Controller 调用业务逻辑处理后,返回 ModelAndView

(4)调用业务处理和返回结果:Controller 调用业务逻辑处理后,返回 ModelAndView。

DispatcherServlet 查询 ModelAndView

(5)处理视图映射并返回模型: DispatcherServlet 查询一个或多个 ViewResoler 视图解析器,找到 ModelAndView 指定的视图。

ModelAndView 反馈浏览器 HTTP

(6) Http 响应:视图负责将结果显示到客户端。

MVC 常用注解

1、@Controller

作用:用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象,分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping 注解。

@Controller 只是定义了一个控制器类,而使用@RequestMapping 注解的方法才是真正处理请求的处理器。

单单使用@Controller 标记在一个类上还不能真正意义上的说它就是SpringMVC 的一个控制器类,因为这个时候Spring 还不认识它。

2、@RequestMapping

作用:是一个用来处理请求地址映射的注解,可用于类或方法上。

用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。RequestMapping注解有六个属性:

  • value:指定请求的实际地址
  • method:指定请求的method类型, GET、POST、PUT、DELETE等;
  • consumes:指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
  • produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
  • params:指定request中必须包含某些参数值是,才让该方法处理。
  • headers:指定request中必须包含某些指定的header值,才能让该方法处理请求。

3、@PostMapping

作用:Spring MVC新特性提供了对Restful风格的支持。

从命名约定我们可以看到每个注释都是为了处理各自的传入请求方法类型,即@GetMapping用于处理请求方法的GET类型,@ PostMapping用于处理请求方法的POST类型等。

如果我们想使用传统的@RequestMapping注释实现URL处理程序,那么它应该是这样的:@RequestMapping(value = “/get/{id}”, method = RequestMethod.GET)新方法可以简化为:@GetMapping(“/get/{id}”)

4、@Resource

作用:做bean的注入时使用,可以写在字段和setter方法上,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入。

默认按照ByName自动注入。

@Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以:

  • 如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。
  • 如果既不制定name也不制定type属性,这时将通过反射机制使用byName自动注入策略。

5、@Autowired

作用:做bean的注入时使用,可以写在字段和setter方法上,为Spring提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired;

它是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。

如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用。

6、@PathVariable

作用:用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出uri模板中的变量作为参数。@RequestMapping(value=“/users/{userId}/topics/{topicId}”)public String test( @PathVariable(value=“userId”) int userId, @PathVariable(value=“topicId”) int topicId) 如请求的URL为“控制器URL/users/123/topics/456”,则自动将URL中模板变量{userId}和{topicId}绑定到通过@PathVariable注解的同名参数上,即入参后userId=123、topicId=456。

7、@RequestParam

作用:@requestParam主要用于在SpringMVC后台控制层获取参数,类似一种是request.getParameter(“name”),它有三个常用参数:defaultValue = “0”, required = false, value = “isApp”;

defaultValue 表示设置默认值,required 通过boolean设置是否是必须要传入的参数,value 值表示接受的传入的参数类型。

8、@ResponseBody

作用:表示该方法的返回结果直接写入 HTTP response body 中,一般在异步获取数据时使用【也就是AJAX】。

比如异步获取 json 数据,加上 @ResponseBody 后,会直接返回 json 数据。

9、@RequestBody

作用:是作用在形参列表上,用于将前台发送过来固定格式的数据【xml 格式或者 json等】封装为对应的 JavaBean 对象,封装时使用到的一个对象是系统默认配置的 HttpMessageConverter进行解析,然后封装到形参上。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

还搞不懂虚短与虚断概念?虚断与虚断通俗讲解,几分钟带你搞定

在模拟电路 中,虚短和虚断是两个重要的概念,它们通常与运放电路 有关。这两个术语描述了运放电路中的一些重要现象,认识它们对 于 电子工程师 和电路设计师来说至关重要。本文将深入探讨虚短和虚断的含义,以及它们在电子电路中的应…

Java中线程状态的描述

多线程-基础方法的认识 截止目前线程的复习 Thread 类 创建Thread类的方法 继承Thread类,重写run方法实现Runnable接口,重写run方法使用匿名内部类继承Thread类,重写run方法使用匿名内部类实现Runnable接口,重写run方法使用Lambda表达式 run方法中的所有的代码是当前线程对…

LeetCode刷题---长度最小的子数组

要点:该题属于滑动窗口类型的题目 解法一:暴力破解法 使用两层for循环,i为起始位置,j为终止位置,每次j都要遍历到数组最后一个下标,并且逐个累加。当sum大于等于target时,比较获取最小的长度&am…

51单片机简易出租车计费系统仿真设计

51单片机简易出租车计费系统仿真设计( proteus仿真程序报告讲解视频) 仿真图proteus 8.9及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0036 1.主要功能: 出租车计费系统设计内容: 1、…

Burp漏洞扫描指南

burp是web渗透测试中最常用的工具之一。可以通过抓包请求,分析站点漏洞等。是安全爱好者最喜欢的工具。本文让我们一起来学习利用burp进行站点漏洞扫描。 总体而言,burp的扫描方式分为被动扫描和主动扫描两者方式。现对这两种方式进行详细的说明。注意&a…

力扣刷题记录(16)LeetCode:62、63、343、96

目录 62. 不同路径 63. 不同路径 II 343. 整数拆分 96. 不同的二叉搜索树 总结 这题比较简单,直接声明一个二维数组来保存到达该点有几种路径。到达当前点的方法由当前点的左边格子和右边格子决定。 class Solution { public:int uniquePaths(int m, int n)…

接口测试和测试用例分析

只要有软件产品的公司百分之九十以上都会做接口测试,要做接口测试的公司那是少不了接口测试工程师的,接口测试工程师相对于其他的职位又比较轻松并且容易胜任。如果你想从事接口测试的工作那就少不了对接口进行分析,同时也会对测试用例进行研…

day21二叉树(七)

day21 代码随想录 2023.12.19 1. 530二叉搜索树的最小绝对差 害,开始题目看错了,以为求的是相连节点,也就是父子节点最小绝对差,结果提交某些测试用例没通过,才发现求的是任意不同节点,这里把我写的父子节…

抖店需要多少资金?如何开通?具体流程如下!

我是电商珠珠 新手开抖店最关心的就是资金问题,在网上关于抖店的资金多少的都有,几百几千的都有。 各个回答都不一样。 另外一个问题就是怎么开通,今天我就来给大家详细的讲一下。 一、资金 入驻抖店需要办理一张个体工的营业执照&#…

NLP论文阅读记录 - AAAI-23 | 01 Cogito Ergo Summ:通过语义解析图和一致性奖励对生物医学论文进行抽象总结

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.相关工作2.1抽象概括2.2图增强摘要2.3 抽象概括的强化学习 三.本文方法COGITOERGOSUMM 框架3.1 问题陈述3.2 图表构建**事件图****AMR 图****图合并和重新连接**Model文本编码器图编码器解码器…

鸿蒙(HarmonyOS)应用开发—— video组件实操

video 组件 harmonyOS 系统提供了基础的video。下面就直接上代码 原始video 新建项目 customVideo项目 本地视频 网络地址,就不用说明,只需要把地址换成网络地址即可 在resource 文件夹下的rawfile文件夹下 添加视频 在index.ets Video({src:$rawf…

关于设计师的自我评价(合集)

设计师的自我评价篇一 本人接受过正规的美术教育,具有较好的美术功底及艺术素养,能够根据公司的需要进行设计制作,熟练掌握多种电脑制作软件,能够高效率地完成工作。本人性格开朗、思维活跃、极富创造力,易于沟通&…

JVM性能调优准备之Visual GC插件

文章目录 jvisualvm安装Visual GC插件Visual GC插件功能介绍区域划分spaces区域Graphs区域Histogram区域 oracle官方文章介绍 jvisualvm安装Visual GC插件 以管理员身份打开cmd命令行窗口查看JDK版本(Visual GC插件需要对应JDK的版本) 在cmd窗口输入 j…

揭秘`v-if`和`v-show`的区别:选择正确指令的技巧(上)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

AI抠图软件哪个好用?推荐这三款抠图工具给你

AI抠图软件哪个好用?你是否听说过AI抠图这个操作呢?简单来说,抠图就是一种对图像进行处理的技术,它的目的是将图片中的某些区域去除或者替换。比如,如果你有一张背景很杂乱的图片,你想把背景去掉&#xff0…

Leetcode—49.字母异位词分组【中等】

2023每日刷题&#xff08;六十四&#xff09; Leetcode—49.字母异位词分组 实现代码 class Solution { public:vector<vector<string>> groupAnagrams(vector<string>& strs) {unordered_map<string, vector<string>> mp;for(auto str: s…

uniapp图片上传说明

目录 1.文件上传组件 2.单文件上传 3.多文件上传 4.注意点 1.文件上传组件 前端上传组件使用uni-file-picker&#xff0c;可以自行进行下载使用。默认上传到绑定的服务空间&#xff0c;配置属性auto-upload为false关闭自动上传&#xff0c;可以限定上传的是图片还是文件&am…

【PHP入门】1.3-数据类型、转换、判断

-数据类型- 数据类型&#xff1a;data type&#xff0c;在 PHP中指的是存储的数据本身的类型&#xff0c;而不是变量的类型。 PHP是一种弱类型语言&#xff0c;变量本身没有数据类型。 1.3.1PHP的八种数据类型 在PHP中将数据分为三大类八小类&#xff1a; 简单&#xff0…

JavaSE学习笔记 Day20

JavaSE学习笔记 Day20 个人整理非商业用途&#xff0c;欢迎探讨与指正&#xff01;&#xff01; 上一篇 文章目录 JavaSE学习笔记 Day20十七、数据结构与算法17.1算法17.1.1冒泡排序17.1.2选择排序17.1.3插入排序17.1.4三个排序的区别 17.2顺序表17.2.1顺序表代码实现17.2.2顺…

JavaEE:线程池精讲

目录 一.什么是线程池 二.线程池的实现原理 &#x1f388;为什么要有工厂模式&#xff1f; 三.线程池的构造方法解读 &#x1f388;线程池的拒绝策略 四.自己实现一个线程池 一.什么是线程池 简单来说&#xff0c;线程池就好比一块鱼塘&#xff0c;鱼塘中的每条鱼就是一个线程…