当前位置: 首页 > ds >正文

【JavaEE】Spring Web MVC(上)

什么是Spring Web MVC?

官方对于Spring MVC的描述是这样的:

Spring Web MVC是基于Servlet API构建的原始Web框架,从一开始就包含在Spring框架中。它的正式名称“Spring Web MVC”来自其源模块的名称(Spring-webmvc),但它通常被称为“Spring MVC”。

什么是Servlet呢?

Servlet是一种实现动态页面的技术。准确来讲Servlet是一套Java Web开发的规范,或者说是一套Java Web开发的技术标准。只是规范并不能做任何事情,必须要有人去实现它。所谓实现Servlet规范,就是真正编写代码去实现Servlet规范提到的各种功能,包括类、方法、属性等。

Servlet规范是开放的,除了Sun公司,其他公司也可以实现Servlet规范,目前常见的实现了Servlet规范的产品包括Tomcat、Weblogic、Jetty、WebSphere等,它们都被称为“Servlet容器”。Servlet容器用来管理程序员编写的Servlet类

从上述定义我们可以得出一个信息:Spring Web MVC是一个Web框架

下面咱们简称之为:Spring MVC

然而要真正的理解什么是Spring MVC?我们首先要搞清楚什么是MVC?
 

MVC定义

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

·View(视图)指在应用程序中专业用来与浏览器进行交互,展示数据的资源

·Model(模型)是应用程序的主体部分,用来处理程序中数据逻辑的部分

·Controller(控制器)可以理解为一个分发器,用来决定对于视图发来的请求,需要用哪一个模型来处理,以及处理完后需要跳回到哪一个视图。即用来连接视图和模型

举个例子:

比如去饭店吃饭

客户进店之后,服务员来接待客户点餐,客户点完餐之后,把客户菜单交给前厅,前厅根据客户菜单给后厨下达命令。后厨负责做饭,做完之后,再根据菜单告诉服务员,这是X号餐桌客人的饭

在这个过程中

服务员就是View(视图),负责接待客户,帮助客户点餐,以及给顾客端饭

前厅就是Controller(控制器),根据用户的点餐情况,来选择给哪个后厨下达命令

后厨就是Model(模型),根据前厅的要求来完成客户的用餐需求

什么是Spring MVC?

MVC是一种架构设计模式,也是一种思想,而Spring MVC是对MVC思想的具体实现。除此之外。Spring MVC还是一个Web框架

总结来说,Spring MVC是一个实现了MVC模式的Web框架

所以,Spring MVC主要关注有两个点:

1.MVC

2.Web框架

Spring MVC全称是Spring Web MVC

其实,Spring MVC我们在前面已经用过了,在创建Spring Boot项目时,我们勾选的Spring Web框架其实就是Spring MVC框架:

可以看到,Spring Web的介绍是:

Build Web,including RESTful,applications using Spring MVC。Uses Apache Tomcat as the default embedded container

这时候可能有些学生就懵了,前面创建的不是Spring Boot项目吗?怎么又变成了Spring MVC项目?他们之间到底有着什么样的关系?

Spring Boot只是实现Spring MVC的其中一种方式而已

Spring Boot可以添加很多依赖,借助这些依赖实现不同的功能。Spring Boot通过添加Spring Web MVC框架,来实现web功能

比如:厨房可以用来做饭,但真实实现做饭功能的是火以及各种做饭相关的食材和工具

厨房就好比是Spring Boot,厨房可以装柜子,实现收纳功能,装燃气灶等,实现做饭功能

做饭这个事,就是MVC,在几千年前,有火有食材就可以实现做饭

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

不过,核心没变

比如上面的例子中,去饭店吃饭。一些饭店是前厅来负责接待客户,帮助客户点餐,也就是Controller来负责接收用户的请求

学习Spring MVC

既然Spring MVC是Web框架,那么当用户在浏览器中输入了url之后,我们的Spring MVC项目就可以感知到用户的请求,并给予响应

