SpringMVC基础
SpringWebMVC是基于ServletAPI构建的原始Web框架,从⼀开始就包含在Spring框架中。
MVC理论基础
MVC是ModelViewController的缩写,它是软件⼯程中的⼀种软件架构设计模式,它把软件系统分为模型、视图和控制器三个基本部分
- View(视图)指在应⽤程序中专⻔⽤来与浏览器进⾏交互,展⽰数据的资源
- Model(模型)是应⽤程序的主体部分,⽤来处理程序中数据逻辑的部分
- Controller(控制器)可以理解为⼀个分发器,⽤来决定对于视图发来的请求,需要⽤哪⼀个模型来处理,以及处理完后需要跳回到哪⼀个视图,⽤来连接视图和模型
Spring在实现MVC时,也结合⾃⾝项⽬的特点,做了⼀些改变:
学习SpringMVC重点也就是学习如何通过浏览器和⽤⼾程序进⾏交互
主要分以下三个⽅⾯:
- 建⽴连接:将⽤⼾/浏览器和Java程序连接起来,也就是访问⼀个地址能够调⽤到我们的Spring程序
- 请求:⽤⼾请求的时候会带⼀些参数,在程序中要想办法获取到参数,所以请求这块主要是获取参数的功能
- 响应:执⾏了业务逻辑之后,要把程序执⾏的结果返回给⽤⼾,也就是响应
第一个SpringMVC程序
在SpringMVC中使⽤ @RequestMapping 来实现URL路由映射
创建⼀个UserController类:
@RestController public class HelloController { @ResponseBody @RequestMapping("/") public String hello() { return "Hello,world"; } }
效果:
请求
@RequestMapping
@RequestMapping 是⽤来注册接⼝的路由映射的
当⽤⼾访问⼀个URL时,将⽤⼾的请求对应到程序中某个类的某个⽅法的过程就叫路由映射
@RequestMapping即可修饰类,也可以修饰⽅法:
- @RequestMapping标识⼀个类:设置映射请求的请求路径的初始信息
- @RequestMapping标识⼀个⽅法:设置映射请求请求路径的具体信息
- 当修饰类和⽅法时,访问的地址是类路径+⽅法路径
注意:
- @RequestMapping 的URL路径也可以是多层路径
- @RequestMapping的URL路径最前⾯加不加 / (斜杠)都可以,Spring程序启动时,如果前⾯没有加会拼接上 /
- @RequestMapping 既⽀持Get请求,⼜⽀持Post请求,也⽀持其他的请求⽅式
指定GET/POST⽅法类型:
@RequestMapping(value = "/getRequest",method= RequestMethod.GET) @RequestMapping(value = "/postRequest",method= RequestMethod.POST)
传递单参
接收单个参数,在SpringMVC中直接⽤⽅法中的参数就可以
@RestController public class HelloController { @ResponseBody @RequestMapping("/") public String hello(String name) { return "Hello,world"+name; } }
注意:
- 使⽤基本类型来接收参数时,参数必须传(除boolean类型),否则会报500错误;类型不匹配时,会报400错误
- 对于包装类型,如果不传对应参数,Spring接收到的数据则为null
- 对于参数可能为空的数据,建议使⽤包装类型
传递多参
和接收单个参数⼀样,直接使⽤⽅法的参数接收即可
@RestController public class HelloController { @ResponseBody @RequestMapping("/") public String hello(String name,int age) { return "Hello,world"+name+age; } }
注意:
前后端进⾏参数匹配时,是以参数的名称进⾏匹配的,因此参数的位置是不影响后端获取参数的结果
传递对象
如果参数⽐较多时,⽅法声明就需要有很多形参,并且后续每次新增⼀个参数,也需要修改⽅法声明,这样不利于代码的维护
可以将这些参数封装为⼀个对象,SpringMVC可以⾃动实现对象参数的赋值
@Data public class Person { String name; String sex; int age; } @RestController public class HelloController { @ResponseBody @RequestMapping("/") public String hello(Person person) { return "Hello,world person:"+ person.getName()+person.getAge()+person.getSex(); } }
注意:
Spring会根据参数名称⾃动绑定到对象的各个属性上,如果某个属性未传递,则赋值为null(基本类型则赋值为默认初识值,⽐如int类型的属性,会被赋值为0)
传递数组和集合
SpringMVC可以⾃动绑定数组参数的赋值
@RequestMapping("/m2") public String m2(String[] str) { return "Hello,world str:"+ Arrays.toString(str); }
集合参数:和数组类似,需要使⽤ @RequestParam 绑定参数关系
默认情况下,请求中参数名相同的多个值,是封装到数组;如果要封装到集合,要使⽤@RequestParam 绑定参数关系
@RequestMapping("/m3") public String m3(@RequestParam List<String> str) { return "Hello,world str:"+ str; }
传递JSON数据
JSON的语法:
- 数据在 键值对(Key/Value) 中
- 数据由逗号 , 分隔
- 对象⽤ {} 表⽰
- 数组⽤ [] 表⽰
- 值可以为对象,也可以为数组,数组中可以包含多个对象
JSON优点:
- 简单易⽤:语法简单,易于理解和编写,可以快速地进⾏数据交换
- 跨平台⽀持:JSON可以被多种编程语⾔解析和⽣成,可以在不同的平台和语⾔之间进⾏数据交换和传输
- 轻量级:相较于XML格式,JSON数据格式更加轻量级,传输数据时占⽤带宽较⼩,可以提⾼数据传输速度
- 易于扩展:JSON的数据结构灵活,⽀持嵌套对象和数组等复杂的数据结构,便于扩展和使⽤
- 安全性:JSON数据格式是⼀种纯⽂本格式,不包含可执⾏代码,不会执⾏恶意代码,因此具有较⾼的安全性
基于以上特点,JSON在Web应⽤程序中被⼴泛使⽤,如前后端数据交互、API接⼝数据传输等
接收JSON对象,需要使⽤ @RequestBody 注解:
@RequestMapping("/m4") public String m4(@RequestBody Person person) { return "Hello,world person:"+ person; }
@RequestParam
前端传递的参数key和我们后端接收的key可以不⼀致,可以使⽤ @RequestParam 来重命名前后端的参数值,进行构建映射关系
@ResponseBody @RequestMapping("/m1") public String m1(@RequestParam("name") String str) { return "Hello,world name:"+ str; }
注意:
- 使⽤ @RequestParam 进⾏参数重命名时,请求参数只能和 @RequestParam 声明的名称⼀致,才能进⾏参数绑定和赋值
- 使⽤ @RequestParam 进⾏参数重命名时,参数就变成了必传参数
分析注解:
@Target({ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface RequestParam { @AliasFor("name") String value() default ""; @AliasFor("value")//起别名 String name() default ""; boolean required() default true;//默认开启必传 String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";//默认数值 }
设置非必传参数:
@RequestMapping("/m1") public String m1(@RequestParam(value = "name",required = false) String str) { return "Hello,world name:"+ str; }