学习 SpringMVC 必备的 4 大知识点

一、什么是 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.生成一个唯一 idString 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.rhkb.cn/news/178812.html

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

相关文章

【特殊矩阵的压缩存储】

文章目录 特殊矩阵的压缩存储特殊的矩阵 特殊矩阵的压缩存储 矩阵&#xff1a;一个由m x n个元素排成的m行n列的表。 矩阵的常规存储&#xff1a; 将矩阵描述为一个二维数组。 矩阵的常规存储的特点&#xff1a; 可以将元素进行随机存取&#xff1b; 矩阵运算非常简单&#xf…

linux查看文件夹使用情况以及查看文件大小

1、ls ls 命令是 Linux 中最常用的文件和目录列表命令之一。它可以显示文件的各种属性&#xff0c;包括文件大小。 ls -l <文件名>上述命令会显示文件的详细信息&#xff0c;其中包括文件的大小。文件大小以字节为单位显示&#xff0c;并且在输出中的第 5 列。4096 表示…

我做云原生的那几年

背景介绍 在2020年6月&#xff0c;我加入了一家拥有超过500人的企业。彼时&#xff0c;前端团队人数众多&#xff0c;有二三十名成员。在这样的大团队中&#xff0c;每个人都要寻找自己的独特之处和核心竞争力。否则&#xff0c;你可能会沉没于常规的增删改查工作中&#xff0…

【C++】C++11【下】lambda表达式|thread线程库

目录 1、lambda表达式 1.1 lambda表达式的引入 1.2 lambda表达式的语法 1.3 lambda表达式的原理 2、线程库 2.1thread类的介绍 2.2 线程函数参数 2.3 原子性操作库(atomic) 2.4 使用场景 应用场景1&#xff1a; 应用场景2: 应用场景3&#xff1a; 应用场景4&#xf…

在Qt中解决opencv的putText函数无法绘制中文的一种解决方法

文章目录 1.问题2.查阅资料3.解决办法 1.问题 在opencv中&#xff0c;假如直接使用putText绘制中文&#xff0c;会在图像上出现问号&#xff0c;如下图所示&#xff1a; 2.查阅资料 查了一些资料&#xff0c;说想要解决这个问题&#xff0c;需要用到freetype库或者用opencv…

Java--多线程--Thread类+Runnable接口

1.多进程与多线程 1.1多进程&#xff1a; 一个进程是一个包含自身地址的程序&#xff0c;每个独立执行的程序都称为进程&#xff0c;也就是正在执行的程序&#xff0c;系统可以分配给每个进程一段有限的使用CPU的时间&#xff08;CPU时间片&#xff09;&#xff0c;CPU在这个时…

Django实战项目-学习任务系统-查询列表分页显示

接着上期代码框架&#xff0c;6个主要功能基本实现&#xff0c;剩下的就是细节点的完善优化了。 接着优化查询列表分页显示功能&#xff0c;有很多菜单功能都有查询列表显示页面情况&#xff0c;如果数据量多&#xff0c;不分页显示的话&#xff0c;页面展示效果就不太好。 本…

pytorch 笔记:GRU

1 介绍 对于输入序列中的每个元素&#xff0c;每一层都计算以下函数&#xff1a; ht​ 是t时刻 的隐藏状态xt​ 是t时刻 的输入ht−1​ 是 t-1时刻 同层的隐藏状态或 0时刻 的初始隐藏状态rt​,zt​,nt​ 分别是重置门、更新门和新门。σ 是 sigmoid 函数∗ 是 Hadamard 乘积。…

OpenCV 笔记(4):图像的算术运算、逻辑运算

Part11. 图像的算术运算 图像的本质是一个矩阵&#xff0c;所以可以对它进行一些常见的算术运算&#xff0c;例如加、减、乘、除、平方根、对数、绝对值等等。除此之外&#xff0c;还可以对图像进行逻辑运算和几何变换。 我们先从简单的图像加、减、逻辑运算开始介绍。后续会有…

【Git企业开发】第四节.Git的分支管理策略和bug分支

文章目录 前言一、Git的分支管理策略 1.1 Fast forward 模式和--no-ff 模式 1.2 企业分支管理策略二、bug分支三、删除临时分支四、总结总结 前言 一、Git的分支管理策略 1.1 Fast forward 模式和--no-ff 模式 通常合并分支时&#xff0c;如果可能&#xff0c;Git 会…

