学习 SpringMVC 必备的 4 大知识点

news2025/1/20 22:40:26

一、什么是 SpringMVC

前面我们了解了Spring、SpringBoot,那么 Spring MVC 又是什么呢?关于三者,我们可以这样理解:Spring MVC 是 Spring 框架的核心模块,而 Spring Boot 是 Spring 的脚手架。

Spring MVC 又称作 Spring Web MVC,是基于 Servlet API 构建的原始 Web 框架。Spring MVC 从一开始就包含在 Spring 框架中,是 Spring 框架的核心模块。

其中MVC 是一种思想,而 Spring MVC 是对 MVC 思想的具体实现。

二、MVC 架构模式

此前,我们已经对 Spring 有了足够的了解了,那么MVC是什么?
MVC 全称为 Model View Controller,它是软件工程中的一种软件架构模式,它把软件系统分为模型、视图和控制器三个基本部分。

  1. Model(模型):模型层代表应用程序的数据和业务逻辑。它负责从数据库或其他数据源中获取数据,并对数据进行处理和管理。
  2. View(视图):视图层是用户界面的呈现层,负责展示和渲染数据给用户。
  3. Controller(控制器):控制器层负责接收和处理用户的请求,并根据请求调度合适的模型和视图进行处理。

其中 MVC 模式下业务执行流程如下图所示:

  1. 首先用户的请求先到达 Controller
  2. 然后 Controller 根据请求调度 Model 层
  3. Model 层处理请求信息,并将数据结果返回给 Controller 层
  4. Controller 根据返回的结果调度 View 层
  5. View 处理结果数据,并将最终生成的页面呈现给用户

三、SpringMVC 核心功能

1、路由映射

路由映射:所谓的路由映射指的是,当用户访问⼀个 url 时,将用户的请求对应到程序中某个类的某个方法的过程就叫路由映射。

:在 SringMVC 中可以使用 @RequestMapping 来注册接口的路由映射。 @RequestMapping 即可修饰类,也可以修饰方法,当同时修饰类和方法时,访问的 url 需要同时携带类和方法的路由。

使用示例:

// @RestController 是一个组合注解,作用是设置响应主体,后续介绍
@RestController
@RequestMapping("/test")
public class TestController {
    @RequestMapping("/hello")
    public String sayHello() {
        return "hello SpringMVC!";
    }
    @PostMapping("/hello2")
    public String sayHello2() {
        return "hello SpringMVC2!";
    }
}

访问 “hello SpringMVC!” 的 url :127.0.0.1:8080/test/hello

访问 “hello SpringMVC2!” 的 url :127.0.0.1:8080/test/hello2

补充说明:

  1. 使用 @RequestMapping 注册的路由既可以处理所有的 HTTP 请求。
  2. 可以设置 @RequestMapping 注解中的 method 的值,实现处理单一请求。如:@RequestMapping(value = “/hello2”,method = RequestMethod.GET)
  3. SpringMVC 中还提供了一些指定请求类型的映射注解,例如 @GetMapping@PostMapping 等。

2、获取参数

(1)获取单个参数

    @RequestMapping("/getname")
    public void getName(String name) {
        System.out.println("name:"+name);
    }

当访问 127.0.0.1:8080/test/getname?name=lihua,或者使用 form 表单中存在一个 名称为 name 的参数时,可在方法中得到参数的值。不存在同名参数即为空。

(2)获取多个参数

    @RequestMapping("/getname")
    public void getName(String name,String pwd) {
        System.out.println("name:"+name+";pwd:"+pwd);
    }

当访问 127.0.0.1:8080/test/getname?name=lihua&pwd=123,或者使用 form 表单提交同名参数时,可在方法中得到参数的值。不存在同名参数即为空。

当我们传递多个参数的时候,我们也可以使用 对象 接收:

    @RequestMapping("/getuser")
    public void getName(User user) {
        System.out.println(user.toString());
    }

注意:当有多个参数时,在进行参数匹配时,是以参数的 名称 进行匹配的,因此参数的位置是不影响后端获取参数的结果的。未匹配到的参数默认为 null

(3)后端参数重命名
在某些场景下,我们后端接收的参数使用的 key 可能不同于前端传递的参数的 key 值。这个时候我们可以使用 @RequestParam 来重命名参数名。

    @RequestMapping("/getname")
    public void getUser(@RequestParam("n") String name, String pwd) {
        System.out.println("name:"+name+";pwd:"+pwd);
    }

:此时前端传递参数时,必须存在参数名为 n 的参数,否则会报错。这是因为@RequestParam 注解中有一个参数 required 默认为 required = true,也就是该参数必须传递。如果将其设置为 false ,获取不到则默认为 null。

