Java EE进阶4:Spring Web MVC入门

1. 什么是Spring Web MVC?

1.1 MVC 定义

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

1.2 什么是Spring MVC?

不过Spring在实现MVC时,也结合自身项目的特点,做了⼀些改变,相对而言,下面这个图或许更加合适⼀些。

2. 学习Spring MVC

2.1 项目准备

2.2 建立连接

在 Spring MVC中使用**@RequestMapping** 来实现URL路由映射,也就是浏览器连接程序的作用,我们先来看看代码怎么写,创建⼀个 UserController类,实现用户通过浏览器和程序的交互,具体实现代码如下:

方法名和路径名称无需⼀致

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

2.2.1 @RequestMapping、@RestController注解介绍

2.2.2 @RequestMapping 使用

@RequestMapping既可修饰 ,也可以修饰方法 ,当修饰类和方法 时,访问的地址是类路径+方法路径

类和方法 分开时的注解内容可以重复 ,但在标识方法内部注解内容(路径)不可重复, 请求无法 成功**(是指 v2/v3 重复,不是指里面的方法,里面的方法名不同 也仍无法成功)**

注:请求方式不同GetMapingPostMapping 的话 它们后面的注解内容**(路径)可以相同 在postman中分别请求可以成功】**

或者:如下

@RequestMapping 的URL路径也可以是多层路径 ,最终访问 时**,** 依然是类路径+方法路径。

2.2.3 @RequestMapping是GET还是POST请求?

如果有多层目录,访问链接从static目录开始写

从运行结果可以看出: @RequestMapping 既支持Get 请求,又支持Post请求,同理,也支持其他的请求方式。

若用下面的Postman 情况如下

2.3 Postman介绍

2.3.1 下载安装postman

https://www.postman.com/downloads/https://www.postman.com/downloads/

2.3.2 创建请求

界面介绍

2.3.3 传参介绍

参数在下面

2.4 请求(前端→后端)

2.4.1 传递单个参数

接收单个参数,在Spring MVC 中直接用方法中的参数 就可以(前后端参数名相同 name、age),比如以下代码:

2.4.2 传递多个参数

如何接收多个参数呢? 和接收单个 参数**⼀样** ,直接使用方法的参数接收即可,使用多个形参。

当有多个参数时,前后端进行参数匹配时,是以参数的名称 进行匹配 的,因此参数的位置是不影响后端获取参数的结果。

2.4.3 传递对象

如果参数比较多时,方法声明就需要有很多 形参。并且后续每次新增⼀个参数,也需要修改 方法声明。 我们不妨把这些参数封装为⼀个对象。Spring MVC 也可以自动实现对象参数的赋值,比如 Person 对象:

2.4.4 后端参数重命名(后端参数映射)@RequestParam

2.4.5 传递数组

Spring MVC可以自动绑定数组参数的赋值

2.4.6 传递集合 @RequestParam

2.4.7 传递JSON数据(重点 常用)@RequestBody

