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 运行测试

启动服务,运行并测试

相关推荐
Ray Liang18 分钟前
用六边形架构与整洁架构对比是伪命题?
java·python·c#·架构设计
Java水解34 分钟前
Java 中间件:Dubbo 服务降级(Mock 机制)
java·后端
SimonKing5 小时前
OpenCode AI辅助编程,不一样的编程思路,不写一行代码
java·后端·程序员
FastBean5 小时前
Jackson View Extension Spring Boot Starter
java·后端
Seven976 小时前
剑指offer-79、最⻓不含重复字符的⼦字符串
java
皮皮林55115 小时前
Java性能调优黑科技!1行代码实现毫秒级耗时追踪,效率飙升300%!
java
冰_河16 小时前
QPS从300到3100:我靠一行代码让接口性能暴涨10倍,系统性能原地起飞!!
java·后端·性能优化
桦说编程18 小时前
从 ForkJoinPool 的 Compensate 看并发框架的线程补偿思想
java·后端·源码阅读
躺平大鹅20 小时前
Java面向对象入门(类与对象,新手秒懂)
java