(4)接收 JSON 对象

    @RequestMapping("/getjson")
    public void getJson(@RequestBody User user) {
        System.out.println(user.toString());
    }
  1. 前端通过 JSON 提交的数据,后端必须使用 @RequestBody 进行接收。
  2. 使用 @RequestBody 注解可以让 Spring MVC 自动将请求主体的内容转换为方法参数所需的对象或类型。

(5)获取URL中参数

    @RequestMapping("/geturlpart/{name}/{pwd}")
    public void getUrlpart(@PathVariable("name") String name
    ,@PathVariable("pwd") String password) {
        System.out.println("name: "+name+" ;password: "+password);
    }
  1. 其中 {name}{pwd} 是路径参数,用于从请求 URL 中获取对应的值。
  2. @PathVariable 注解表示将路径参数绑定到方法的参数上。
  3. @PathVariable 中有一个 required 参数,默认为true,即为必传。可设置为false,置为可选参数。@PathVariable(value = “pwd”, required = false)

(6)获取上传的文件

    @RequestMapping("/upload")
    public String upload(@RequestPart("myfile")MultipartFile file) throws IOException {
        // 1.生成一个唯一 id
        String id = UUID.randomUUID().toString().replace("-","");
        // 2.获取源文件后缀名
        String suffix = file.getOriginalFilename().
        substring(file.getOriginalFilename().lastIndexOf("."));
        // 3.设置文件完整保存路径
        String path = "D:/resource/"+id+suffix;
        file.transferTo(new File(path));
        return path;
    }

  1. @RequestPart("myfile") 注解用于将请求中名为 “myfile” 的二进制数据部分绑定到 MultipartFile 类型的方法参数 file 上。
  2. UUID.randomUUID().toString().replace("-", "") 这行代码的作用是生成一个不包含连字符的随机字符串ID。
  3. transferTo(File dest) 方法会将当前 File 对象表示的文件的内容拷贝到目标文件 dest 中。如果目标文件已经存在,该方法将会覆盖目标文件的内容。如果目标文件不存在,该方法将会自动创建目标文件并将内容写入其中。

(7)获取 Header
@CookieValue 注解用于将指定名称的 Header 值绑定到方法参数上。

    @RequestMapping("/getheader")
    public void header(@RequestHeader("User-Agent") String userAgent) {
        System.out.println("userAgent:"+userAgent);
    }

(8)获取Cookie
@CookieValue 注解用于将指定名称的 Cookie 值绑定到方法参数上。

    @RequestMapping("/getcookie")
    public void getCookie(@CookieValue(value = "mycookie",required = false) String mycookie) {
        System.out.println("mycookie: "+mycookie);
    }

(9)获取Session
@SessionAttribute 注解可用于从会话中获取指定名称的属性值,并将其绑定到控制器方法的参数中。

    @RequestMapping("/getsession")
    public void sess2(@SessionAttribute(value = "username",required = false) String username) {
        System.out.println("username:"+username);
    }

3、返回数据

@ResponseBody 标记方法,会将标记方法的返回值直接作为响应主体返回给客户端。 再返回的过程中 Spring MVC 将会自动将方法的返回值转换为适当的格式。

	@ResponseBody
    @RequestMapping("/get1")
    public String get1(){
        return "<h1>标题1</h1>";
    }

	@ResponseBody
    @RequestMapping("/get2")
    public User get2(){
        return new User();
    }

  1. @ResponseBody 可以用来修饰方法或者是修饰类。如果修饰类,表示类中的所有方法的返回值,都直接作为响应主体返回给客户端。
  2. @ResponseBody 标记的方法,返回的值如果是字符串,根据字符串内容会转换成 text/html,或普通 字符串。如果返回的是对象会转换成 application/json 返回给前端。
  3. @RestController = @Controller + @ResponseBody。用来修饰类。

四、请求转发和请求重定向

1、请求转发

请求转发(forward):请求转发是指服务器中的接收到客户端的请求后,将请求转发给服务器中的另一个资源进行处理,并将处理结果返回给客户端。在请求转发过程中,客户端浏览器并不知道服务器进行了转发,它认为仍然是与最初的URL进行交互。请求转发使用的是服务器内部的跳转,URL地址栏的URL不会改变。

具体实现方法:

得到转发器 request.getRequestDispatcher(“/要跳转到地址”)
调用转发器的方法: forward(request, response)

完整方法:

request.getRequestDispatcher(/url”).forward(request, response);

请求转发的特点:

  1. 请求转发是服务器的行为,不支持跨域访问,只能跳转到当前应用中的资源。
  2. 整个请求转发的过程仅涉及一次请求和一次响应。请求转发之后,浏览器地址栏中的 URL 不会发生变化,因此浏览器不知道在服务器内部发生了转发行为,更无法得知转发的次数。
  3. 参与请求转发的 Web 资源之间共享同一 request 对象和 response 对象。

