详解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;
}

响应:

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

树上启发式合并(详解)

核心思想 借用了一个节点到根的路径上轻边个数不会超过logn条。 故重节点保留&#xff0c;轻节点删去&#xff0c;多重统计。 实际复杂度&#xff08;nlogn&#xff09; 例题 Lomsat gelral - 洛谷 AC 代码 #include<bits/stdc.h> #define int long long using na…

无需扩散,下一个token预测直达AGI!

目录 简单概括1 背景知识方法数据视觉 Tokenizer架构预训练 实验结果视频生成未来预测 简单概括 虽然&#xff0c;下一token预测已在大语言模型领域实现了ChatGPT等突破&#xff0c;但是在多模态模型中的适用性仍不明确&#xff0c;多模态任务仍然由扩散模型&#xff08;如Sta…

大规模创新类竞赛评审方案的建模与研究

随着科技的发展和教育制度的改革&#xff0c;近年来涌现出一批以“创新”为主题的竞赛项目。这类竞赛的运行模式为&#xff0c;参赛队伍提交文档、视频或幻灯片等文本形式的作品&#xff0c;专家对参赛队伍提交的作品评阅判分&#xff0c;一份作品将由多位专家独立进行评阅打分…

19.面试算法-树的深度优先遍历(一)

1. 深入理解前中后序遍历 深度优先遍历有前中后三种情况&#xff0c;大部分人看过之后就能写出来&#xff0c;很遗憾大部分只是背下来的&#xff0c;稍微变换一下就废了。 我们再从二叉树的角度看递归&#xff0c;每次遇到递归&#xff0c;都按照前面说的四步来写&#xff0c…

从壹开始解读Yolov11【源码研读系列】——cfg:模型配置加载功能

目录 一、模型配置操作&#xff1a;cfg.__init__.py 1.cfg.cfg2dict&#xff1a;yaml转字典 2.cfg.get_cfg&#xff1a;读取覆盖配置 3.cfg全局配置参数查询表 ①*基础参数配置&#xff1a; ②*训练参数配置&#xff1a; ③验证测试参数配置&#xff1a; ④*预测参数配置&…

element plus中menu菜单技巧

我在使用element plus的menu&#xff08;侧边栏&#xff09;组件的过程中遇到了一些问题&#xff0c;就是menu编写样式和路由跳转&#xff0c;下面给大家分享以下&#xff0c;我是怎么解决的。 1.页面效果 我要实现的网站布局是这样的&#xff1a; 侧边栏折叠以后的效果&#…

使用 Spring 框架构建 MVC 应用程序:初学者教程

Spring Framework 是一个功能强大、功能丰富且设计精良的 Java 平台框架。它提供了一系列编程和配置模型&#xff0c;旨在简化和精简 Java 中健壮且可测试的应用程序的开发过程。 人们常说 Java 太复杂了&#xff0c;构建简单的应用程序需要很长时间。尽管如此&#xff0c;Jav…

PHP露营地管理小程序系统源码

&#x1f3d5;️露营新风尚&#xff01;露营地管理小程序系统&#xff0c;打造完美露营体验✨ &#x1f4cd;营地预订&#xff0c;轻松搞定&#x1f4c5; 想要逃离城市的喧嚣&#xff0c;享受大自然的宁静&#xff1f;露营地管理小程序系统让你的露营计划轻松实现&#xff01…

Vulnhub打靶-Empire-LupinOne

基本信息 靶机下载&#xff1a;https://download.vulnhub.com/empire/01-Empire-Lupin-One.zip 攻击机器&#xff1a;192.168.20.128&#xff08;Windows操作系统&#xff09;& 192.168.20.138&#xff08;kali&#xff09; 提示信息&#xff1a; 这个盒子被创建为中等…

FineReport 填报简介vs控件vs页面设置