我们学习Spring MVC,重点也就是学习如何通过浏览器和用户程序进行交互

主要分为以下三个方面:

1.建立连接:将用户(浏览器)和Java程序连接起来,也就是访问一个地址能够调用到我们的Spring程序

2.请求:用户请求的时候会带一些参数,在程序中要想办法获取到参数,所以请求这块主要是获取参数的功能

3.响应:执行了业务逻辑之后,要把程序执行的结果返回给用户,也就是响应

比如用户去银行存款:

1.建立连接:去柜台

2.请求:带着银行卡,身份证去存款

3.响应:银行返回一张存折

对于Spring MVC来说,掌握了以上3个功能就相当于掌握了Spring MVC

项目准备

Spring MVC项目创建和Spring Boot创建项目相同,在创建的时候选择Spring Web就相当于创建了Spring MVC的项目

Spring MVC使用Spring Boot的方式创建

Spring MVC更早期的实现方式,本文中不再讲解。

创建项目时,勾选上Spring Web模块即可,如下图所示:

建立连接

在Spring MVC中使用@RequestMapping来实现URL路由映射,也就是浏览器连接程序的作用

我们先来看看代码怎么写

创建一个UserController类,实现用户通过浏览器和程序的交互,具体实现代码如下:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@RestController
public class UserController{//路由器规则注册@RequestMapping("/sayHi")public String sayHi(){return "hello,Spring MVC";}
}

注意:这里方法名和路径名称无需一致

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

@RequestMapping 注解介绍

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

表示服务收到请求时,路径为 /sayHi 的请求就会调用 sayHi这个方法的代码

即:用户通过浏览器向服务器发送请求,URL为http://127.0.0.1:8080/sayHi,这时就会调用接口sayHi这个方法的代码

路由映射:当用户访问URL时,将用户的请求对应到程序中某个类的某个方法的过程就叫路由映射

既然@RequestMapping已经可以达到我们的目的了,我们为什么还要加@RestController呢?

如果我们把@RestController去掉,再来访问一次,得到的响应如下:

可以看到,程序报了404,找不到该页面

这就是@RestController起到的作用

一个项目中,会有很多类,每个类可能有很多的方法,Spring程序怎么知道要执行哪个方法呢?

Spring会对所有的类进行扫描,如果类加了注解@RestController,Spring才会去看这个类里面的方法有没有加@RequestMapping这个注解,当然@RestController的作用不止这一点,咱们先用,后面再详细讲解

@RequestMapping使用

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

@RequestMapping标识一个类:设置映射请求的请求路径的初始信息

@RequestMapping标识一个方法:设置映射请求的请求路径的具体信息

@RequestMapping("/user")
@RestController
public class UserController {@RequestMapping("/sayHi")public String sayHi(){return "hello,Spring MVC";}
}

访问地址:http://127.0.0.1:8080/user/sayHi

注意

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

@RequestMapping("user")
@RestController
public class UserController {@RequestMapping("sayHi")public String sayHi(){return "hello,Spring MVC";}
}

访问http://127.0.0.1:8080/user/sayHi,依然可以正确响应

通常情况下,我们会主动加斜杠

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

@RequestMapping("/user/m1")
@RestController
public class UserController {@RequestMapping("/say/hi")public String sayHi(){return "hello,Spring MVC";}
}

访问 http://127.0.0.1:8080/user/m1/say/hi

我们学习了HTTP协议后,知道GET/POST是常见的方法,那@RequestMapping到底是GET还是POST请求呢?

@RequestMapping是GET还是POST请求?

我们来测试一下就知道结论了

GET请求:

浏览器发送的请求类型是get,通过以上案例,可以看出来@RequestMapping支持get请求

POST请求:

我们通过form表单来构造请求:

创建test.html,html代码如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><form action="/user/sayHi" method="post"><input type="submit" value="提交"></form>
</body>
</html>

然后我们把前端代码放在static目录下,访问方式为:http://127.0.0.1:8080/test.html

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

如上图,访问链接为:http://127.0.0.1:8080/html/test.html

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