2、请求重定向

请求重定向(redirect):请求重定向是指服务器接收到客户端的请求后,发送一个HTTP响应给客户端,告诉它需要重新发送一个新的请求到指定的URL。客户端收到响应后会立即发送一个新的请求到指定的URL。在请求重定向过程中,URL地址栏会显示重定向的URL。

具体实现方法:

response.sendRedirect(“访问的地址”);

请求重定向的特点:

  1. 请求重定向是客户端的行为,一大特点是支持跨域访问。
  2. 请求重定向涉及到两次请求和两次响应,第一次请求返回一个302重定向响应,客户端收到302响应后请求重定向的url收到第二次响应。
  3. 请求重定向两次请求响应分别对应不同的 request/response 对象。

3、小结

区别转发重定向
行为类型服务器行为客户端行为
浏览器地址栏URL是否发生改变
是否支持跨域跳转
请求与响应的次数一次请求和一次响应两次请求和两次响应
是否共享 request 对象和 response 对象
速度相对较快相对较慢

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

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

相关文章

Java多条件排序使用Comparator和thenComparing【包含排序List<Map<String, String>>】

Java多条件排序使用Comparator和thenComparing Comparator接口简介使用Comparator排序使用thenComparing实现多条件排序使用thenComparing排序Map 在Java中&#xff0c;对一个列表或集合进行排序时&#xff0c;经常需要基于多个条件来排序。幸运的是&#xff0c;Java提供了强大…

Rust 语言常见的一些概念(下)

目录 1、函数 参数 语句和表达式 具有返回值的函数 2、注释 文档注释 多行注释 3、控制流 3.1 if 表达式 3.2 使用esle if 处理多重条件 3.3 在 let 语句中使用 if 3.4 使用循环重复执行 使用 loop 重复执行代码 从循环中返回值 循环标签&#xff1a;在多个循环…

机器学习中的嵌入:释放表征的威力

简介 机器学习通过使计算机能够从数据学习和做出预测来彻底改变了人工智能领域。机器学习的一个关键方面是数据的表示&#xff0c;因为表示形式的选择极大地影响了算法的性能和有效性。嵌入已成为机器学习中的一种强大技术&#xff0c;提供了一种捕获和编码数据点之间复杂关系的…

LeetCode1518 换水问题

题目描述 超市正在促销&#xff0c;你可以用 numExchange 个空水瓶从超市兑换一瓶水。最开始&#xff0c;你一共购入了 numBottles 瓶水。 如果喝掉了水瓶中的水&#xff0c;那么水瓶就会变成空的。 给你两个整数 numBottles 和 numExchange &#xff0c;返回你 最多 可以喝…

人工智能基础_机器学习015_BGD批量梯度下降代码演示_在批量梯度下降中使用逆时衰减---人工智能工作笔记0055

然后我们用代码来演示一下BGD批量梯度下降,首先启动jupyter notebook 然后我们新建一个文件 新建文件夹,然后新建一个python文件 然后我们这里用一元一次方程进行批量梯度下降. import numpy as np 导入数学计算包 X = np.random.rand(100,1) `np.random.rand(100, 1)` 是…

【每日一题】2103. 环和杆-2023.11.2

题目&#xff1a; 2103. 环和杆 总计有 n 个环&#xff0c;环的颜色可以是红、绿、蓝中的一种。这些环分别穿在 10 根编号为 0 到 9 的杆上。 给你一个长度为 2n 的字符串 rings &#xff0c;表示这 n 个环在杆上的分布。rings 中每两个字符形成一个 颜色位置对 &#xff0c…

【AUTOSAR】【以太网】DoIp

AUTOSAR专栏——总目录_嵌入式知行合一的博客-CSDN博客文章浏览阅读217次。本文主要汇总该专栏文章,以方便各位读者阅读。https://xianfan.blog.csdn.net/article/details/132072415 目录 一、概述 二、功能描述 2.1 Do

06_es分布式搜索引擎2

一、DSL查询文档 1.DSL查询分类 ①查询所有&#xff1a;match_all ②全文检索&#xff1a;利用分词器对用户输入的内容分词&#xff0c;倒排索引去匹配 match_query multi_match_query ③精确查询&#xff1a;根据精确词条查找数据&#xff0c;查找的是keyword,数值,日期,b…

BUCK、BOOST、BUCK-BOOST电路原理分析

一、前导 DC-DC DC-DC电源&#xff0c;即直流-直流变换器&#xff0c;是指将一个固定的直流电压变换为可变的直流电压&#xff0c;也称为直流斩波器。DC-DC有多种拓扑结构&#xff0c;如BUCK&#xff08;降压&#xff09;、BOOST&#xff08;升压&#xff09;、BUCK-BOOST&…