填报简介 填报功能可以将页面数据写入到数据库&#xff0c;包括数据的增加、删除和修改操作。同时也支持对填写数据的自定义校验&#xff0c;Excel 导入数据&#xff0c;根据填写值智能联动等功能。 填报控件 设计填报报表时&#xff0c;如果需要修改和新增数据&#xff0c;则…

vue3使用element-plus手动更改url后is-active和菜单的focus颜色不同步问题

在实习&#xff0c;给了个需求做个新的ui界面&#xff0c;遇到了一个非常烦人的问题 如下&#xff0c;手动修改url时&#xff0c;is-active和focus颜色不同步 虽然可以直接让el-menu-item:focus为白色能解决这个问题&#xff0c;但是我就是想要有颜色哈哈哈&#xff0c;有些执…

【JAVA面试题】什么是Springboot的自动配置以及注意事项

文章目录 强烈推荐核心概念&#xff1a;自动配置的关键特点&#xff1a;示例&#xff1a; 需要注意的点1.默认配置可能不适合所有场景2.Bean 冲突与覆盖3.应用启动慢的问题4.过度依赖自动配置5.安全性问题6.依赖冲突与版本兼容7.过多不必要的自动配置8.调试困难 专栏集锦 强烈推…

python实战项目43:采集汽车之家数据

python采集汽车之家数据 一、寻找数据接口二、发送请求获取响应三、解析数据四、完整代码一、寻找数据接口 如下图所示,在汽车之家首页点击报价图标: 在下图中选择价位,例如选择15-20万: 打开浏览器开发者工具,刷新页面,找到数据接口。接下来,通过翻页寻找接口url的变…

如果你不幸成为家里第一个GIS专业的学生

家里无法给我很多建设性意见&#xff0c;大学四年到工作都是自己一个人跌跌撞撞走过来的&#xff0c;期间因为信息差走了不少弯路。对于GIS专业而言&#xff0c;没有家里人的指路&#xff0c;信息差就成了同学之间拉开差距的重要因素。现在我们要做的就是打破专业信息差&#x…

Vue+ECharts+iView实现大数据可视化大屏模板

Vue数据可视化 三个大屏模板 样式还是比较全的 包括世界地图、中国地图、canvas转盘等 项目演示&#xff1a; 视频&#xff1a; vue大数据可视化大屏模板

uiautomatorviewer安卓9以上正常使用及问题处理

一、安卓9以上使用uiautomatorviewer问题现象 打开Unexpected error while obtaining UI hierarchy 问题详情 Unexpected error while obtaining UI hierarchy java.lang.reflect.InvocationTargetException 二、问题处理 需要的是替换对应D:\software\android-sdk-windows…

这种V带的无极变速能用在新能源汽车上吧?

CVT的无极变速器的结构能用在电动汽车上吗&#xff1f;

Python 将网页保存为图片(Chrome内核)

一、背景介绍 之前写过一篇将网页保存为图片的文章 C# 将网页保存为图片&#xff08;利用WebBrowser&#xff09;_c# webbrowser 把网页内容转换成图片-CSDN博客​​​​​​ 这里有个弊端&#xff0c;C# WebBrowser使用的是IE内核&#xff0c;目前很多网站都不支持IE了&…

深度学习(二)框架与工具:开启智能未来之门(2/10)

一、深度学习框架&#xff1a;引领智能变革的利器 深度学习框架在人工智能领域中扮演着至关重要的角色&#xff0c;堪称引领智能变革的利器。随着人工智能技术的飞速发展&#xff0c;深度学习框架不断崛起并迅速壮大。 主流的深度学习框架如 TensorFlow、PyTorch、Keras 等&a…

社招高频面试题

1.单例模式 面试突击50&#xff1a;单例模式有几种写法&#xff1f; 2.Mybatis缓存机制 MyBatis的一、二级缓存查询关系 一级缓存是SqlSession级别&#xff0c;不能跨SqlSession共享&#xff0c;默认开启。 二级缓存是基于mapper namespace级别的&#xff0c;可以跨SqlSessi…