那如何指定GET或者POST类型呢?

指定GET/POST方法类型

我们可以显示的指定@RequestMapping来接收POST的情况,如下所示:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody;@RestController
public class UserController {@RequestMapping(value = "/getRequest",method= RequestMethod.POST) public String sayHi(){return "get request...";}
}

 Postman介绍

从上面的案例中,我们也发现了一个新的问题,就是我们测试后端方法时,还需要去写前端代码。这对我们来说,是一件麻烦又痛苦的事情

可能有人会说:“前面直接通过浏览器访问方法接口,不也得到了响应结果,以供测试

解释一下:

在Spring Web项目开发中,虽然直接通过浏览器访问方法接口路径可以快速验证部分基础功能,但这种测试方式存在显著局限性。

这里,我们只讲解,为什么需要结合前端代码进行的测试的部分原因:

1.请求参数验证的完整性

·浏览器地址栏只能传递简单的GET参数,无法模拟POST/PUT/DELETE请求体

·复杂对象参数需要JSON格式传递(需设置Content-Type:application/json)

·文件上传等multipart/form-data请求无法通过URL直接构造

2.HTTP方法验证

3.响应格式验证

4.状态码验证

...............

随着互联网的发展,也随着项目难度的增加,企业也按照开发的功能,把人员拆分成了不同的团队。界面显示交给“前端开发工程师”,业务逻辑的实现交给“后端开发工程师”。

后端开发工程师,不要求也不需要掌握前端技能了

那后端开发工程师,如何测试自己的程序呢?--使用专业的接口测试工具

这里,我们介绍的是Postman,接下来我们学习如何使用Postman

Postman-CSDN博客

请求

访问不同的路径,就是发送不同的请求。在发送请求时,可能会带一些参数,所以学习Spring的请求,主要是学习如何传递参数到后端以及后端如何接收

传递参数,咱们主要是使用浏览器和Postman来模拟

后端开发人员无需过渡关注如何传递参数,了解即可,实际开发中以Postman测试为主

比如餐厅的厨师,不关注用户是在店里下单,还是外卖平台下单,或者小程序下单,只需要知道如何接收订单,根据订单做出对应的菜肴即可

传递单个参数

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

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController 
@RequestMapping("/param") 
public class ParamController {@RequestMapping("/m1")public String method1(String name){ return "接收到参数name:"+ name;}
}

浏览器发送请求并传参

用浏览器访问http://127.0.0.1:8080/param/m1?name=spring

响应结果

根据响应结果,可以看到,后端程序正确拿到了name参数的值

Spring MVC会根据方法的参数名,找到对应的参数,赋值给方法

如果参数不一致,是获取不到参数的

比如请求URL:http://127.0.0.1:8080/param/m1?name1=spring

响应结果

注意事项

使用基本类型来接收参数时,参数必须传(除boolean类型),否则会报500错误

类型不匹配时,会报400操作

示例

@RequestMapping("/m1/int")
public Object method1GetInt(int age){return "接收到参数age:" + age;
}

1.正常传递参数

浏览器访问:http://127.0.0.1:8080/param/m1/int?age=18

浏览器响应结果

通过Fiddler观察请求和响应,HTTP响应状态码为200,Content-Type为text/html

2.不传递age参数

浏览器访问:http://127.0.0.1:8080/param/m1/int

浏览器响应结果

通过Fiddler观察请求和响应,HTTP响应状态码为500

尝试观察程序的错误日志,并解决

一般看日志堆栈信息的首行,报错信息显示:

int类型的参数 ‘age’,虽然是可选的,但由于被声明为基本类型而不能转换为空值(null)。考虑将其声明为对应基本类型的包装类型

按照错误信息解决错误即可

最开始学习时,会遇到各种各样的问题,我们要养成看错误日志的习惯,根据错误日志来解决问题

最开始可能会看不懂,或者比较懵,要耐下心来,慢慢看,后续会告诉大家更多看日志的思路

3.传递参数类型不匹配

