揭开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.hqwc.cn/news/421897.html

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

相关文章

【Gene Expression Prediction】Part1 基因表达数据的获取与分析

文章目录 Gene Expression Prediction1. Intro2. Up-sampling3. Compressive sensing3.5 Predicting Reporter Expression from Chromatin Features4. Predicting splicing from sequence 来自Manolis Kellis教授(MIT计算生物学主任)的课 YouTube&#x…

【网站项目】基于SSM的273校园二手交易网站

🙊作者简介:多年一线开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

C++PythonC# 三语言OpenCV从零开发(6):边界填充+Csharp调用Python matplotlib代码

文章目录 相关链接前言测试图片边界填充pythonCCsharp错误代码Mat遍历最终代码和结果 总结 相关链接 C&Python&Csharp in OpenCV 专栏 【2022B站最好的OpenCV课程推荐】OpenCV从入门到实战 全套课程(附带课程课件资料课件笔记) 前言 今天来接着…

【操作系统】实验二 Proc文件系统

🕺作者: 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要&…

网络安全的信息收集方法有哪些?

网络安全攻击中的信息收集是攻击者为了了解目标系统的弱点、配置、环境和潜在的防御措施而进行的活动。以下是一些常见的信息收集手段: 开放网络资源查询: 使用搜索引擎查找关于目标组织的信息,包括新闻稿、社交媒体帖子、官方网站等。通过W…

【C++修行之道】竞赛常用库函数(sort,min和max函数,min_element和max_element、nth_element)

目录 一、sort 1.1sort简介 语法 参数 功能 适用容器 1.2sort的用法 1.3自定义比较函数 示例 1265蓝桥题 —— 排序 二、min和max函数 三、min_element和max_element 497蓝桥题 —— 成绩分析 四、nth_element 一、sort 1.1sort简介 sort函数包含在头文件<a…

用户洞察:精准解读用户的真实需求!

洞察用户需求的过程和谈恋爱一样。你不能简简单单地问客户&#xff0c;你想要什么&#xff1f;你有什么痛点&#xff1f;这样的问法是无法得到任何有价值的信息。这就好比谈恋爱的场景&#xff0c;如果你问对方想吃什么&#xff0c;大概率会得到“随便”“都行”这类的答案&…

计算机网络学习first day

In the first day.  首先&#xff0c;我们要先有清晰地学习思路&#xff0c;然后介绍计算机网络的发展及在信息时代的各类应用及带来的一些负面问题。然后是对因特网进行概述&#xff0c;包括网络&#xff0c;互联网和因特网的相关概念&#xff0c;因特网发展的三个历史阶段&a…

python opencv 图片缺陷检测(讲解直方图以及相关系数对比法)

一、利用直方图的方式进行批量的图片缺陷检测&#xff08;方法简单&#xff09; 二、步骤&#xff08;完整代码见最后&#xff09; 2.1灰度转换&#xff08;将原图和要检测对比的图分开灰度化&#xff09; 灰度化的作用是因为后面的直方图比较需要以像素256为基准进行相关性比…

RabbitMQ的安装使用

RabbitMQ是什么&#xff1f; MQ全称为Message Queue&#xff0c;消息队列&#xff0c;在程序之间发送消息来通信&#xff0c;而不是通过彼此调用通信。 RabbitMQ 主要是为了实现系统之间的双向解耦而实现的。当生产者大量产生数据时&#xff0c;消费者无法快速消费&#xff0c;…

基于SpringBoot的SSM整合案例

项目目录: 数据库表以及表结构 user表结构 user_info表结构 引入依赖 父模块依赖: <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.12.RELEASE</version>…

Conmi的正确答案——eclipse C/C++显示“未解析的包含:<xxx.h>”/“Unresolved inclusion: <xxx.h>”

eclipse IDE 版本&#xff1a;2023-12 部分采自&#xff1a;解决方法&#xff1a;关于问题 “C - Unresolved inclusion: <iostream>” 解释事项&#xff1a;方法一可能版本不同&#xff0c;部分界面修改了。这里使用的是方法二的解决方法。&#xff08;或者各位大神的描…