【Spring】初识Spring MVC

news2024/11/25 16:26:38

文章目录

  • 前言
  • 一、MVC是什么?
  • 二、学习Spring MVC
    • 建立连接
    • @RequestMapping注解
    • 注解的使用细节
  • 三、传递参数的情况
    • 传递单个参数
      • 1.传递String
      • 2.传递包装类/基本类型
      • 3.参数重命名(@RequestParam)
    • 传递多个参数
    • 传递对象
    • 传递数组
    • 传递集合
    • 参数为变量
    • 传递文件
    • 小细节
  • 四、JSON
  • 总结
  • 总结


前言

Java中Spring是一个大的集合,包括Spring Boot、Spring Cloud……
而Spring MVC是基于Servlet API构建的原始Web框架,从一开始就在Spring 框架中。
Spring MVC全称为“Spring Web MVC”


一、MVC是什么?

MVC包括三部分:Model、View、Controller
View(视图) 即前端;Model(模型)处理业务逻辑和数据;Controller(控制器)选择处理模型和视图。他们之间的关系可以参考下图。
在这里插入图片描述
在IDEA中就可以创建Spring Web项目,Spring Boot只是实现MVC的一种方式而已。
在这里插入图片描述

二、学习Spring MVC

因为是Web框架,所以Spring MVC需要接收到用户所发送的请求并返回响应。主要分为以下三个方面:

  1. 建立连接:将用户与Java程序连接起来,使用户能够调用Spring程序
  2. 请求:用户向服务器发起请求,在程序中需要想办法获取到请求中存在的参数(也可能不含参数)
  3. 响应:执行业务逻辑之后将程序执行结果返回给用户。

建立连接

在Spring MVC中使用@RequestMapping实现URL路由映射,使得浏览器能够连接程序。 在程序中,为了能够更快找到路由映射,需要使用**@RestController注解**。
当程序运行时,会根据该注解查找类下面是否存在相应的路径。如果没有添加这个注解,程序是不会进入到类里面进行核验的。

@RestController
public class demo01 {
    @RequestMapping("/hello")
    //方法名和路径名无需一致
    public String hello() {
        return "hello,Spring MVC";
    }
}

接下来访问: http://127.0.0.1:8080/sayHi, 就可以看到程序返回的数据了
在这里插入图片描述

@RequestMapping注解

@RequestMapping 是Spring MVC中最常被用到的注解,也是十分特殊的注解。它是用来注册URL路径的。

  1. 那么它支持哪些请求?答案是全部支持。即支持Post、Get、Put……请求。(可以在Postman中测试)
    如果我们要让该注解只支持固定类型的请求那么该如何设置?我们可以配置@RequestMapping的参数,控制它请求的方式。当选择参数method,可以理解为以数组的形式放入数据,数据中存放的就是请求的方式。value就是注解的url。
    如果不选择method,那么默认为全部支持。
@RequestMapping(value = "/hello2",method = {RequestMethod.GET,RequestMethod.PUT})
    public String hello2() {
        return "hello spring mvc";
    }

当然了,只支持单个请求方式的注解也是有的。诸如此类的请求注解都是只允许一种请求方式。
在这里插入图片描述
2. 在上面的使用中,我们通过@RequestMapping、@GetMapping等注解加在每个方法上面,让Spring可以根据路实现客户端和服务器之间的请求响应。在方法上的路径成为“方法路径”。随着项目逐渐扩大,很有可能出现方法路径相同的失误。为了防止路径重复,我们建议每个类都加上“类路径”,这样就可以避免不同类之间相同路径难以发现的问题了。
类路径应该如何配置呢?用的就是@RequestMapping ,我们可以通过注解的源码来窥探一二。通过@Target注解,其中有两种:TYPE和METHOD 当为TYPE时,则该注解为类注解,当为METHOD时,该注解为方法注解。

在这里插入图片描述
像@RequestMapping 两种方式都有,因此属于类注解也属于方法注解,而例如@PostMapping 就只有一个METHOD 因此它只能用于方法注解上。
在这里插入图片描述

注解的使用细节

1、同样的url路径,不同的注解请求是互不影响的。
在这里插入图片描述
2、同样的请求方式,同样的路径是会报错的,由于Spring是根据路径进入方法的,而相同路径会造成Spring不知道应该执行哪一个而报错。
在这里插入图片描述
运行后报错截图如下。
在这里插入图片描述

三、传递参数的情况

后端开发自然有需要接收参数和传递参数的情况需要处理。这时候就像方法一样传入参数并执行逻辑。