浏览器访问:http://127.0.0.1:8080/param/m1/int?age=abc

浏览器响应结果

通过Fiddler观察请求和响应,HTTP响应状态码为400

对于包装类型,如果不传对应参数,Spring接收到的数据则为null

所以企业开发中,对应参数可能为空的数据,建议使用包装类型

传递多个参数

后端如何接收到多个参数呢?

和接收单个参数一样,直接使用方法的参数接收即可。使用多个形参

@RequestMapping("/m2")
public Object method2(String name, String password){return "接收到参数name:" + name + ", password:" + password;
}

浏览器访问:http://127.0.0.1:8080/param/m2?name=zhangsan&password=123456

响应结果为:

可以看到,后端程序正确拿到了name和password参数的值

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

比如访问:http://127.0.0.1:8080/param/m2?password=123456&name=zhangsan 同样可以拿到正确的结果

传递对象

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

Spring MVC也可以自动实现对象参数的赋值,比如Person对象:
 

public class Person {private int id;private String name;private String password;public int getId() { return id;}public void setId(int id) { this.id = id;}public String getName() { return name;}public void setName(String name) { this.name = name;}public String getPassword() { return password;}public void setPassword(String password) { this.password = password;}@Overridepublic String toString() { return "Person{" +"id=" + id +", name='" + name + '\'' +", password='" + password + '\'' + '}';}
}

传递对象代码实现:

@RequestMapping("/m3")
public Object method3(Person p){return p.toString();
}

使用浏览器发送请求并传参:

http://127.0.0.1:8080/param/m3?id=5&name=zhangsan&password=123456

可以看到,后端程序正确拿到了Person对象里各个属性的值

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

注意:

如果我们上述参数id、name、password并没有写get、set方法,最终后端程序无法得到前端输入的值,就无法给后端对象赋值。

可能有的人就会想,那我每次传递对象,还需要把各个参数个get、set方法给写出来,这不是很麻烦吗?

其实这样确实有些麻烦,可以在类上加注解@Data,这一注解便可以替代所有的get、set方法

后端参数重命名(后端参数映射)

某些特殊的情况下,前端传递的参数key后我们后端接收的key可以不一致,比如前端传递了一个time给后端,而后端是使用createtime字段来接收的,这样就会出现参数接收不到的情况,如果出现这种情况,我们就可以使用 @RequestParam 来重命名前后端的参数值

具体示例如下,后端实现代码:
 

@RequestMapping("/m4")
public Object method_4(@RequestParam("time") String createtime) {return "接收到参数createtime:" + createtime;
}

使用浏览器发送请求并传参:http://127.0.0.1:8080/param/m4?time=2023-09-12

浏览器响应结果:

可以看到,Spring可以正确的把浏览器传递的参数time绑定到后端参数createtime参数上

此时,如果浏览器使用createtime进行参数传递呢?

继续使用浏览器发送请求并传参:http://127.0.0.1:8080/param/m4?createtime=2023-09-12

浏览器响应结果:

错误日志信息为:

控制台打印日志显示:请求参数【time】不存在

如果我们不传递参数【time】的话,会得到以下响应

可以得出结论:
1.使用@RequestParam进行参数重命名时,请求参数只能和@RequestParam声明的名称一致,才能进行参数绑定和赋值

2.使用@RequestParam进行参数重命名时,参数就变成了必传参数

非必传参数设置

如果我们的实际业务前端的参数是一个非必传的参数,针对上述问题,如何解决呢?

先来了解下参数必传的原因,我们查看@RequestParam注解的实现细节就可以发现端倪,注解实现如下:
 

