【JavaEE】Spring Web MVC
此篇博客结尾附有此篇博客的全部代码!!!
一、什么是Spring Web MVC
Spring Web MVC 是 Spring 框架中用于构建 Web 应用程序的模块,它是基于 Java 的轻量级 Web 框架,遵循经典的 Model-View-Controller(模型-视图-控制器)设计模式。
1.1 MVC
MVC 是 Model View Controller 的缩写,它是软件⼯程中的⼀种软件架构设计模式,它把软件系统分为模型、视图和控制器三个基本部分.
- View(视图): 视图是用户界面,负责将数据呈现给用户。
- Model(模型) :模型是应用程序的核心,负责处理数据和业务逻辑。
- Controller(控制器):控制器是模型和视图之间的桥梁,负责处理用户输入和业务逻辑。
1.2 Spring MVC
MVC 是⼀种架构设计模式, 也是⼀种思想, ⽽ Spring MVC 是对 MVC 思想的具体实现.除此之外, Spring MVC还是⼀个Web框架,总结来说,Spring MVC 是⼀个实现了MVC 模式的 Web 框架,专门用于开发基于 Java 的 Web 应用。
1.3 Spring web
既然是Web 框架, 那么当⽤⼾在浏览器中输⼊了 url 之后,我们的 Spring MVC 项⽬就可以感知到⽤⼾的请求, 并给予响应。
学习Spring MVC主要从以下三个方面学习:
- 建立连接
- 请求
- 响应
二、注释学习及使用
2.1 @RequestMapping注解
@RequestMapping 是 Spring Web MVC 应⽤程序中最常被⽤到的注解之⼀,它是⽤来注册接⼝的
路由映射的.表⽰服务收到请求时, 路径为 /sayHi 的请求就会调⽤ sayHi 这个⽅法的代码.
路由映射: 当⽤⼾访问⼀个 URL 时, 将⽤⼾的请求对应到程序中某个类的某个⽅法的过程就叫路由映射.
@RequestMapping 既可修饰类,也可以修饰⽅法 ,当修饰类和⽅法时,访问的地址是类路径 + ⽅法路径.
@RestController
@RequestMapping("/RequestMapping")
public class RequestMappingDemo {
@RequestMapping("/r1")
public String r1(){
return "r1";
}
}
运行结果:
注意:
@RequestMapping 的URL 路径最前⾯加不加 / (斜杠)都可以, Spring程序启动时, 会进⾏判断, 如果前面没加 / ,spring会自动拼接一个 /
@RestController
@RequestMapping("RequestMapping")
public class RequestMappingDemo {
@RequestMapping("r1")
public String r1(){
return "r1";
}
}
这里还是可以运行成功的!
@RequestMapping请求设置
这里给大家介绍一个工具Postman(Postman就是专门测试后端代码的,可以发送不同的请求)。
这样设置之后,就只能支持POST请求或者只支持GET请求。
2.2 请求
客户端(如浏览器或移动应用)向服务器发送请求,服务器处理请求并返回响应的过程。在 Java Web 开发中,尤其是使用 Spring 框架时,请求处理是一个核心概念。
访问不同的路径, 就是发送不同的请求. 在发送请求时, 可能会带⼀些参数, 所以学习Spring的请求,主要是学习如何传递参数到后端以及后端如何接收.
传递参数, 咱们主要是使⽤浏览器和Postman来模拟.
2.3 传递单个参数
@RequestMapping("Demo")
@RestController
public class Demo1 {
@RequestMapping("r1")
public String r1(String name){
return "返回参数:"+name;
}
}
2.4 传递多个参数
@RequestMapping("r2")
public String r2(String name,Integer age){
return "返回姓名:" + name + "返回年龄:"+ age;
}
2.4 传递对象
public class Person {
private String name;
private int age;
public Person(String name, int age) {
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
@RequestMapping("r3")
public String r3(Person person){
return person.toString();
}
2.5 @RequestParam注解 后端参数重命名
@RequestParam 的主要作用是从 HTTP 请求中提取参数值,并将其传递给控制器方法的参数。
@RequestMapping("r4")
public String r4(@RequestParam("n") String name){
return "返回参数" + name;
}
@RequestMapping("r4")
public String r4(@RequestParam(value = "n",required = false) String name){
return "返回参数" + name;
}
这样设置之后,n就不是必传参数了!
2.6 传递数组
@RequestMapping("r6")
public String r6(String[] str){
return Arrays.toString(str);
}
用postman传递数组,红框和绿框传递方式都可以。
2.7 传递集合,@RequestParam
集合参数:和数组类似, 同⼀个请求参数名有为多个, 且需要使⽤ @RequestParam 绑定参数关系
@RequestMapping("r7")
public String r6(@RequestParam ArrayList<String> array){
return array.toString();
}
2.8 传递JSON数据
JSON就是⼀种数据格式, 有⾃⼰的格式和语法, 使⽤⽂本表⽰⼀个对象或数组的信息, 因此JSON本质是字符串. 主要负责在不同的语⾔中数据传递和交换.
语法:
- 数据在 键值对(Key-Value) 中
- 数据由逗号, 分隔
- 对象⽤ { } 表⽰
- 数组⽤ [ ] 表⽰
- 值可以为对象, 也可以为数组, 数组中可以包含多个对象
- 键key和值value之间通过冒号分割
- 键值对之间使用逗号分割
测试Java对象和JSON转换
用test类来测试一下(下面图片有详细创建及测试):
@Test注释:
- @Test 用于标记测试方法。
- 测试方法必须是 public 和 void 类型,且不能接受任何参数。
ObjectMapper 是 Jackson 库中的一个核心类,用于处理 JSON 数据的序列化(将对象转换为 JSON 字符串)和反序列化(将 JSON 字符串转换为对象)。
使用类ObjectMapper下面的writeValueAsString方法。类对象必须要有无参构造函数。
import com.abcdefg.springmvc.demo.Person;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
public class TestJson {
@Test
void r8() throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
//创建对象
Person person = new Person();
person.setAge(1);
person.setName("zhangsan");
//对象转JSON
String j = objectMapper.writeValueAsString(person);
System.out.println(j);
}
@Test
void r9() throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
//JSON
String s = "{\"name\":\"John\",\"age\":30}";
//JSON转对象
Person person = objectMapper.readValue(s, Person.class);
System.out.println(person.toString());
}
}
JSON传参
实现JSON对象交互要使用@RequestBody注解:
@RequestBody: 请求正⽂,意思是这个注解作⽤在请求正⽂的数据绑定,请求参数必须在写在请求正⽂中
@RequestMapping("r8")
public String r8(@RequestBody Person person){
return person.toString();
}
JSON优点
- 简单易⽤: 语法简单,易于理解和编写,可以快速地进⾏数据交换
- 跨平台⽀持: JSON可以被多种编程语⾔解析和⽣成, 可以在不同的平台和语⾔之间进⾏数据交换和传输
- 轻量级: 相较于XML格式, JSON数据格式更加轻量级, 传输数据时占⽤带宽较⼩, 可以提⾼数据传输速度
- 易于扩展: JSON的数据结构灵活,⽀持嵌套对象和数组等复杂的数据结构,便于扩展和使⽤
- 安全性: JSON数据格式是⼀种纯⽂本格式,不包含可执⾏代码, 不会执⾏恶意代码,因此具有较⾼的安全性
2.9 获取URL中参数@PathVariable
和字⾯表达的意思⼀样, 这个注解主要作⽤在请求URL路径上的数据绑定
@RequestMapping("/article/{id}/{he}")
public String r9(@PathVariable Integer id, @PathVariable("he") String type){
return id+":"+type;
}
2.10 上传文件@RequestPart
MultipartFile 是 Spring 提供的一个接口,用于封装上传文件的相关信息,例如文件名、文件内容、文件大小等。
@RequestMapping("r10")
public String r10(@RequestPart("file") MultipartFile file) throws IOException {
file.transferTo(new File("D:/Project/pic/tmp/"+ file.getOriginalFilename()));
return file.getOriginalFilename();
}