传递单个参数

1.传递String

以下面的简单的代码为例,我们在Postman里面进行测试的路径应该为
”http://127.0.0.1:8080/params/param1“ 并且我们必须保证 参数为name,在Postman里面的参数名称也必须为name(我们也可以选择参数重命名的方法,即使用@RequestParam注解) 在下文展示。

@RestController
@RequestMapping("/params")
public class paramDemo {
    @RequestMapping("/param1")
    public String getName(String name) {
        return name;
    }
}

当我们编写的参数名为name1时,是没有办法获取到数据的;
在这里插入图片描述
当我们正确的输入传递参数名,就能够正常的处理请求。
在这里插入图片描述

2.传递包装类/基本类型

以Integer包装类与基本类型int为例,当传入参数合法时,二者表现无异。当传输参数为空时,Integer返回值为null而int类型则是报错。
在下面的方法中,返回值为String类型,对于传输的数据,Spring能够自动将数据进行类型转换。

	@RequestMapping("/param2")
    public String getNum(Integer num) {
        return "接收到参数:" + num;
    }
    @RequestMapping("/param3")
    public String getNum1(int num) {
        return "接收到参数:" + num;
    }

在这里插入图片描述
对于报错信息状态码为400,大部分表示客户端信息报错,int类型无法处理空值的数据状况。
在这里插入图片描述

3.参数重命名(@RequestParam)