@Target({ElementType.PARAMETER}) 
@Retention(RetentionPolicy.RUNTIME) 
@Documented
public @interface RequestParam { @AliasFor("name")String value() default "";@AliasFor("value") String name() default "";boolean required() default true;String defaultValue() default  "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";

可以看到【required】的默认值为true,表示含义就是:该注解修饰的参数默认为必传

既然如此,我们可以通过设置@RequestParam中的【required=false】来避免不传递时报错,具体实现代码如下:

@RequestMapping("/m4")
public Object method4(@RequestParam(value = "time", required = false) String createtime) {return "接收到参数createtime:" + createtime;
}

可以看到,添加【required=false】之后,time前面也加了key,变成了【value="time"】

注解属性赋值时,没有指明key的话,默认为value属性

如果需要有多个属性进行赋值时,需要写上key

浏览器访问:http://127.0.0.1:8080/param/m4

浏览器响应结果:

传递数组

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

后端实现代码:
 

@RequestMapping("/m5")
public String method5(String[] arrayParam) {return Arrays.toString(arrayParam);
}

使用浏览器发送请求并传参:

数组参数:请求参数名与形参数组名称相同且请求参数为多个,后端定义数组类型形参即可接收参数

浏览器可以使用以下几种URL来发送请求:

http://127.0.0.1:8080/param/m5?arrayParam=zhangsan&arrayParam=lisi&arrayParam=wangwu..

http://127.0.0.1:8080/param/m5?arrayParam=zhangsan%2clisi%2cwangwu..

解释:【%2c】是逗号的转义编码,解码后的url即为下面所示

http://127.0.0.1:8080/param/m5?arrayParam=zhangsan,lisi,wangwu..(我们使用这个)

浏览器响应结果:

可以看到后端对数组参数进行了正确的接收和响应

或者使用Postman来发送请求

传递集合

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

默认情况下,请求中参数名相同的多个值,是封装到数组。如果要封装到集合,要使用@RequestParam绑定参数关系

后端接收代码:

@RequestMapping("/m6")
public String method6(@RequestParam List<String> listParam){return "size:"+listParam.size() + ",listParam:"+listParam;
}

请求方式和数组类似:
浏览器传参:

方式一:http://127.0.0.1:8080/param/m6?listParam=zhangsan&listParam=lisi&listParam=wangwu

方式二:http://127.0.0.1:8080/param/m6?listParam=zhangsan%2clisi%2cwangwu

Postman传参测试:

传递JSON数据

JSON概念

JSON:JavaScript Object Notation 【JavaScript对象表示法】

JSON是一种轻量级的数据交互格式。它基于ECMAScript(欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据

简单来说:JSON就是一种数据格式,有自己的格式和语法,使用文本表示一个对象或数组的信息,因此JSON本质是字符串。主要负责在不同的语言中数据传递和交换

JSON与JavaScript的关系

两者其实没有关系,只是语法相似,js开发者能更快的上手而已,但是它的语法本身比较简单,所以也很好学

JSON语法

JSON是一个字符串,其格式非常类似于JavaScript对象字面量的格式

我们先来看一段JSON数据

{"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", "Superhumanreflexes"]}, {	"name": "Eternal Flame","age": 1000000,"secretIdentity": "Unknown","powers": ["Immortality", "Heat Immunity", "Inferno",
"Teleportation", "Interdimensional travel"]}]}

也可以压缩表示:

{"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":"EternalFlame","age":1000000,"secretIdentity":"Unknown","powers":["Immortality","Heat Immunity","Inferno","Teleportation","Interdimensional travel"]}]}

和上面描述的数据一样,只不过上面的进行了格式化,更易读

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)

JSON字符串和Java对象互转

JSON本质上是一个字符串,通过文本来存储和描述数据

Spring MVC框架也集成了JSON的转换工具,我们可以直接使用,来完成JSON字符串和Java对象的互转

本质上是jackson-databind提供的功能,Spring MVC框架中已经把该工具包引入了进来,咱们直接使用即可,如果脱离Spring MVC使用,需要引入相关依赖

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.5</version>
</dependency>

JSON的转换工具包有很多,jackson-databind只是其中的一种

比如:使用ObjectMapper对象提供的两个方法,可以完成对象和JSON字符串的互转

示例:

