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 "状态码设置成功";
    }

结果:

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


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

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

相关推荐
suweijie7683 小时前
SpringCloudAlibaba | Sentinel从基础到进阶
java·大数据·sentinel
公贵买其鹿4 小时前
List深拷贝后,数据还是被串改
java
向前看-7 小时前
验证码机制
前端·后端
xlsw_7 小时前
java全栈day20--Web后端实战(Mybatis基础2)
java·开发语言·mybatis
神仙别闹8 小时前
基于java的改良版超级玛丽小游戏
java
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭8 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
暮湫8 小时前
泛型(2)
java
超爱吃士力架8 小时前
邀请逻辑
java·linux·后端
南宫生9 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
转码的小石9 小时前
12/21java基础
java