在前面我们知道,参数的名称顺序必须一一对应,不然无法成功进行请求和响应。那么当前端与后端发生分歧时,可能导致参数名称不一致,这时我们就需要将前端的变量名调回和后端一致的变量。
使用了@RequestParam之后,将参数名name转变为userName,我们可以理解为废弃掉name这一变量名,以后只用userName。
需要注意的是,以后对参数传递就不能使用name了,而是只能使用userName作为参数名。
在使用了该注解之后,该参数就变成了必填项。我们可以配置required = false改变它是否为必填项。

	@RequestMapping("/param1")
    public String getName(@RequestParam("userName") String name) {
        return name;
    }
	//修改必填项
	@RequestParam(value = "userName",required = false

在这里插入图片描述
在这里插入图片描述

传递多个参数

以下面的param4为例,传入两个参数为userName和password,当我们传入数据时,我们对于参数的顺序是不严格要求的。

	@RequestMapping("/param4")
    public String param4(String userName,String passWord) {
        return "接收到 name:"+userName + "password:"+passWord;
    }

在Postman中的测试以下图为例。在调整了参数传递顺序之后也不会影响结果的改变。
原因:在传入的数据进入Spring之后,存在类似与Map的数据结构,将变量名和数据一一对应,从而不会出现数据乱套的情况。
在这里插入图片描述

传递对象

传递对象和传递普通参数的步骤其实是一样的,在对象中已经有了所需要的信息。
在代码中创建了UserInfo类,并存入变量name、age、password 而在"/param5’路径下,我们可以直接放入userInfo对象。
在对象中,int为基本类型,是存在默认值为0的,因此出现age未赋值的情况下也不会报错。

@RequestMapping("/param5")
    public String param5(UserInfo userInfo) {
        return "接收:"+userInfo;
    }

在这里插入图片描述
在这里插入图片描述

传递数组

数组中包含了多个数据,我们在Postman测试过程中可以分开传输,也可以统一传输。这边不再赘述。
在这里插入图片描述
在这里插入图片描述

传递集合

集合与数组之间是存在区别的。在下面的案例中,List属于接口,数据无法直接存储。这时候就需要通过@RequestParam的另外一个功能:绑定数据。

	@RequestMapping("/param7")
    public String param7(@RequestParam("list") List<String> list) {
        return list + " ";
    }

在这里插入图片描述

参数为变量

许多url路径都会传入变量如id、name等数据。这些数据是可变的。
在RequestMapping中我们会写入id的数据,而在方法param9中的id通过@PathVariable获取url路径中的id。

	@RequestMapping("/param9/{id}")
    public String param9(@PathVariable Integer id) {
        return "id:" + id;
    }

同时,我们也可以支持获取多个url数据中的变量

	@RequestMapping("/param10/{id}/{name}")
    public String param10(@PathVariable Integer id,
    @PathVariable String name) {
        return "id:" + id + ",name:" + name;
    }

在这里插入图片描述

传递文件

文件传递需要使用到MultipartFile类,该类中有多个方法包括获取文件名、文件类型等。在下面的源码中,对于文件已经不能用@RequestParam注解来进行参数重命名了,而是需要一个新的注解**@RequestPart**
在这里插入图片描述

小细节

在Postman中,暂时用到两种方式,以Params进行参数的传递。这种方式将所有的参数都拼接到了一起,我们可以发现使用Params方式的情况下url路径都将变量拼接起来了。而以form表单进行提交的情况下并不会发生这种情况。
而传输对象数据的情况下,以form表单进行提交是只能使用Post的方式的,而已Params方式提交只能使用Get和Post两种方式。

四、JSON

json是轻量级数据交互格式,我们可以通过json传递对象或数组的信息。
JSON中的各项数据使用键值对来表示,以逗号分隔。key 和value之间通过 :分割
数据类型没有受限制。
数组使用[]表示,对象使用{}表示
在json中,接收数据需要使用到@RequestBody注解。在postman中也需要通过“raw”来填写json数据。

	@RequestMapping("/param7")
    public String param8(@RequestBody UserInfo userInfo) {
        return userInfo +" ";
    }

在这里插入图片描述

总结

Spring MVC是Java中十分常用的一个设计思想。其中的注解有多般变化,PostMapping是其中十分重要的注解。此外类注解和方法注解都有自己的标识。传递参数的方式有多种,需要仔细思考。
源码Spring MVC


总结

提示:这里对文章进行总结:

例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

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

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

相关文章

MCAL--MCU (S32K144)

AutoSAR中MCU Driver主要提供了用于基本的控制器初始化、下电、复位功能的服务,同时也为其它MCAL层需要的功能提供对应的服务函数。通常来说在AutoSAR的架构中MCU主要支持以下几个功能: 1.初始化控制器的外设时钟、系统时钟、PLL等,对所有控制器内各个外设模块用到的时钟提供…

Spring之@Bean注解

1. 使用方式 1.1 Configuration Bean 1.1.1 创建实体类 User Data NoArgsConstructor public class User {private String name;public User(String name) {this.name name;} } 1.1.2 创建配置类 UserConfig Configuration public class UserConfig {Beanpublic User us…

Web客户端软件测试

目录 1.测试分类 按照软件产生的阶段划分 按照代码可见度划分 其他测试 2.质量模型&#xff1a;衡量一个软件质量的维度 3.软件测试 1.单功能测试 等价类划分法&#xff1a;一种用少量数据获得较好测试效果的工具 边界值分析法&#xff1a;一个边界范围限制选取测试数…

最近云计算领域有哪些重大进展?

在云计算领域&#xff0c;近期确实涌现出了一系列令人瞩目的重大进展。以下是一些关键点&#xff0c;为您概述了当前的科技动态&#xff1a; 中国云计算市场迅猛发展&#xff1a; 中国云计算市场正处于快速发展期&#xff0c;年复合增长率超过40%。公有云市场规模增长49.3%至32…

深信达反向沙箱:构筑内网安全与成本效益的双重防线

# 深信达反向沙箱&#xff1a;内网安全与成本控制的双重保障 在数字化时代&#xff0c;企业面临着日益复杂的网络安全挑战。内网安全尤其关键&#xff0c;因为它涉及到企业的核心数据和运营。深信达的反向沙箱技术&#xff0c;作为一种创新的安全解决方案&#xff0c;为政企单…

厦门凯酷全科技有限公司:抖音小店前沿的探索者与引领者

在数字经济浪潮席卷全球的今天&#xff0c;电商平台已成为推动消费升级、激发市场活力的关键力量。其中&#xff0c;抖音作为短视频与直播电商的佼佼者&#xff0c;正以其独特的内容生态和庞大的用户基础&#xff0c;重新定义着零售行业的边界。在这一背景下&#xff0c;厦门凯…

学习记录——day33 HTTP

目录 一、HTTP相关概念 二、客服端请求 1、请求首部 2、 响应首部 三、线程实现HTTP并发服务器 一、HTTP相关概念 1、HTTP&#xff0c;全称Hyper Text Transfer Protocol&#xff0c;用于万维网&#xff08;world wide web&#xff09;进行超文本学习的传输协议 2、HTTP属…

如何使用 Java 记录简化 Spring Data 中的数据实体

Java 开发人员一直依赖 Spring Data 来实现高效的数据访问。但是&#xff0c;随着 Java Records 的引入&#xff0c;数据实体的管理方式发生了重大变化。 在本文中&#xff0c;我们将讨论 Java Records 在 Spring Data 应用程序中的集成。我们将探讨使用 Java 记录创建健壮的数…

CGAL 线性插值(自然邻近坐标)

文章目录 一、简介二、实现代码三、实现效果一、简介 自然邻近坐标插值(Natural Neighbor Interpolation)是一种基于Voronoi图的插值方法。它被广泛应用于地理信息系统(GIS)、计算几何以及科学计算领域。该方法的核心思想是利用数据点的Voronoi单元来确定插值点的权重,从而…

基于java的酒店管理系统设计与实现

系统分析与设计 需求分析 1.系统概要 根据餐饮系统的流程&#xff0c;完成从用户登录到开台点菜&#xff0c;到结账收银&#xff0c;到统计一条线的信息化管理&#xff0c;因此整个餐饮管理信息系统的研发内容就是开发一整套餐饮管理信息系统&#xff0c;实现餐饮业务的计算…

【三维重建】2D Gaussian Splatting:几何准确的2D辐射场(更新中)

标题&#xff1a;2D Gaussian Splatting for Geometrically Accurate Radiance Fields 项目地址&#xff1a;https://github.com/hbb1/2d-gaussian-splatting 文章目录 功能输入输出 一、摘要二、引言深入分析解读 三、相关工作3.1新视角合成3.2 3D重建3.3 可微分基于点的图形…

Manim动画:相机的移动(MovingCameraScene)

1.相机的移动(MovingCameraScene) MovingCameraScene 是 Manim 中的一个类&#xff0c;用于创建可以移动的相机场景。这个类继承自 Scene&#xff0c;并提供了关于相机移动的额外功能。 MovingCameraScene(camera_class<class manim.camera.moving_camera.MovingCamera>…

搭建ELK日志采集与分析系统

SpringCloud微服务实战——企业级开发框架 &#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您…

5.Linux_Shell编程

概述 什么是shell脚本&#xff1a; Shell脚本是利用shell的功能所写的一个程序。这个程序是使用纯文本文件&#xff08;后缀为.sh&#xff09;&#xff0c;将一些shell的语法与命令&#xff08;含外部命令&#xff09;写在里面&#xff0c;搭配正则表达式、管道命令与数据流重…

【QT代码控制Linux开发板】QT控制嵌入式Linux开发板运行shell脚本

一. 前言 最近遇到了一个很冲突的问题&#xff0c;我想让比如qt代码控制传感器读取的数值大于某个阈值时控制板子的灯亮进行报警。 但是当我在Linux开发板上./运行交叉编译后的qt文件时&#xff0c;想运行开发板的其他shell语句必须先退出qt代码的执行&#xff0c;当然开发板…

ios白苹果修复办法有哪些?

在这个数字化时代&#xff0c;iPhone作为智能手机的佼佼者&#xff0c;早已融入了我们生活的方方面面。然而&#xff0c;当那熟悉的开机画面——“白苹果”意外地成为了你的日常&#xff0c;无疑让人头疼不已。别担心&#xff0c;今天我们就来聊聊iOS白苹果现象的成因及几种有效…

Element-ui table进阶使用

最近项目有多个报表开发的需求&#xff0c;我采用的是凤翎前端组件框架&#xff08;基于element-ui开发&#xff09;&#xff0c;大伙可以直接参考element-ui组件库文档&#xff0c;把标签中的fks替换为el即可。下面我会按顺序一一展开细说这些需求&#xff1a; 1、有多级表头…

Java语言程序设计基础篇_编程练习题***16.31(游戏:四子连)

目录 题目&#xff1a;***16.31&#xff08;游戏&#xff1a;四子连&#xff09; 习题思路 代码示例 结果展示 题目&#xff1a;***16.31&#xff08;游戏&#xff1a;四子连&#xff09; 编程练习题8.20让两个玩家在控制台上可以玩四子连的游戏。为这个程序重写一个GUI版本…

Open3D mesh 模型锐化

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 输入参数 输出参数 2.2完整代码 三、实现效果 3.1原始mesh 3.2处理后mesh 3.3数据显示 Open3D点云算法汇总及实战案例汇总的目录地址&#xff1a; Open3D点云算法与点云深度学习案例汇总…

反射异常捕获 | InvocationTargetException 要用e.getCause()打印才能看到具体异常

背景&#xff1a;线上某段和反射相关的代码报错了&#xff0c;但是异常信息打印只看到了 InvocationTargetException&#xff0c;没打印具体的异常。就像这样&#xff1a;java.lang.reflect.InvocationTargetException: null 查阅资料后发现要用e.getCause()才能打印具体异常&a…