揭开Spring MVC的真面目

官方对于Spring MVC的描述为:

Spring Web MVC是基于Servlet API框架构建的原始Web框架,从一开始就包含在Spring框架中。它的正式名称“Spring Web MVC”来自其源模块的名称(Spring-webmvc),但它通常被称为“Spring-MVC”。

目录

Spring MVC 介绍

学习Spring MVC

连接

@RequestMapping

指定类型

获取参数

获取对象

参数重命名(参数映射)

接收Json对象

从URL中获取参数

上传文件

获取Cookie

获取Session

获取Header

​编辑

请求定向和请求转发


Spring MVC 介绍

MVC 是Model View Controller的缩写,是软件工程中的一种软件架构模式,它把软件系统分成模型、视图和控制器三个部分。

MVC是一种思想,而Spring MVC是对MVC思想的具体实现:

Spring MVC是一个实现了MVC模式,并继承了Servlet API的Web框架。既然是Web框架,那么当用户在浏览器中输入了url之后,我们的Spring MVC项目就可以感知到用户的请求。

现在绝大多数的Java项目都是基于Spring 或Spring Boot,而Spring的核心就是Spring MVC。

在创建Spring Boot项目时,我们勾选的Spring Web框架其实就是Spring MVC框架:

学习Spring MVC

学习Spring MVC需要掌握三个功能:

连接、获取参数、输入数据。

连接

在项目创建好之后,创建一个UserController类,实现用户到Spring程序的互联互通:

我们用到了三个注释:@Controller @ResponseBody @RequestMapping

@Controller:五大类注解,表示把这个类添加到IoC容器中,供Spring拿到。

@ResponseBody:表示把这个Java对象转换成json格式相关的内容,表示返回非页面数据

通过@RestController = @Controller + @ResponseBody 可以完成两个注释的内容合二为一。

@RequestMapping

@RequestMapping既可以修饰类也可以修饰方法,当修饰类和方法时,访问的地址是类 + 方法。

并且也可以直接修饰方法。

指定类型

@RequestMapping可以为GET方法也可以为POST方法,如果不规定则两个方法都可以用。但如果要求只能是POST或者只能是GET方法呢?

想只要GET方法,有两种写法:

  • @RequestMapping(value = "/user",method = RequestMethod.GET)
  • @GetMapping("/index")

想只要POST方法,有两种写法:

  • @RequestMapping(value = "/user",method = RequestMethod.POST)
  • @PostMapping("/user")

获取参数

在Spring MVC中可以直接用方法中的参数来实现传参,相比于Servlet中大费周折的getParameter等方式简单了很多。

在Spring MVC中,只需要方法的形参和前端传入的变量名相同,就能够直接获取到相关的参数。

获取对象

Spring MVC可以自动实现参数对象的赋值:

并且当有多个参数的时候,前后端匹配数据的时候以名称进行匹配的,因此参数的位置不影响后端获取的参数的结果。

参数重命名(参数映射)

和前面提到的一样,如果前后端名称不一样但是想要获取到匹配的数据,此时可以使用@RequestParam 来重命名前后端的参数值。

例如,前端传来的参数为username,但是后端为name,此时给后端参数重命名:

并且如果某个参数是非必传参数的话,可以设置@RequestParam中的requird=false来避免不传递时报错:

接收Json对象

这次我们不用表单的形式来传对象,而是使用Json的格式来传递对象。只有使用了@RequestBody后才能正确的把对象解析出来。

从URL中获取参数

对于前面的通过表单的形式拿数据,主要是通过URL中?后面的值来传递。现在还有一种方式可以传递,就是通过@PathVariable直接拿到URL中的参数。

例如:  localhost:8080/user/123/zhangsan/123456

这种方式和问号后面加上数据相对比有两个优点:

1.对于搜索引擎来说,抓取关键字权重更高

2.URL更简洁

@RequestMapping时需要加上相应的属性,在传递形参的时候使用@PathVarable来获取,如果传递的参数和属性名不同时,也可以使用重命名。

如果RequestMapping和形参名称不一样就可以使用@PathVarable的重命名来表示。

  • @PathVariable ->基础URL里面的参数(?之前的参数)
  • @RequestParm->URL参数部分的参数(?之后的参数)

