详解Java之Spring MVC篇一

目录

Spring MVC

官方介绍

MVC

RequestMapping

传递参数 

无参数

单个参数

针对String类型

 针对Integer类型

针对int类型

针对自定义类型

多个参数

参数重命名

参数强制一致

参数不强制一致

传递数组

​编辑传递List

​编辑

传递JSON

​编辑

从路径中获取参数

获取单个参数

 获取多个参数

​编辑

上传文件


Spring MVC

官方介绍

翻译:

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

MVC

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

Model(模型)是应⽤程序中⽤于处理应⽤程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。
View(视图)是应⽤程序中处理数据显示的部分。通常视图是依据模型数据创建的。
Controller(控制器)是应⽤程序中处理⽤户交互的部分。通常控制器负责从视图读取数据,控制⽤户输⼊,并向模型发送数据。

MVC和Spring MVC的区别

MVC 是⼀种思想,⽽ Spring MVC 是对 MVC 思想的具体实现。
总结来说,Spring MVC 是⼀个实现了 MVC 模式,并继承了 Servlet API 的 Web 框架。既然是 Web 框架,那么当⽤户在浏览器中输⼊了 url 之后,我们的 Spring MVC 项⽬就可以感知到⽤户的请求。 

RequestMapping

@RequestMapping 是 Spring Web 应⽤程序中最常被⽤到的注解之⼀,它是⽤来注册接⼝的路
由映射的。

路由映射:所谓的路由映射指的是,当⽤户访问⼀个 url 时,将⽤户的请求对应到程序中某个类的某个⽅法的过程就叫路由映射。 

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

@RequestMapping是处理get请求还是处理post请求的?

@RequestMapping("/request")
@RestController
public class RequestController {@RequestMapping("/hello")public String say(){return "hello, Spring mvc";}
}

使用get请求 

使用post请求

我们发现, @RequestMapping既能处理get请求也能处理post请求。

传递参数 
无参数
@RequestMapping("/request")
@RestController
public class RequestController {@RequestMapping("/hello")public String say(){return "hello, Spring mvc";}
}

结果:

单个参数
针对String类型
@RequestMapping("/request")
@RestController
public class RequestController {@RequestMapping("/r1")public String r1(String name){return "接收到参数,name:"+name;}
}

正确传参的结果: 

不传递参数的结果(结果为null):

传递错误参数的结果(结果为null):

由此我们知道,传递单个参数时,参数名必须保持一致!!!

 针对Integer类型
@RequestMapping("/r2")
public String r2(Integer age){return "接收到参数,age:"+age;
}

 正确传参的结果:

 错误传参的结果(结果为null):

不传参的结果(结果为null):

由此我们知道,对于Integer类型的参数,当不传参数时,默认值为null,如果传参名字不一致,值也是默认值null。 

针对int类型
@RequestMapping("/r3")
public String r2(int age){return "接收到参数,age:"+age;
}

正确传参的结果:

错误传参的结果(错误码500) :

不传参的结果(错误码500):

由此我们知道,对于int类型的参数, 如果传参的参数名不一致时,会报错且错误码为500;如果不传参,也会报错且错误码为500,这一点与int的包装类型Integer不一样!!!

针对自定义类型
@RequestMapping("/r5")
public String r5(Student student){return "接收到参数,student:"+student;
}

正确传参的结果: 

部分传参的结果:

错误传参的结果:

由此我们知道,针对自定义类型,如果不传参也不会报错,包装类型参数的默认值为null,如果传参类型不匹配会报错!!!

多个参数
@RequestMapping("/r4")
public String r4(String name,Integer age){return "接收到参数,name:"+name+",age:"+age;
}

参数重命名
参数强制一致
@RequestMapping("/r6")
public String r6(@RequestParam("name") String userName){return "接收到参数,name:"+userName;
}

正确传参的结果:

不传参的结果(错误码400):

 错误传参的结果(错误码400):