61. 旋转链表、Leetcode的Python实现

博客主页&#xff1a;&#x1f3c6;李歘歘的博客 &#x1f3c6; &#x1f33a;每天不定期分享一些包括但不限于计算机基础、算法、后端开发相关的知识点&#xff0c;以及职场小菜鸡的生活。&#x1f33a; &#x1f497;点关注不迷路&#xff0c;总有一些&#x1f4d6;知识点&am…

基于GEE云平台一种快速修复Landsat影像条带色差的方法

这是之前关于去除遥感影像条带的另一篇文章&#xff0c;因为出版商推迟了一年发布&#xff0c;所以让大家久等了。这篇文章的主要目的是对Landsat系列卫星因为条带拼接或者镶嵌产生的条带来进行的一种在线修复方式。 原文连接 一种快速修复Landsat影像条带色差的方法 题目&a…

ffmpeg命令帮助文档

一&#xff1a;帮助文档的命令格式 ffmpeg -h帮助的基本信息ffmpeg -h long帮助的高级信息ffmpeg -h full帮助的全部信息 ffmpeg的命令使用方式&#xff1a;ffmpeg [options] [[infile options] -i infile] [[outfile options] outfile] 二&#xff1a;将帮助文档输出到文件 …

【IDEA】设置sql提示

第一步&#xff1a;注入SQL语言 1.首先选择任意一条sql语句&#xff0c;右击&#xff0c;选择 ‘显示上下文操作’ 2.选择 ‘注入语言或引用’ 3. 往下翻&#xff0c;找到MySQL 第二步&#xff1a;配置MySQL数据库连接 1.首先点击侧边的数据库&#xff0c;再点击上面的加号 2…

中兴路由器、小米路由器无线信号强度对比

最近小米新推出的路由器小米AX3000T非常火&#xff0c;在网上看到有好多人都在安利&#xff0c;引起了我的兴趣&#xff0c;刚好老家的路由器用了这么久也是时候要换一个了&#xff0c;毕竟我妈老说上网卡??所以我立马就在PDD搞了一台回来&#xff0c;打算和我现在家里用的中…

二叉树进阶 - (C++二叉搜索树的实现)

二叉树进阶 - &#xff08;二叉搜索树的实现&#xff09; 二叉搜索树1. 二叉搜索树概念2. 二叉搜索树操作2.1 二叉搜索树的查找2.2 二叉搜索树的插入2.3 二叉搜索树的删除(重点) 3. 二叉搜索树的(代码)实现 二叉搜索树 1. 二叉搜索树概念 二叉搜索树又称二叉排序树&#xff0…

腾讯云域名备案后,如何解析到华为云服务器Linux宝塔面板

一、购买域名并且进行备案和解析&#xff0c;正常情况下&#xff0c;购买完域名&#xff0c;如果找不到去哪备案&#xff0c;可以在腾讯云上搜索“备案”关键词就会出现了&#xff0c;所以这里不做详细介绍&#xff0c;直接进行步骤提示&#xff1a; 二、申请ssl证书&#xff0…

diffusers-Load adapters

https://huggingface.co/docs/diffusers/main/en/using-diffusers/loading_adaptershttps://huggingface.co/docs/diffusers/main/en/using-diffusers/loading_adapters 有几种训练技术可以个性化扩散模型&#xff0c;生成特定主题的图像或某些风格的图像。每种训练方法都会产…

关于嵌入式rtthread系统与单片机芯片

简介 我估计已经有很久没更新了&#xff0c;近一年都在某个国企里工作&#xff0c;我做的就是嵌入式工程师的岗位&#xff0c;最近才刚刚退出来&#xff0c;想来说说自己的工作使用的软件和系统。 本身进公司的时候&#xff0c;其实做的就是写单片机的板子的程序的工作&#x…

mysql迁移data目录(Linux-Centos)

随着时间的推移&#xff0c;mysql的数据量越越大&#xff0c;使用yum默认安装的目录为系统盘 /var/lib/mysql&#xff0c;现重新挂载了一个硬盘&#xff0c;需要做数据目录的迁移到 /mnt/data/。以解决占用系统盘过高情况。 1.强烈建议这种操作。镜像一个一样的Centos系统&…