public class JSONUtils {private static ObjectMapper objectMapper = new ObjectMapper(); public static void main(String[] args) throws JsonProcessingException {Person person = new Person();person.setId(5);person.setName("zhangsan");person.setPassword("123456");//对象转为JSON字符串String jsonStr = objectMapper.writeValueAsString(person);System.out.println("JSON字符串为:"+jsonStr);//JSON字符串转为对象Person p = objectMapper.readValue(jsonStr,Person.class);System.out.println("转换的对象id:"+p.getId()+",name:"+p.getName()+",password:"+p.getPassword());}
}

writeValueAsString:把对象转为JSON字符串

readValue:把字符串转为对象

JSON优点

1.简单易用:语法简单,易于理解和编写,可以快速地进行数据交换

2.跨平台支持:JSON可以被多种编程语言解析和生成,可以在不同的平台和语言之间进行数据交换和传输

3.轻量级:相较于XML格式,JSON数据格式更加轻量级,传输数据时占用带宽较小,可以提高数据传输速度

4.易于扩展:JSON的数据结构灵活,支持嵌套对象和数组等复杂的数据结构,编译扩展和使用

5.安全性:JSON数据格式是一种纯文本格式,不包含可执行代码,不会执行恶意代码,因此具有较高的安全性

基于以上特点,JSON在Web应用程序中被广泛使用,如前后端数据交互、API接口数据传输等

传递JSON对象

接收JSON对象,需要使用@RequestBody注解

RequestBody:请求正文,意思是这个注解作用在请求正文的数据绑定,请求参数必须写在请求正文中

后端实现:
 

@RequestMapping(value = "/m7")
public Object method7(@RequestBody Person person) {return person.toString();
}

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

根据响应结果可以看到,后端正确接受了

通过Fiddler观察一下请求参数:

尝试去除掉@RequestBody看看有何区别

@RequestMapping(value = "/m7")
public Object method7(Person person) {return person.toString();
}

请求响应结果如下:

后端未能成功给Person对象赋值

http://www.xdnf.cn/news/16361.html

相关文章:

  • NineData 数据库 DevOps 全面支持 GaussDB,国产化管理再升级!
  • Canal 1.1.7的安装
  • 焊接机器人节能先锋
  • Kafka——多线程开发消费者实例
  • 华为云DRS实现Oracle到GaussDB数据库迁移的全流程技术方案
  • 配置Mac/Linux终端启动执行脚本
  • 【小沐学GIS】基于Unity3d绘制三维数字地球Earth(Unity3d、OpenGL、GIS)
  • Linux 网络与 Vim 编辑器操作
  • MySQL 事务管理
  • Linux 中 `chown`、`chgrp` 和 `chmod` 命令详解
  • Java学习第七十三部分——Redis
  • Gin 框架的中间件机制
  • 【08】C#入门到精通——C# 文件操作 读取并删除指定文件 修改指定文件名
  • LLM中典型的Transformer层中:MLP Residual; LN Agg: μ, σ; SM Agg 是什么意思
  • 从0开始学习R语言-Day56--空间变系数模型
  • 【Git知识】Git 常用知识集合之基础--分支系统与 Tag 标签机制
  • 华为仓颉编程语言的表达式及其特点
  • Lua协同程序(coroutine)
  • iOS网络之异步加载
  • YOLO算法演进综述:从YOLOv1到YOLOv13的技术突破与应用实践,一文掌握YOLO家族全部算法!
  • 图像认知与OpenCV——图像预处理2
  • 【Unity开发】飞机大战项目实现总结
  • Python 程序设计讲义(15):Python 的数据运算——位运算
  • Unity VS Unreal Engine ,“电影像游戏的时代” 新手如何抉择引擎?(1)
  • 读书笔记(黄帝内经)
  • 使用Python采集招聘网站数据并智能分析求职信息
  • P1013 [NOIP 1998 提高组] 进制位
  • ESP32S3 Ubuntu vscode如何使用USB-JTAG调试
  • java中如何返回一个可以执行返回操作(return action)的函数或对象
  • 【自用】JavaSE--阶段测试