由此我们知道,当参数重命名之后,默认要求该参数必须传参,否则会报错!!! 

参数不强制一致
@RequestMapping("/r7")
public String r7(@RequestParam(value = "name",required = false) String userName){return "接收到参数,name:"+userName;
}

正确传参的结果:

错误传参的结果(结果为null):

不传参的结果(结果为null):

由此我们知道,当参数重命名之后,添加required=false之后,该参数就不要求必须传递了. 

传递数组
@RequestMapping("/r8")
public String r8(String[] array){return "接收到参数,array:"+ Arrays.toString(array);
}

可以这样传递:

也可以这样传递:

传递List
@RequestMapping("/r9")
public String r9(List<String> list){return "接收到参数,list:"+list;
}

响应:

 解决方法

@RequestMapping("/r9")
public String r9(@RequestParam(required = false) List<String> list){return "接收到参数,list:"+list;
}

响应:

由此我们知道,当参数类型时List类型时,必须添加@RequestParam注解,否则会报错且错误码为500。

传递JSON
@RequestMapping("/r10")
public String r10(@RequestBody Student student){return "接收到参数,student:"+student;
}

响应:

通过fiddler抓包:

原因分析:

是因为它把Json字符串当成了一个不可拆分的整体,所以这样拿不到传递的参数。

解决办法: 

@RequestMapping("/r10")
public String r10(@RequestBody Student student){return "接收到参数,student:"+student;
}

响应:

由此我们知道,当传递Json字符串时,必须添加@RequestBody注解!!!

从路径中获取参数
获取单个参数
@RequestMapping("/article/{articleId}")
public String r11(Integer articleId){return "接收到参数,article:"+articleId;
}

响应(出错):

解决方法,使用@PathVariable注解。

@RequestMapping("/article/{articleId}")
public String r11(@PathVariable("articleId") Integer articleId){return "接收到参数,article:"+articleId;
}

响应:

关于为什么需要加@PathVariable("articleId"),这里有几个关键点:

1.明确性:@PathVariable注解明确指出了哪个URL模板变量应该被绑定到方法的哪个参数上。虽然Spring MVC也可以尝试通过参数名来自动匹配(如果参数名与URL模板中的变量名相同),但使用@PathVariable增加了代码的清晰度和明确性。

2.灵活性:在某些情况下,URL模板中的变量名可能与你想在控制器方法中使用的参数名不同。通过@PathVariable,你可以指定一个不同的参数名,这提供了额外的灵活性。

3.可读性:对于阅读代码的人来说,@PathVariable注解使得URL模板变量到方法参数的绑定一目了然,有助于理解代码的功能和目的。

4.强制类型转换:@PathVariable注解允许你指定参数的类型(如Integer),这意味着Spring MVC会尝试将URL模板变量的值转换为指定的类型。如果没有这个注解,你可能需要手动进行类型转换。

5.必需性:虽然在这个特定示例中@PathVariable可能看起来不是绝对必需的(因为参数名与URL模板变量名相同),但在更复杂的URL模板或更复杂的控制器方法中,使用@PathVariable可以确保你的代码更加健壮和易于维护。

 获取多个参数
@RequestMapping("/article/{articleId}/{name}")
public String r12(@PathVariable("articleId") Integer articleId,@PathVariable("name") Integer name){return "接收到参数,article:"+articleId+",name:"+name;
}

响应:

在通过路径获取参数时,如果从路径中获取多个参数,传参时必须每个都传递,否则会报错,因为不知道是哪个/哪些参数没有传递!!!

上传文件
@RequestMapping("/r13")
public String r13(@RequestPart("file")MultipartFile file){String originalFilename=file.getOriginalFilename();return "接收到参数,文件名称:"+originalFilename;
}

响应:

在上传文件时,文件不能太大,否则会上传失败!!! 

 

  • 欢迎您在主页查看我的更多文章--》主页链接
  • 欢迎您订阅我的博客专栏--》专栏链接

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

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