上传文件

使用@RequestPart来上传文件。

之后使用Postman来模拟前端发来的图片:

在新文件的地址中,可以看到新的文件已经生成。但是有几个问题,比如这样重复一次,新文件会覆盖旧文件。并且不能重命名文件。

最靠谱的保证文件名唯一的命名方法,是使用UUID。简单说这个UUID是不会重复的。

UUID是Universally Unique Identifier的缩写,它是在一定的范围内(从特定的名字空间到全球)唯一的机器生成的标识符。

首先我们要解决文件格式的问题。之前我们使用的是png,如果原文件是jpg还好说,如果是gif等就会出错。所以我们需要获取原生的文件名,把文件名的前部分使用UUID替换,文件名的后缀截取到再重命名。

这样即使是上传同样的文件,也不会覆盖之前的文件。

@RestController
public class UserController {@RequestMapping("/upload")public Object upload(@RequestPart("myimg") MultipartFile file){String fileName = UUID.randomUUID()+file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));File saveFile = new File("C:\\MyCode\\" + fileName);try {file.transferTo(saveFile);return true;} catch (IOException e) {e.printStackTrace();}return false;}
}

获取Cookie

在之前的Servlet中,我们已经使用过HttpServletResponse和HttpServletRequest来获取cookie,我们现在使用更简单的方法获取:

通过@CookieValue注解来把获取到的cookie得到,代码中重命名的是java,所以当我们自己伪造一个名字为java的cookie后就可以获取到。

获取Session

通过@SessionAttribute来方便的获取到Session。

获取Header

使用@RequestHeader获取到Header。

请求定向和请求转发

请求转发和请求重定向有什么区别? | Javaᶜⁿ 面试突击 (javacn.site)

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

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

相关文章

数组和链表部分例题(力扣)

