揭开Spring MVC的真面目

news2024/9/30 13:30:29

官方对于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.coloradmin.cn/o/1402909.html

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

相关文章

数学建模--Radar图绘制

1.Radar图简介 最近在数学建模中碰见需要绘制Radar图(雷达图)的情况来具体分析样本的各个特征之间的得分与优劣关系,这样的情况比较符合雷达图的使用场景,一般来说,雷达图适用于展示多个维度的数据,并在一个平面上直观地呈现出不同…

宠物空气净化器推荐哪个好?实惠的猫用猫用净化器牌子测评

作为宠物主人,我们深知养宠物的乐趣和责任,但同时也面临着一些挑战,比如宠物掉毛、异味和空气质量等问题。这就是为什么越来越多的家庭选择宠物空气净化器,为我们创造一个清新、健康的室内环境。 无论我们多么爱我们的毛茸茸伙伴…

如何在 Ubuntu 22.04 上安装 Apache Web 服务器

前些天发现了一个人工智能学习网站,通俗易懂,风趣幽默,最重要的屌图甚多,忍不住分享一下给大家。点击跳转到网站。 如何在 Ubuntu 22.04 上安装 Apache Web 服务器 介绍 Apache HTTP 服务器是世界上使用最广泛的 Web 服务器。它…

【C++】priority_queue模拟实现过程中值得注意的点

👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 🌝每一个不曾起舞的日子,都是对生命的辜负 前言 本篇文章旨在记录博主在模…

[已解决]mysql关闭SSL功能和永久关闭SSL设置

概述 在搭建服务器连接本地数据库时发现有个报错信息: SQLState - 08S01 com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure The last packet successfully received from the server was 292 milliseconds ago. The last …

如何查看苹果手机的CPU型号?

摘要 本文将介绍如何在苹果手机上查看CPU型号。通过简单的设置操作,您可以轻松地获取您的iPhone的CPU型号信息。此外,我们还将介绍一些克魔助手可以提供的其他功能,如内存监控、GPU性能监控和网络抓包等,以帮助您优化和提升iOS应…

设计模式—行为型模式之观察者模式

设计模式—行为型模式之观察者模式 观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(Publish/Subscribe&#…

三.Winform使用Webview2加载本地HTML页面

Winform使用Webview2加载本地HTML页面 往期目录创建Demo2界面创建HTML页面在Demo2窗体上添加WebView2和按钮加载HTML查看效果 往期目录 往期相关文章目录 专栏目录 创建Demo2界面 经过前面两小节 一.Winform使用Webview2(Edge浏览器核心) 创建demo(Demo1)实现回车导航到指定…

同星多通道CAN FD转USB/WIFI设备,解决近距离无线通讯问题

新品发布/New products release 2024年1月,同星智能连续发布FlexRay系列产品TP1034和以太网系列产品TP1051,上周发布多通道总线记录仪产品TLog1004。1月19日,同星智能又推出一款2/4路CAN FD转USB和WIFI的工具,解决近距离无线通讯…

L1-079 天梯赛的善良(Java)

天梯赛是个善良的比赛。善良的命题组希望将题目难度控制在一个范围内,使得每个参赛的学生都有能做出来的题目,并且最厉害的学生也要非常努力才有可能得到高分。 于是命题组首先将编程能力划分成了 106 个等级(太疯狂了,这是假的&…

如何使用支付宝沙箱环境本地配置模拟支付并结合内网穿透远程调试

文章目录 前言1. 下载当面付demo2. 修改配置文件3. 打包成web服务4. 局域网测试5. 内网穿透6. 测试公网访问7. 配置二级子域名8. 测试使用固定二级子域名访问 正文开始前给大家推荐个网站,前些天发现了一个巨牛的 人工智能学习网站, 通俗易懂&#xff…

基于光口的以太网 udp 回环实验

文章目录 前言一、系统框架整体设计二、系统工程及 IP 创建三、UDP回环模块修改说明四、接口讲解五、顶层模块设计六、下载验证前言 本章实验我们通过网络调试助手发送数据给 FPGA,FPGA通过光口接收数据并将数据使用 UDP 协议发送给电脑。 提示:任何文章不要过度深思!万事万…

【SpringBoot技术专题】「开发实战系列」Undertow web容器的入门实战及调优方案精讲

Undertow web容器的入门实战及调优方案精讲 Undertow web容器Undertow 介绍官网API给出一句话概述Undertow:官网API总结特点:Lightweight(轻量级)HTTP Upgrade Support(支持http升级)、HTTP/2 Support支持H…

浅谈linux中的根文件系统(rootfs的原理和介绍)【转】

浅谈linux中的根文件系统(rootfs的原理和介绍)【转】 转自:https://www.cnblogs.com/sky-heaven/p/13742173.html linux中有一个让不少初学者都不是特别清楚的概念,叫作“根文件系统”。我接触linux前先后后也好几年了&#xff0…

Hystrix-熔断机制

1.1. 雪崩效应 熔断发生在服务端,降级发生在客户端; 分布式系统环境下,服务间类似依赖非常常见,一个业务调用通常依赖多个基础服务。如下图,对于同步调用,当库存服务不可用时,商品服务请求线程…

使用pysimplegui+opencv编写一个摄像头的播放器

需求 使用pysimplegui和opencv实现一个播放器,播放 摄像头的画面。 代码实现 import cv2 import time from typing import Iterable, NamedTuple, Optionalimport PySimpleGUI as sgclass CameraSpec(NamedTuple):name: strindex: intwidth: intheight: intfps: i…

【英文干货】【Word_Search】找单词游戏(第1天)

本期主题:Mindfulness(意识力) 本期单词: Awareness 意识 Breathing 呼吸 Calm 平静的 De-Stress 减压 Feelings 感受,情感 Inspection 调查 Meditation 冥想 Peace 和平 Quiet 安静的 Recollection 回忆 R…

深入理解java对象的内存布局

概述: 在HotSpot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。 在HotSpot虚拟机里,…

网络安全全栈培训笔记(57-服务攻防-应用协议RsyncSSHRDPFTP漏洞批量扫描口令拆解)

第57天 服务攻防-应用协议&Rsync&SSH&RDP&FTP&漏洞批量扫描&口令拆解 知识点: 1、服务攻防-远程控制&文件传输等 2、远程控制-RDP&RDP&弱口令&漏洞 3、文件传输-FTP&Rsyc&弱口令&漏洞 章节内容:…

vmware 安装Rocky-9.3系统

安装系统截图 安装完成,启动 查看版本和内核 开启远程登陆授权 1、编辑配置文件 #提升权限,输入su,并输入密码 su #编辑ssh文件开启root远程登陆 vi /etc/ssh/sshd_config找到以下内容:#PermitRootLogin prohibit-password 添加&#xff1a…