相关文章

什么是微服务中的反应性扩展?

大家好&#xff0c;我是锋哥。今天分享关于【什么是微服务中的反应性扩展&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; 什么是微服务中的反应性扩展&#xff1f; Reactive Extensions 也称为 Rx。这是一种设计方法&#xff0c;我们通过调用多个服务来收集结果…

Atlas800昇腾服务器(型号:3000)—Docker容器部署【图像分类】(十)

服务器配置如下&#xff1a; CPU/NPU&#xff1a;鲲鹏 CPU&#xff08;ARM64&#xff09;A300I pro推理卡 系统&#xff1a;Kylin V10 SP1【下载链接】【安装链接】 驱动与固件版本版本&#xff1a; Ascend-hdk-310p-npu-driver_23.0.1_linux-aarch64.run【下载链接】 Ascend-…

VsCode | 修改内置字体为JetBrains Mono NL

文章目录 一、下载JetBrains Mono NL字体二、VsCode进行字体的设置 一、下载JetBrains Mono NL字体 字体下载 下载完成以后解压找到JetBrainsMono-2.304\fonts\ttf文件夹下&#xff0c;全选鼠标右键点安装即可。 注意&#xff1a;一定要全部安装&#xff0c;否则字体样式可…

ffmpeg视频滤镜: 裁剪-crop

滤镜简述 crop官网链接 > FFmpeg Filters Documentation crop滤镜可以对视频进行裁剪&#xff0c;并且这个滤镜可以接受一些变量比如时间和帧数&#xff0c;这样我们实现动态裁剪&#xff0c;从而实现一些特效。 滤镜使用 参数 out_w <string> ..…

111.SAP ABAP - Function ALV - 列、行、单元格颜色 - 记录

目录 1.介绍 2.列背景色 3.行背景色 4.单元格背景色 4.1颜色码相关的结构 LVC_T_SCOL LVC_S_SCOL LVC_S_COLO 4.2单元格颜色设置方法 5.ALV 颜色码 1.介绍 在数据展示方面&#xff0c;要求ALV的数据列、行、单元格通过颜色醒目显示&#xff08;颜色展示…

elasticsearch 8.x 插件安装(三)之拼音插件

elasticsearch 8.x 插件安装&#xff08;三&#xff09;之拼音插件 elasticsearch插件安装合集 elasticsearch插件安装&#xff08;一&#xff09;之ik分词器安装&#xff08;含MySQL更新&#xff09; elasticsearch 8.x插件&#xff08;二&#xff09;之同义词安装如何解决…

MATLAB疲劳监测系统

课题介绍 该课题为基于眼部和嘴部的疲劳驾驶检测。带有一个人机交互界面GUI&#xff0c;通过输入视频&#xff0c;分帧&#xff0c;定位眼睛和嘴巴&#xff0c;通过眼睛和嘴巴的张合度&#xff0c;来判别是否疲劳。 二、操作步骤 第一步&#xff1a;最好电脑安装的是MATLAB 2…

redis集群(主从同步、哨兵、群集)

目录 一、redis主从复制 1.1 主从复制的作用 1.2 主从复制的流程 1.3 搭建redis主从复制 1.3.1 环境准备 1.3.2 修改内核参数 1.3.3 安装redis 1.3.4 创建redis工作目录 1.3.5 环境变量 1.3.6 定义systemd服务管理脚本 1.3.7 修改 Redis 配置文件&#xff08;Master节点操作&am…

MicroServer Gen8再玩 OCP万兆光口+IT直通之二

这个接上一篇&#xff0c;来个简单测试。 一、测试环境 PC端&#xff1a;Win10&#xff0c;网卡&#xff1a;万兆光纤&#xff08;做都做了&#xff0c;都给接上&#xff09;&#xff0c;硬盘使用N年的三星SSD 840 交换机&#xff1a;磊科GS10&#xff0c;带两个万兆口 Gen…