1.数组 1.1 合并一个数组的两个有序区间 public class MargTwo {public static void main(String[] args) {int[] arr1{1,5,6,2,4,10,11};int[] arr2new int[arr1.length];marg2(arr1,0,2,3,6,arr2);}private static void marg2(int[]arr1,int iStar,int iEnd,int jStar,int j…

Flutter 状态管理之GetX库

Flutter 状态管理之GetX 前言正文一、创建项目二、状态组件三、状态更新UI四、GetX库① 添加依赖② 局部刷新③ 全局刷新 五、源码 前言 Flutter使用的是声明式UI,是通过状态去更新UI组件的,因此我们首先就要学习状态的使用。同样为了简化原本的状态使用…

剖析组件应用市场的安装

java运维管理平台怎么支持组件的安装呢?怎么能够达到和应用市场一样的效果呢?效果图如下: 应用商店支持的组件列表: 应用商店组件的安装: 1.组件包的制作 1.1 组件包结构 package:用于存放实际组件包…

【MySQL进阶】SQL优化

文章目录 SQL 优化主键优化数据组织方式页分裂页合并主键设计原则 insert优化order by优化group by优化limit优化count优化 SQL 优化 主键优化 数据组织方式 在InnoDB存储引擎中,表数据都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表 在In…

数据结构Java版(4)——链表

一、概述 链表是一种常见的数据结构,用于存储一系列具有相同类型的数据元素。它由多个节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。 链表与数组不同,它的节点在内存中不是连续存储的,而是通过每个节点中的指针…

测试C#调用OpenCvSharp和ViewFaceCore从摄像头中识别人脸

学习了基于OpenCvSharp获取摄像头数据,同时学习了基于ViewFaceCore的人脸识别用法,将这两者结合即是从摄像头中识别人脸。本文测试测试C#调用OpenCvSharp和ViewFaceCore从摄像头中识别人脸,并进行人脸红框标记。   新建Winform项目&#xf…

OpenSource - 文件在线预览模块(多格式转 PDF 文件)

文章目录 文件在线预览模块(多格式转PDF文件)现已支持格式如下界面展示运行方式接口介绍文件上传文件转 PDF文件转图片文件转SVG 参数配置其他说明项目关联关键词文档转换预览技术说明同步转换异步转换 主要技术乱码问题处理帮助文档 前端预览弹出层用法…

整除的特征及解释

整除的特征及解释 整除的含义 简单地说,当一个非零整数除另一个整数得到整数商而没有余数时,叫做整除。如62=3,就说2整除6或6能被2整除。 用数学语言描述:若整数b除以非零整数a,商为整数,且余…

zookeeper弱密码漏洞修复

1.连接zookeeper 进入zookeeper安装目录 bin目录下 ./zkCli.sh -server IP:21812.查看节点 ls /3.查看节点权限 getAcl /zookeeper4.设置IP权限 setAcl / ip:127.0.0.1:cdrwa,ip:10.86.30.11:cdrwazookeeper的权限不具备继承性,父子节点的权限相互独立,因此需要为每个子…

11- OpenCV:自定义线性滤波(卷积,卷积边缘)

目录 一、卷积 1、卷积概念 2、卷积如何工作 3、常见算子(卷积核 Kenel) 4、自定义卷积模糊 5、代码演示 二、卷积边缘 1、卷积边缘问题 2、处理边缘 3、相关的API说明 4、代码演示 一、卷积 1、卷积概念 (1)在OpenC…

生成当天递增唯一的流水号的几种方式

说明:当开发中,如交易、文件传输过程中的文件名,可能需要我们使用一串唯一的数字来锁定这一条“交互记录”,即流水号。 本文介绍几种生成6位递增唯一,且每日重置的流水号的方式。 方式一:使用Redis 我们…

SpringSecurity(11)——核心组件和认证流程

获取用户信息 // 获取安全上下文对象,就是那个保存在 ThreadLocal 里面的安全上下文对象 // 总是不为null(如果不存在,则创建一个authentication属性为null的empty安全上下文对象) SecurityContext securityContext SecurityContextHolder.getContext(…

微信轰炸-python实现方法

新手,一般都需要执行以下命令,用来导入对应模块 pip install -i Simple Index pynput 键盘winr进入输入cmd 执行该命令即可:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pynput 打开pycharm,输入代码如下 from pynput.keybo…

AI视频智能识别技术在智慧农业大棚升级改造管理场景中的应用方案

一、需求分析 随着科技的进步和农业现代化的推进,智能化技术逐渐成为现代农业发展的重要支撑。农业大棚作为现代农业的重要组成部分,其智能化改造对于提高农业生产效率、降低成本、增加收益具有重要意义。利用先进的信息化手段来对农业大棚进行管理&…

NOC总线(2)

1. NoC的路由 在NoC交换信息时,需要确定从源节点到目标节点所经过的路径,这时就需要路由算法来确定该路径。路由算法分为静态路由算法和动态路由算法两种。 静态路由算法对于两节点之间的路径是固定的,结构简单,便于硬件实…

【算法分析与设计】二叉树的层序遍历

📝个人主页:五敷有你 🔥系列专栏:算法分析与设计 ⛺️稳中求进,晒太阳 题目 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点&#xf…

idea插件开发

1, file-new project 如图,选择了安装路径,报错【select home directory for intellij platform plugin sdk】。(注意是安装路径最外层的文件夹,不是里面的lib,jbr这一层级) 2,点击了…

HTML前端CSS实现只显示1行或者2行、3行剩余显示省略号

想要做的效果: 文本只一行显示 /**实现思路:1.设置inline-block属相2.强制不换行3.固定高度4.隐藏超出部分5.显示“……”*/ {display: inline-block;white-space: nowrap; width: 100%; overflow: hidden;text-overflow:ellipsis; }文本只多行显示 /** 实现思路&…

【Java发送邮箱】spring boot 发送邮箱

导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId> </dependency> 2.在properties配置邮箱 # 发件人QQ号 spring.mail.username2508575653qq.com # QQ邮箱授权码 sp…

xshell配置隧道转移规则

钢铁知识库&#xff0c;一个学习python爬虫、数据分析的知识库。人生苦短&#xff0c;快用python。 xshell是什么 通俗点说就是一款强大ssh远程软件&#xff0c;可以方便运维人员对服务器进行管理操作&#xff0c;功能很多朋友们自行探索&#xff0c;今天只聊其中一个功能点那…