目录一、初始MVC二、SpringMVC三、Spring MVC的运用?@RequestMapping?传递参数1、传递单个参数?2、传递多个参数3、参数重命名4、传递数组与集合5、获取路径参数6、传递JSON数据7、上传文件* *一、初始MVC-------MVC(Model-View-Controller)是一种软件架构模式,主要用于简化复杂的应用程序开发过程,尤其是在Web应用中。将软件系统分成了模型、视图和控制器三个基本部分
模型(Model)> 模型是应用程序中用于处理应用程序数据逻辑的部分。它直接管理数据、逻辑和规则,并且与数据库交互。通常包含业务逻辑和业务数据。*视图(View)> 视图是应用程序中处理数据显示的部分。任何可以输出最终用户结果的界面都是视图的一部分。视图负责呈现数据给用户,并且不包含任何业务逻辑。*控制器(Controller)> 控制器是应用程序中处理用户交互的部分。它接收用户的输入并调用模型和视图去完成用户的需求。简单来说,控制器就是模型和视图之间的协调者。一个简单的MVC模式示例:假设有一个学生管理系统,其中包含学生的姓名、年龄等信息。模型:定义了学生的属性和方法,如获取学生信息、更新学生信息等。视图:负责展示学生的详细信息,可能是一个网页表格或者一个对话框。控制器:处理用户事件(如点击按钮),更新学生信息,并告诉视图重新显示更新后的信息。二、SpringMVC-----------Spring MVC 是 Spring 框架的一个模块,专注于Web应用的表示层。它就是基于 MVC 架构模式的实现,用于构建灵活且松耦合的Web应用程序。总的来说,Spring MVC就是一个实现了 MVC 模式,并继承了 Servlet API 的 Web 框架*。> Spring MVC 全称是 Spring Web MVC不过Spring在实现MVC时, 也结合项的特点, 做了些改变, 相对, 下这个图或许更加合适些
> ??其实就相当于去饭店吃饭时,直接在 前台 (控制器)点单 (提出需求),前台 将需求传递给 后厨 (模型),由 后厨负责把菜做好 (处理需求),做好了返回给 前台,再叫 服务员 (视图) 把菜端给客户 (显示结果)三、Spring MVC的运用---------------#### @RequestMapping**
@RequestMapping** 是 Spring 框架中的一个核心注解,它是来注册接的路由映射的> 路由映射(Routing):是指当访问个 URL 时,映射 Web 请求到应用程序中特定的处理类或处理方法上的过程>@RequestMapping既可修饰类,也可以修饰法 ,当修饰类和法时,访问的地址是类路径 + 法路径 @RequestMapping(“/user”) @RestController public class UserController { @RequestMapping(“/hello”) public String say(){ return “hello, Spring MVC”; } }*@RequestMapping是GET还是POST请求?让我们用ApiFox测试一下:发送GET请求:
发送 POST 请求:
从测试结果可以看出:@RequestMapping 既持GET请求,持POST请求。同理,也持其他的请求式。可以说这个注解就是一个万金油了,不知道对方会发啥请求,用这个就对了。* 不过,在一些需求中,需要指定好用户发送的请求类型。我们也可以通过参数 method 来限定请求类型: @RequestMapping(“/user”) @RestController public class UserController { @RequestMapping(value=“/hello”,method = RequestMethod.POST) public String say(){ return “hello, Spring MVC”; } }这时在发送GET请求就会出现错误:
> 这里报了个 405 的错误,错误原因是“Method Not Allowed”,也就是 方法不支持,其实就是服务端没有能处理这个GET请求的方法。> > 遇到错误不要慌,我们今后还会遇到各种各样的错误的,多遇到几次,熟悉熟悉就好了??> Spring 还提供了@PostMapping()、@GETMapping()、@PUTMapping()、@DELETEMapping()等方法注解,用来针对某一应用场景。实际开发中使用@RequestMapping还是其它注解功能上其实没啥区别,还是看具体的公司规范和个人习惯来选择使用*#### 传递参数##### 1、传递单个参数接收单个参数, 在 Spring MVC 中直接法中的参数就可以,如以下代码: @RequestMapping(“/user”) @RestController public class UserController { @RequestMapping(“/hello”) public String say(String name){ return “hello, “+name; } }
可以看到,后端程序正确拿到了name参数的值。> Spring MVC 会根据法的参数名, 找到对应的参数, 赋值给法> >
如果参数不一致就会出现,就会导致无法获取参数:
> 注意:> > * 如果采用包装类型接收参数时,如果不传参数的话,由于包装类型会有初始值,所以并不会出现报错,而是会返回默认的 null值> * 如果采用基本类型来接收参数时,如果不穿参数的话(boolean 类型除外),就会报500错误。因为基本类型没有被初始化。让我们看看下面这个代码: @RequestMapping(”/user”) @RestController public class UserController { @RequestMapping(“/age”) public String age(int age){ return "age: "+age; } }正常传参:
> 程序正常响应,HTTP响应状态码为200不传参:
> 程序发送错误,HTTP状态码为500传递错误参数:
> 程序发生错误,这里要的是int型参数,但传来的确是字符串,类型不匹配。HTTP状态码为400因此在实际开发中,对于参数可能为空的数据,还是建议用包装类型,相对没那么容易出错。##### 2、传递多个参数直接使用多个形参接收: @RequestMapping(“/user”) @RestController public class UserController { public String login(String username,String password){ return "username: “+username+” password: "+password; } }
> 注意:> > 这里路径上参数的顺序并不用和服务端一一对应,主要是采用键值对的形式,一参数的名称进行匹配的,参数的顺序并不会影响后端获取参数。不过,与单个参数时类似,路径上参数的名字必须与后端方法中的形参名称保持一致,程序才能正确读写。不写或错写都会导致后端无法正常匹配参数。同样的,如果参数里有基本类型但没有成功接收参数,就会出现 400 错误,如果是包装类型参数未接收就会为默认的 null值,这里就不做演示了。采用对象传参如果参数比较多,就需要在方法声明中协议很多形参,这对代码的书写与维护都是不太友好的。因此,我们可以将这些参数封装成一个对象:Spring MVC 可以动实现对象参数的赋值,如 User对象: public class User { private String name; private String password; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return “Student{” + “name='” + name + ‘’’ + “, password='” + password + ‘’’ + ‘}’; } } 就可以将形参换为自定义对象了: @RequestMapping(“/user”) @RestController public class UserController { @RequestMapping(“/login”) public String login(User user){ return user.toString(); } }路径中的参数要与对应类的成员变量名保持一致:
Spring 会根据参数名称动绑定到对象的各个属性上,如果某个属性未传递,则赋值为null(基本类型则赋值为默认初识值,如int类型的属性,会被赋值为0)##### 3、参数重命名在一些应用场景中,我们并不希望直接使用前端传来的参数名进行接收,就可以用 @RequestParam(" “) 注解来进行参数的重命名: @RequestMapping(”/user") @RestController public class UserController { @RequestMapping(“/time”) public String getTime(@RequestParam(“time”) String createtime){ return "createtime: "+createtime; } }正常传参:
同样的,这时传递错误的参数名也会报 400 :
> 说明使 @RequestParam 进参数重命名时,请求参数只能和 @RequestParam 声明的名称致,才能进参数绑定和赋值不同的是,此时不传参也会报 400 :
> 因为这时当形参前加上 @RequestParam() 注解时,该参数会默认变成必传参数,如果不传就会发生错误。而有的时候业务上该参数可能是一个非必传参数,我们就可以通过设置@RequestParam 中的required 来进行调整。required默认为true,表示为必传参数。当把required设置为false时,就是非必传参数了: @RequestMapping(“/user”) @RestController public class UserController { @RequestMapping(“/time”) public String getTime(@RequestParam(value=“time”,required=false) String createtime){ return “createtime: “+createtime; } }不传参:
传错参:
> 这样设置后,即使不传参也不会报 400了。##### 4、传递数组与集合Spring MVC 可以动绑定数组参数的赋值: @RequestMapping(”/user”) @RestController public class UserController { @RequestMapping(“/array”) public String getArray(String[] array){ return Arrays.toString(array); } }在url上有两种传参方式:方式一
方式二
类似的,Spring MVC 可以动绑定集合参数的赋值,不过需要通过使 @RequestParam 绑定参数关系: @RequestMapping(“/user”) @RestController public class UserController { @RequestMapping(“/list”) public String getList(@RequestParam List list){ return “size:”+list.size()+" list:“+list; } }这样就能像获取数组一样将多个参数名一致的请求自动自动封装成集合类了:
> 默认情况下,请求中参数名相同的多个值,是封装到数组。如果要封装到集合,要使> > @RequestParam 绑定参数关系##### 5、获取路径参数所谓路径参数就是指不以键值对的形式直接出现在url中的参数,举个栗子:
上面这个url中的 “1” 就是一个路径参数。让我们先来试试直接接收会发生什么: @RequestMapping(”/user") @RestController public class UserController { @RequestMapping(“/text/{id}”) public String getId(Integer id){ return “id:”+id; } }> 注意:路径参数的url我们需要用 { } 来包裹起来
我们发现后端并不能够拿到路径参数。我们需要使用 @PathVariable 注解与请求URL路径上的数据绑定: @RequestMapping(“/user”) @RestController public class UserController { @RequestMapping(“/text/{id}”) public String getId(@PathVariable Integer id){ return “id:”+id; } }这样就能成功获取路径参数了:
* 获取多个路径参数: @RequestMapping(“/user”) @RestController public class UserController { @RequestMapping(“/text/{id}/{name}”) public String getId(@PathVariable Integer id,@PathVariable String name){ return “id:”+id+" name:“+name; } }
> 注意:如果后端要获取多个路径参数时,每个参数都会变成必传参数,因为后端无法判别是哪个路径参数没有传递,就会发生错误##### 6、传递JSON数据接收JSON对象, 需要使 @RequestBody 注解RequestBody: 请求正,意思是这个注解作在请求正的数据绑定,请求参数必须在写在请求正中我们先试试不加 @RequestBody 注解直接接收 JSON 对象会发生什么:
我们会发现后端并不能成功成功读取 JSON 对象。再用Fiddler抓包看看:
我们可以看到,JSON 对象的确成功传过去了。但后端却把 JSON 字符串当成了一个不可拆分的整体,所以这样拿不到传递的参数。让我们再加上 @RequestBody 注解试试看: @RequestMapping(”/user") @RestController public class UserController { @RequestMapping(“/login”) public String login(@RequestBody User user){ return user.toString(); } }
> 由此我们可以得出,当后端需要接收 JSON 对象时,需要在形参前加上 @RequestBody 注解,才能正确接收。##### 7、上传文件主要通过@RequestPart(“file”) 注解来实现: @RequestMapping(“/user”) @RestController public class UserController { @RequestMapping(“/file”) public String getFile(@RequestPart(“file”)MultipartFile file) throws IOException { //获取文件名称 String fileName=file.getOriginalFilename(); //将文件上传至指定路径下 file.transferTo(new File(“D:/picture/”+fileName)); return “文件名称:”+fileName; } }
可以看到后端成功获取了文件的名称。在去指定路径下看看文件是否上传成功:
> 注意:如果文件过大就会导致上传失败了* * *> 那么本篇文章就到此为止了,如果觉得这篇文章对你有帮助的话,可以点一下关注和点赞来支持作者哦。如果有什么讲的不对的地方欢迎在评论区指出,希望能够和你们一起进步
【Spring】详解SpringMVC,一篇文章带你快速入门
张小明
前端开发工程师
从OpenAI医疗布局到工程实践:构建合规的医疗AI助手原型
最近科技圈里热度很高的一件事,就是山姆阿尔特曼开始亲自下场为 OpenAI 的医疗健康项目招揽人才。对于一家以 AGI 为终极目标的研究机构来说,“创始人亲自拉人”往往意味着某个方向已经被提升到了战略级。更值得关注的是,OpenAI 押注的并不是…
基于i.MX8QM的Xen嵌入式虚拟化:多系统隔离与异构多核实践
嵌入式圈子里聊到“虚拟化”,以前总觉得是服务器和云平台的事,离单片机、嵌入式板卡很遥远。但是这两年风向明显变了,iWave这次拿自家基于NXP i.MX8QM的系统级模块(SOM)跑通了Xen虚拟化,而且做了公开演示,这消息对做汽…
蓝桥杯矩阵计数题解:状压DP解决复杂约束组合问题
1. 项目概述:从“矩阵计数”到“状压DP”的思维跃迁看到“蓝桥杯2019国赛 - 矩阵计数”这个标题,很多参加过算法竞赛的朋友可能会心一笑,或者眉头一皱。这绝对是一道能让人印象深刻的题目,它完美地体现了蓝桥杯国赛题目的典型风格…
把肿瘤微环境读清楚:六个趋化因子(MIP-1α/SDF-1/IP-10/RANTES/CXCL1/MIP-1β)与一次 luminex 多因子检测的距离
清晨,武汉汉阳一间生物实验室里,离心机低鸣。技术员把一批肿瘤患者血清样本排进 96 孔板,加样、孵育、洗板、重悬,三个半小时后,MIP-1α、SDF-1、IP-10、RANTES、CXCL1、MIP-1β 六个趋化因子的浓度图谱同步出炉。放在…
kail 2020.1VM镜像登录时默认用户名密码以及切换root用户,获取root权限问题
更多原创作品请移步:https://www.365tofree.com/2020.1 VM版本的镜像使用新的默认用户名和密码:kali/kali。但是没有root权限,很多操作受限制。切换root: 1、输入命令 sudo su -2、输入默认密码:kali 3、切换成功
Python电商数据分析引擎:从Pandas处理到自动化报告实战
简介:数据分析是现代商业决策的核心,其本质是从海量数据中提取有价值的信息。其基本原理通常遵循ETL(抽取、转换、加载)流程,通过数据清洗、聚合计算和可视化,将原始数据转化为可操作的商业洞察。在技术层面…