Linux系统基础-多线程超详细讲解(1)

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 Linux系统基础-多线程超详细讲解(1) 收录于专栏[Linux学习] 本专栏旨在分享学习Linux的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 …

Github 2024-10-29Python开源项目日报 Top10

根据Github Trendings的统计,今日(2024-10-29统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目10TypeScript项目1gpt4free存储库:强大语言模型的集合 创建周期:300 天开发语言:Python协议类型:GNU General Public License v3…

高职院校教学一体化护理实训室建设方案

当前&#xff0c;高职院校在人才培养方面正经历着深刻的变革。教育部明确提出&#xff0c;高职院校在人才培养过程中&#xff0c;必须着重培养学生的专业技能与职业素养&#xff0c;旨在培育出更多出类拔萃的应用型人才&#xff0c;从而全面提升高职院校护理类专业的人才培养质…

【K8S系列】Kubernetes 中 Service IP 分配 问题及解决方案【已解决】

在 Kubernetes 中&#xff0c;LoadBalancer 类型的 Service 允许用户轻松地将应用暴露给外部流量。它自动创建一个云负载均衡器并分配一个外部 IP 地址。然而&#xff0c;在某些情况下&#xff0c;LoadBalancer 类型的 Service 可能未能成功分配 IP 地址&#xff0c;导致外部无…

智慧旅游微信小程序平台

作者介绍&#xff1a;✌️大厂全栈码农|毕设实战开发&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 &#x1f345;获取源码联系方式请查看文末&#x1f345; 推荐订阅精彩专栏 &#x1f447;&#x1f3fb; 避免错过下次更新 Springboot项目精选实战案例 更多项目…

基于SpringBoot实现驻马店市ERP药品管理系统

作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验&#xff0c;被多个学校常年聘为校外企业导师&#xff0c;指导学生毕业设计并参与学生毕业答辩指导&#xff0c;…

十、包并发

包&并发 包1. 包1.1 包的基本概念1.2 包的导入1.3 包的导入路径1.4 包的引用格式 2. go mod2.1 项目中使用 并发1. 并发2. Goroutine2.1 使用2.1 GMP 3. runtime包4.Channel4.1 创建channel4.2 channel操作4.3 无缓冲的通道4.4 有缓冲的通道4.6 如何优雅的从通道循环取值4.…

Golang | Leetcode Golang题解之第517题超级洗衣机

题目&#xff1a; 题解&#xff1a; func findMinMoves(machines []int) (ans int) {tot : 0for _, v : range machines {tot v}n : len(machines)if tot%n > 0 {return -1}avg : tot / nsum : 0for _, num : range machines {num - avgsum numans max(ans, max(abs(sum…

简单了解unordered_set和unordered_map底层

目录 1.哈希表(开散列)实现 1.1 介绍模板参数 1.2 代码实现 2.迭代器 3.HASH转整形的类 4.unordered_map简单实现 5.unordered_map简单实现 6.验证 1.哈希表(开散列)实现 1.1 介绍模板参数 //K&#xff1a;关键码 //T&#xff1a;保存数据&#xff0c;unordered_map是一…

[NSSCTF 2nd]php签到 详细题解

知识点: linux文件后缀名绕过 表单文件上传 pathinfo 函数 file_put_contents()函数 命令执行 代码审计: <?phpfunction waf($filename){$black_list array("ph", "htaccess", "ini");$ext pathinfo($filename, PATHINFO_EXTENSION…

《CUDA编程》11.CUDA流

本章将介绍CUDA流 CUDA程序的并行层次主要有两个&#xff1a;一个是核函数内部的并行&#xff0c;一个是核函数外部的并行&#xff0c;核函数外部的并行主要指&#xff1a; 核函数计算与数据传输之间的并行主机计算与数据传输之间的并行不同数据传输之间的并行核函数计算与主机…