基于EPICS stream模块的直流电源的IOC控制程序实例

本实例程序实现了对优利德UDP6720系列直流电源的网络控制和访问&#xff0c;先在此介绍这个项目中使用的硬件&#xff1a; 1、UDP6721直流电源&#xff1a;受控设备 2、moxa串口服务器5150&#xff1a;将UDP6721直流电源设备串口连接转成网络连接 3、香橙派Zero3&#xff1a;运…

绿色通道 快速理赔,渤海财险用实干书写服务品牌

7月底&#xff0c;受台风“杜苏芮”影响&#xff0c;北京市连续强降雨&#xff0c;西部、西南部、南部遭遇特大暴雨&#xff0c;房山、门头沟、丰台等地陆续出现山洪暴发现象。      灾害无情人有情&#xff0c;为更好地保障人民群众生命财产安全&#xff0c;渤海财险北京分…

【PWN · 栈迁移|off-by-one|伪随机|爆破】[HDCTF 2023]Makewish

一道精巧、包含很多要点的题目 一、题目 二、思路浅析 通过ctypes酷通过伪随机数检测&#xff0c;没用srand指定随机种子时&#xff0c;默认srand(1)。 通过puts_name的off-by-one来泄露canary 进入vuln时&#xff0c;发现只能刚好填充到rbp前面&#xff0c;但是会将最后一个…

虚拟机设置linux系统固定网络IP

文章目录 虚拟机设置linux系统固定网络IP1.设置虚拟机网络ip2.windows网络适配器设置1.windows112.其他windows版本 3.linux系统IP设置 虚拟机设置linux系统固定网络IP 1.设置虚拟机网络ip 2.windows网络适配器设置 1.windows11 2.其他windows版本 后面设置内容参考windows11…

基于OrangePi Zero 2实现垃圾分类智能垃圾桶项目(11)将指令来源和次数保存到数据库中(SQLite),指令来源和发出时间以及垃圾类型保存在文件中

SQLite&#xff08;嵌入式数据库&#xff09; 概念&#xff1a; 一种轻量级的关系型数据库管理系统&#xff0c;可以在应用程序中作为一个单独的组件运行&#xff0c;因此也被称为嵌入式数据库。与传统的客户端-服务器架构不同&#xff0c;SQLite 数据库存储在单个文件中&…

虹科案例 | AR内窥镜手术应用为手术节约45分钟?

相信医疗从业者都知道&#xff0c;在手术室中有非常多的医疗器械屏幕&#xff0c;特别是内窥镜手术室中医生依赖这些内窥镜画面来帮助病患进行手术。但手术室空间有限&#xff0c;屏幕缩放位置相对固定&#xff0c;在特殊场景下医生观看内窥镜画面时无法关注到病患的状态。这存…

axios 实现请求 loading 效果

前景提要&#xff1a; ts 简易封装 axios&#xff0c;统一 API 实现在 config 中配置开关拦截器 loading 分为全屏 loading 和局部 loading。 axios 中设置 loading 只能设置全屏 loading&#xff0c;因为局部 loading 需要当前局部的 dom&#xff0c;在 axios 中显然拿不到发…

数据结构:排序干货!(7大排序汇总+快速排序的优化+计数排序+基数排序+桶排序)

目录 概念 插入排序 直接插入排序 希尔排序 选择排序 直接选择排序 双向选择排序 堆排序 交换排序 冒泡排序 快速排序 Hoare法 挖坑法 前后指针法 快排的优化 三数取中法 非递归快排 归并排序 分治算法二路归并 非递归归并 应用 排序总结 其他排序 计数…

记一次有趣的免杀探索

文章目录 前记查杀排查源码修改免杀效果测试 前记 evilhiding昨天被提issue不能绕过火绒了&#xff0c;于是今天更新了evilhiding v1.1&#xff0c;已经可以继续免杀了。 期待各位的stars&#xff0c;项目地址如下&#xff1a; https://github.com/coleak2021/evilhiding查杀…

【OJ比赛日历】快周末了,不来一场比赛吗? #11.04-11.10 #10场

CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…&#xff09;比赛。本账号会推送最新的比赛消息&#xff0c;欢迎关注&#xff01; 以下信息仅供参考&#xff0c;以比赛官网为准 目录 2023-11-04&#xff08;周六&#xff09; #2场比赛2023-11-05…

科技云报道:大模型会给操作系统带来什么样的想象?

科技云报道原创。 在人工智能的发展历程中&#xff0c;大模型的出现标志着一个里程碑。 特别是近年来&#xff0c;诸如GPT-4、BERT等大模型的出现&#xff0c;不仅在自然语言处理、图像识别等领域取得了令人瞩目的成就&#xff0c;还推动了人工智能技术向更广泛的应用场景拓展…