java 复制代码
{
     "squadName": "Super hero squad",
     "homeTown": "Metro City",
     "formed": 2016,
     "secretBase": "Super tower",
     "active": true,
     "members": [{
             "name": "Molecule Man",
             "age": 29,
             "secretIdentity": "Dan Jukes",
             "powers": ["Radiation resistance", "Turning tiny", "Radiation 
blast"]
     }, {
             "name": "Madame Uppercut",
             "age": 39,
             "secretIdentity": "Jane Wilson",
             "powers": ["Million tonne punch", "Damage resistance", "Superhuman 
reflexes"]
     }, {
             "name": "Eternal Flame",
             "age": 1000000,
             "secretIdentity": "Unknown",
             "powers": ["Immortality", "Heat Immunity", "Inferno", 
"Teleportation", "Interdimensional travel"]
     }]
}

也可以压缩表示和上面描述的数据⼀样,只不过上面的进行了格式化,更易读。

java 复制代码
{"squadName":"Super hero squad","homeTown":"Metro 
City","formed":2016,"secretBase":"Super tower","active":true,"members":
[{"name":"Molecule Man","age":29,"secretIdentity":"Dan Jukes","powers":
["Radiation resistance","Turning tiny","Radiation blast"]},{"name":"Madame 
Uppercut","age":39,"secretIdentity":"Jane Wilson","powers":["Million tonne 
punch","Damage resistance","Superhuman reflexes"]},{"name":"Eternal 
Flame","age":1000000,"secretIdentity":"Unknown","powers":["Immortality","Heat 
Immunity","Inferno","Teleportation","Interdimensional travel"]}]}

在线JSON校验格式化工具(Be JSON)在线,JSON,JSON 校验,格式化,xml转json 工具,在线工具,json视图,可视化,程序,服务器,域名注册,正则表达式,测试,在线json格式化工具,json 格式化,json格式化工具,json字符串格式化,json 在线查看器,json在线,json 在线验证,json tools online,在线文字对比工具https://www.bejson.com/

java 复制代码
package com.Dyichen.spring;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JSONTests {
    private static ObjectMapper objectMapper = new ObjectMapper();

    public static void main(String[] args) throws JsonProcessingException {

        //创建对象
        Person person = new Person();
        person.setName("zhang san");
        person.setAge(18);
        person.setPassword("1212121");

        //对象转为JSON字符串   writeValueAsString方法
        String s = objectMapper.writeValueAsString(person);
        System.out.println(s);

        //JSON字符串转对象     readValue方法
        String json = "{\"name\":\"zhang san\",\"password\":\"1212121\",\"age\":18}";
        Person person1 = objectMapper.readValue(json,Person.class);
        System.out.println(person1);
        
    }

}

使用Postman 来发送json请求参数:

可以看到,后端正确接收了,通过Fiddler观察⼀下请求参数:

2.4.8 获取URL中参数@PathVariable

使用Postman发送请求

2.4.9 上传文件 @RequestPart

也可以重命名

2.4.10 获取Cookie/Session

java 复制代码
package com.Dyichen.spring;

import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@RequestMapping("/request2")
@RestController
public class RequestController2 {

    //读取Cookie
    @RequestMapping("/getCookie")
    public String getCookie(HttpServletRequest request){
        // 获取所有 cookie 信息
        Cookie[] cookies = request.getCookies();
        //打印Cookie信息
        if(cookies != null){
            for(Cookie cookie: cookies){
                System.out.println(cookie.getName() + ":" + cookie.getValue());
            }
        }
        return "获取cookie成功";
    }


    @RequestMapping("/getCookie2")
    public String getCookie2(@CookieValue("class") String className){
        return "获取cookie成功,className:" + className;
    }
}

2.4.11 获取Header

2.5 响应

在我们前面的代码例子中,都已经设置了响应数据 ,Http响应结果可以是数据 ,也可以是静态页面 ,也可以针对响应设置状态码Header信息等

2.5.1 返回静态页面 @Controller

创建前端页面index.html(注意路径)

2.5.2 返回数据@ResponseBody

2.5.3 返回HTML代码片段

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

2.5.4 返回JSON @ResponseBody

Spring MVC 也可以返回JSON,后端方法返回结果为对象。

2.5.5 设置状态码

状态码不影响页面的展示

2.5.6 设置Header(了解)

java 复制代码
Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
 String name() default "";
 @AliasFor("path")
 String[] value() default {};
 @AliasFor("value")
 String[] path() default {};
 RequestMethod[] method() default {};
 String[] params() default {};
 String[] headers() default {};
 String[] consumes() default {};
 String[] produces() default {};
}

3. 综合性练习

结合上述内容,我们可以做⼀些小案例,来更好的掌握主要知识点 (1)理解前后端交互过程 (2)接口传参,数据返回,以及页面展示

3.1 加法计算器

**需求:**输入两个整数,点击"点击相加"按钮,显示计算结果

3.1.1 准备工作

创建SpringBoot项目:引入SpringWeb依赖,把前端页面放在项目中。

3.1.2 约定前后端交互接口


3.1.3 服务器代码

3.1.4 调整前端页面代码

添加访问url和请求方式

3.1.5 运行测试

启动服务,运行并测试

相关推荐
小楼v2 小时前
常见的Java线程八股
java·后端·线程
沛沛老爹2 小时前
从Web到AI:金融/医疗/教育行业专属Skills生态系统设计实战
java·前端·人工智能·git·金融·架构
寂寞旅行2 小时前
IDEA 中使用 claude code 插件
java·ide·intellij-idea
Remember_9932 小时前
Java 入门指南:从零开始掌握核心语法与编程思想
java·c语言·开发语言·ide·python·leetcode·eclipse
野犬寒鸦2 小时前
从零起步学习RabbitMQ || 第四章:RabbitMQ的延迟消息在项目中的运用及实现剖析
java·服务器·数据库·后端·mysql·rabbitmq
jiayong232 小时前
Tomcat连接器与协议处理面试题
java·tomcat
a程序小傲2 小时前
哈罗Java面试被问:布隆过滤器的误判率和哈希函数选择
java·服务器·算法·面试·职场和发展·哈希算法
lbb 小魔仙2 小时前
【Java】微服务架构 Java 实战:Spring Cloud Gateway + Nacos 全链路搭建指南
java·微服务·架构
十六年开源服务商2 小时前
WordPress多语言支持系统搭建指南
java·大数据·数据库