Spring Web MVC⼊⻔

目录

[1. 什么是 Spring Web MVC?](#1. 什么是 Spring Web MVC?)

[2.Spring MVC](#2.Spring MVC)

2.1项⽬准备

[2.2建⽴连接,@RequestMapping 注解介绍](#2.2建⽴连接,@RequestMapping 注解介绍)

3.传参介绍

3.1传递单个参数

3.2传递多个参数

3.3传递对象

3.4后端参数重命名

3.5传递数组

3.6传递集合

[3.7 传递JSON数据](#3.7 传递JSON数据)

3.8获取URL中参数@PathVariable

3.9上传⽂件@RequestPart

4.响应

4.1返回静态⻚⾯

4.2返回数据@ResponseBody

4.3返回HTML代码⽚段

4.4返回JSON

4.5设置状态码


1. 什么是 Spring Web MVC?

Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中。它的 正式名称"Spring Web MVC"来⾃其源模块的名称(Spring-webmvc),但它通常被称为"Spring MVC".
1.什么是Servlet呢?
Servlet 是⼀种实现动态⻚⾯的技术. 准确来讲Servlet是⼀套 Java Web 开发的规范,或者说是⼀套
Java Web 开发的技术标准.(只有规范并不能做任何事情)

2.MVC 是什么?

它是软件⼯程中的⼀种软件架构设计模式,它把软件系统分 为模型、视图和控制器三个基本部分

3.什么是Spring MVC ?

MVC是一种思想,Spring MVC就是把 MVC思想进行了实现。Spring MVC 是⼀个实现了 MVC 模式的 Web 框架


2.Spring MVC

2.1项⽬准备

注意:我使用的是JDK17.
Spring MVC 项⽬创建和 Spring Boot 创建项⽬相同,在创建的时候选择 Spring Web 就相当于创建了 Spring MVC 的项⽬.

2.2建⽴连接,@RequestMapping 注解介绍

在 Spring MVC 中使⽤ @RequestMapping 来实现 URL 路由映射 ,也就是浏览器连接程序的作⽤
实现⽤⼾通过浏览器和程序的交互,具体实现代码如下:

复制代码
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class RequestController {
    @RequestMapping("say")
    public String say() {
        return "hi Spring MVC";
    }
}

接下来访问: http://127.0.0.1:8080/say , 就可以看到程序返回的数据了

@RequestMapping 注解介绍

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

什么是路由映射?

当⽤⼾访问⼀个 URL 时, 将⽤⼾的请求对应到程序中某个类的某个⽅法的过程就叫路由映射.

说明:

  1. @RequestMapping 既可修饰类,也可以修饰⽅法 ,当修饰类和⽅法时,访问的地址是类路径 + ⽅ 法路径.
    @RequestMapping标识⼀个类:设置映射请求的请求路径的初始信息
    @RequestMapping标识⼀个⽅法:设置映射请求请求路径的具体信息

2.@RequestMapping 的URL 路径最前⾯加不加 / (斜杠)都可以, Spring程序启动时, 会进⾏判断, 如果 前⾯没有加 / , Spring会拼接上⼀个 /

3.@RequestMapping 既⽀持Get请求, ⼜⽀持Post请求. 同理, 也⽀持其他的请 求⽅式.

3.传参介绍

我们借用postman工具

3.1传递单个参数

接收单个参数, 在 Spring MVC 中直接⽤⽅法中的参数就可以,⽐如以下方法的代码:

复制代码
@RequestMapping("r1")
    public String r1(Integer age) {
        return "返回参数:" + age;
    }

结果:

注意:

1.对于包装类型, 如果不传对应参数,Spring 接收到的数据则为null
2. 但如果形参是基础类型如果不传对应参数,则HTTP响应状态码为400

3.2传递多个参数

和接收单个参数⼀样, 直接使⽤⽅法的参数接收即可. 使⽤多个形参

复制代码
@RequestMapping("r3")
    public String r3(String name, Integer age) {
        return "返回参数name:" + name + "age:" + age;
    }

结果:

注意:
当有多个参数时,前后端进⾏参数匹配时,是以参数的名称进⾏匹配的,因此参数的位置是不影响后 端获取参数的结果,多传也无妨,少传看情况。

3.3传递对象

如果参数⽐较多时, ⽅法声明就需要有很多形参. 并且后续每次新增⼀个参数, 也需要修改⽅法声明.
我们不妨把这些参数封装为⼀个对象
比如我们封装一个学生类:

复制代码
public class Student {
    private Integer id;
    private String name;
    private Integer age;

    public Student(Integer id, String name, Integer age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

和接收单个参数⼀样, 直接使⽤⽅法的参数接收即可.

结果:
Spring 会根据参数名称⾃动绑定到对象的各个属性上, 如果某个属性未传递, 则赋值为null(基本类型则 赋值为默认初识值, ⽐如int类型的属性, 会被赋值为0)

3.4后端参数重命名

某些特殊的情况下,前端传递的参数 key 和我们后端接收的 key 可以不⼀致

复制代码
 @RequestMapping("r5")
    public String r5(@RequestParam("name") String username){
        return "返回参数:" + username;
    }

注意:

  1. 使⽤ @RequestParam 进⾏参数重命名时, 请求参数只能和 @RequestParam 声明的名称⼀
    致, 才能进⾏参数绑定和赋值。

  2. 使⽤ @RequestParam 进⾏参数重命名时, 参数就变成了必传参数。

  3. ⾮必传参数设置

    复制代码
     @RequestMapping("r5")
     public String r5(@RequestParam(value = "name",required = false) String username){
         return "返回参数:" + username;
     }
3.5传递数组

Spring MVC 可以⾃动绑定数组参数的赋值
后端实现代码:

复制代码
    @RequestMapping("r6")
    public String r6(String[] s){
        return  Arrays.toString(s);
    }

数组传参方式:

1.http://127.0.0.1:8080/r6?s=aaa,bbb,ccc

2.http://127.0.0.1:8080/r6?s=aaa&s=bbb&s=ccc

3.6传递集合

集合参数:和数组类似, 同⼀个请求参数名有为多个, 且需要使⽤ @RequestParam 绑定参数关系

复制代码
    @RequestMapping("r7")
    public String r7(@RequestParam(required = false)List<String> list){
        return "返回参数:"+list;
    }

结果:

3.7 传递JSON数据

JSON:理解成一种数据格式就好。
JSON的语法:

1.数据在 键值对 (Key/Value) 中
2.数据由逗号 , 分隔
3. 对象⽤ {} 表⽰
4. 数组⽤ [] 表⽰
5.值可以为对象, 也可以为数组, 数组中可以包含多个对象
JSON的两种结构

  1. 对象: ⼤括号 {} 保存的对象是⼀个⽆序的 键值对 集合. ⼀个对象以左括号 { 开始, 右括号 } 结束。每个"键"后跟⼀个冒号 : ,键值对使⽤逗号 , 分隔
  2. 数组: 中括号 [] 保存的数组是值(value)的有序集合. ⼀个数组以左中括号 [ 开始, 右中括 号 ] 结束,值之间使⽤逗号 , 分隔

以下都是合法的JSON数据

复制代码
{"name":"admin","age":18}
["hello", 3.1415, "json"]
[{"name":"admin","age":18},{"name":"root","age":16},{"name":"张三","age":20}]

可以使⽤在线JSON格式化⼯具来进⾏校验和书写: 在线JSON校验格式化工具(Be JSON)https://www.bejson.com/
JSON优点:

1.简单易⽤: 语法简单,易于理解和编写,可以快速地进⾏数据交换
2.跨平台⽀持: JSON可以被多种编程语⾔解析和⽣成, 可以在不同的平台和语⾔之间进⾏数据交换和 传输
3.轻量级: 相较于XML格式, JSON数据格式更加轻量级, 传输数据时占⽤带宽较⼩, 可以提⾼数据传输 速度
4.易于扩展: JSON的数据结构灵活,⽀持嵌套对象和数组等复杂的数据结构,便于扩展和使⽤
5.安全性: JSON数据格式是⼀种纯⽂本格式,不包含可执⾏代码, 不会执⾏恶意代码,因此具有较⾼ 的安全性
基于以上特点, JSON在Web应⽤程序中被⼴泛使⽤, 如前后端数据交互、API接⼝数据传输等.

代码:

复制代码
    @RequestMapping("r8")
    public String r8(@RequestBody Student student) {
        return "返回参数:" + student.toString();
    }

结果:

3.8获取URL中参数@PathVariable

和字⾯表达的意思⼀样, 这个注解主要作⽤在请求URL路径上的数据绑定
默认传递参数写在URL上,SpringMVC就可以获取到
代码:

复制代码
    @RequestMapping("r9/{id}/{name}")
    public String r9(@PathVariable Integer id, @PathVariable("name") String username) {
        return "返回参数 id:" + id + " username: " + username;
    }

结果:

说明:

1.如果⽅法参数名称和需要绑定的URL中的变量名称⼀致时, 可以简写, 不⽤给@PathVariable的属性赋 值, 如上述例⼦中的id变量
2.如果⽅法参数名称和需要绑定的URL中的变量名称不⼀致时, 需要@PathVariable的属性value赋值, 如上述例⼦中的userName变量

3.9上传⽂件@RequestPart

代码:

复制代码
    @RequestMapping("r10")
    public String r10(@RequestPart("file") MultipartFile file) {
        String name = file.getOriginalFilename();
        return "文件名:" + name;
    }

结果:


4.响应

4.1返回静态⻚⾯

创建前端⻚⾯ /html/index.html(注意路径)

html代码如下:

复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>静态页面</title>
</head>
<body>
   <h1>你好,我是静态页面!!!</h1>
</body>
</html>

Spring MVC如何才能识别出来 /html/index.html 是⼀个静态⻚⾯,而不是一个字符串?

使用@Controller注解,代码如下:

复制代码
@RequestMapping("res")
@Controller
public class ResponseController {

    @RequestMapping("index")
    public String index() {
        return "/html/index.html";
    }
}

结果:

4.2返回数据@ResponseBody

@ResponseBody 表⽰返回数据
加上 @ResponseBody 注解, 该⽅法就会把 "/html/index.html" 当做⼀个数据返回给前端。

复制代码
@RequestMapping("res")
@Controller
public class ResponseController {

    @RequestMapping("indexData")
    @ResponseBody
    public String indexData() {
        return "/html/index.html";
    }
}

说明:

@ResponseBody 既是类注解, ⼜是⽅法注解。
如果作⽤在类上, 表⽰该类的所有⽅法, 返回的都是数据, 如果作⽤在⽅法上, 表⽰该⽅法返回的是数据

多个注解时, 没有先后顺序, 先写哪个都可以

补充:

@RestController = @Controller + @ResponseBody 默认返回数据。
@Controller : 定义⼀个控制器, Spring 框架启动时加载, 把这个对象交给Spring管理.
@ResponseBody : 定义返回的数据格式为⾮视图, 返回⼀个 text/html 信息

4.3返回HTML代码⽚段

后端返回数据时, 如果数据中有HTML代码, 也会被浏览器解析

代码:

复制代码
 @RequestMapping("indexData2")
    @ResponseBody
    public String indexData2() {
        return "<h1>我是h1标签</h1>";
    }

结果:

4.4返回JSON

Spring MVC 也可以返回JSON
后端⽅法返回结果为对象
代码:

复制代码
@RequestMapping("getMap")
    @ResponseBody
    public HashMap<String, String> getMap() {
        HashMap<String, String> map = new HashMap<>();
        for (int i = 0; i < 5; i++) {
            map.put("key" + i, "val" + i);
        }
        return map;
    }

结果:

4.5设置状态码

Spring MVC会根据我们⽅法的返回结果⾃动设置响应状态码, 程序员也可以⼿动指定状态码
通过Spring MVC的内置对象HttpServletResponse 提供的⽅法来进⾏设置
代码:

复制代码
 @RequestMapping("setStatus")
    @ResponseBody
    public String setStatus(HttpServletResponse response) {
        response.setStatus(418);
        return "状态码设置成功";
    }

结果:

注意:状态码不影响页面展示。


以上为我个人的小分享,如有问题,欢迎讨论!!!

都看到这了,不如关注一下,给个免费的赞

相关推荐
蓝澈11215 分钟前
迪杰斯特拉算法之解决单源最短路径问题
java·数据结构
Kali_0712 分钟前
使用 Mathematical_Expression 从零开始实现数学题目的作答小游戏【可复制代码】
java·人工智能·免费
rzl0223 分钟前
java web5(黑马)
java·开发语言·前端
君爱学习29 分钟前
RocketMQ延迟消息是如何实现的?
后端
guojl43 分钟前
深度解读jdk8 HashMap设计与源码
java
Falling421 小时前
使用 CNB 构建并部署maven项目
后端
guojl1 小时前
深度解读jdk8 ConcurrentHashMap设计与源码
java
程序员小假1 小时前
我们来讲一讲 ConcurrentHashMap
后端
爱上语文1 小时前
Redis基础(5):Redis的Java客户端
java·开发语言·数据库·redis·后端