跳到主要内容 Spring Web MVC 入门:注解用法、参数传递与 Postman 测试 | 极客日志
Java java
Spring Web MVC 入门:注解用法、参数传递与 Postman 测试 Spring Web MVC 是实现了 MVC 模式的 Web 框架,核心在于前后端交互。文章详细阐述了如何建立连接(URL 路由映射)、处理请求(单个/多个参数、对象、数组、集合、JSON、文件、Header 获取)以及响应结果(静态页面、数据返回、JSON、状态码、Header 设置)。通过 @RequestMapping、@RequestParam、@RequestBody、@PathVariable 等注解的代码示例,结合 Postman 工具演示了常见接口的开发与测试方法,适合初学者快速上手 Spring Web MVC 开发。
一、Spring Web MVC 定义
Spring Web MVC 通常又被称为 Spring MVC,是一个 Web 框架。MVC 是软件工程中的一种软件架构设计模式,它把软件系统分为模型、视图和控制器三个基本部分。
View(视图) 指在应用程序中专门用来与浏览器进行交互,展示数据的资源。
Model(模型) 是应用程序的主体部分,用来处理程序中数据逻辑的部分。
Controller(控制器)可以理解为⼀个分发器,用来决定对于视图发来的请求,需要用哪⼀个模型来处理,以及处理完后需要跳回到哪⼀个视图。即用来连接视图和模型。
Spring MVC 就是一个实现了 MVC 模式的 Web 框架。Spring MVC 重点学习的是如何通过浏览器和用户程序进行交互。所以分为以下三个方面:
建立连接:将用户(浏览器)和 Java 程序连接起来,也就是访问一个地址能够调用到我们的 Spring 程序。
请求:用户请求的时候会带一些参数,在程序中要想办法获取到参数,所以请求这块主要是获取参数的功能。
响应:执行了业务逻辑之后,要把程序执⾏的结果返回给用户,也就是响应。
二、建立连接
在 SpringMVC 中使用 @RequestMapping 来实现 URL 路由映射,也就是浏览器连接程序的作用。
代码示例:
@RestController
@RequestMapping("/hello")
public class HelloController {
@RequestMapping("/hello1")
public String hello1 () {
return "Hello, Spring MVC" ;
}
}
2.1 @RequestMapping 注解介绍
@RequestMapping 是 Spring MVC 中最常用的注解之一,它是用来注册接口的路由映射的。
路由映射:当用户访问一个 URL 时,将用户的请求对应到程序中某个类的某个方法的过程就叫路由映射。
例如示例代码中表示服务器收到请求时,路径为 /hello/hello1 的请求就会调用 hello1 这个方法的代码。
2.1.1 @RestController
@RestController 的作用是打标签。在一个项目中有很多的类,类中又有很多的方法,Spring 程序会对所有的类进行扫描,如果类加了注解 @RestController,Spring 才会看这个类里面的方法有没有 @RequestMapping 这个注解,这只是他的作用之一。
2.2 @RequestMapping 使用
@RequestMapping 既可以修饰类,也可以修饰方法,修饰类时是类路径,修饰方法时是方法路径。如果有类路径,则 url( 访问地址 ) 需要加上类路径。且通常都会加上类路径,是为了提高可读性,与避免 url 冲突。
例如访问示例代码中的 url( 请求地址 ):http://127.0.0.1:8080/hello/hello1
注:@RequestMapping 的 URL 路径前可以不加'/',Spring 程序启动时,会进行判断如果没有加'/',Spring 会自动拼接上一个'/'。但通常情况下都加上'/'。
2.3 @RequestMapping 请求方式
GET 请求:浏览器上发送的请求类型都是 get,所以@RequestMapping 支持 get 请求。
POST 请求:通过构造 POST 请求可以看到该注解也支持 POST 请求。同样的,其也支持其他的请求。
如何指定 GET 或者 POST 类型:
可以显示的指定@RequestMapping 来接收 POST 请求。
示例代码:
@RestController
@RequestMapping("/hello")
{
String {
;
}
}
微信扫一扫,关注极客日志 微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
相关免费在线工具 Keycode 信息 查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
Escape 与 Native 编解码 JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
JavaScript / HTML 格式化 使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
JavaScript 压缩与混淆 Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
public
class
HelloController
@RequestMapping(value = "/hello2", method = RequestMethod.POST)
public
hello2
()
return
"hello, springmvc2"
如果这种方式太麻烦,也可以换成下面的方式,除了 GetMapping,还有其他注解方式:PostMapping 等
@RestController
@RequestMapping("/hello")
public class HelloController {
@GetMapping("/hello2")
public String hello2 () {
return "hello, springmvc222" ;
}
}
三、Postman 工具 当我们测试后端写的方式时,使用前端代码去测试非常的麻烦,因此可以使用 Postman 接口测试工具。
raw:上传任意格式的文本,例如 text,json,xml,html 等。
四、请求 访问不同的路径,就是发送不同的请求。在发送请求时,可能会带一些参数,所以学习 Spring 的请求,主要是学习如何传递参数到后端以及后端如何接收。
4.1 传递单个参数 接收单个参数,在 Spring MVC 中直接用方法中的参数即可,例如:
@RestController
@RequestMapping("/request")
public class RequestController {
@RequestMapping("/r1")
public String r1 (String s1) {
return "接收到参数:" + s1;
}
}
此时后端接收到了 s1 参数的值,Spring MVC 会根据方法的参数名,找到对应的参数,赋值给方法。如果请求参数不一致,那么就获取不到参数。
注:使用基本类型接收参数时,参数必须传(除 boolean 类型),否则会报 500 状态码错误。类型不匹配时,会报 400 状态码错误。对于参数可能为空的数据,建议使用包装类型。
4.2 传递多个参数 使用多个形参,和接收单个参数一样,直接使用方法的参数接收即可,例如:
@RestController
@RequestMapping("/request")
public class RequestController {
@RequestMapping("/r4")
public String r4 (String name, Integer age) {
return String.format("接收到参数:姓名 [%s],年龄 [%d]" , name, age);
}
}
当有多个参数时,前后端进行参数匹配时,是以参数的名称进行匹配的,因此参数的位置是不影响后端获取参数的结果。
4.3 传递对象 如果有参数较多的情况,方法声明需要有很多形参,并且如果后续新增参数时,也需要修改方法声明,因此直接将这些参数封装为一个对象来进行接收,例如:
public class Person {
private String name;
private Integer age;
private Integer gender;
}
@RestController
@RequestMapping("/request")
public class RequestController {
@RequestMapping("/r5")
public String r5 (Person person) {
return "接收到参数:" + person;
}
}
后端 Spring 会根据参数名称自动绑定到对象的各个属性上,如果该属性未传递,那么赋值为 null(基本类型则赋值为默认的初始值)。
4.4 后端参数重命名 在某些特定情况下,前端传递的参数 key 和后端接收的 key 不一致,就会出现参数接收不到的情况,此时可以使用 "@RequestParam" 来重命名前后端的参数值,示例:
@RestController
@RequestMapping("/request")
public class RequestController {
@RequestMapping("/r6")
public String r6 (@RequestParam(value = "sa", required = false) String name) {
return "接收到参数:" + name;
}
}
Spring 正确的将 sa 参数绑定到了后端参数 name 上,当浏览器使用 name 参数传递时,会报 400 状态码错误,也就是请求参数不正确。
当使用@RequestParam 进行参数重命名时,请求参数只有和@RequestParam 声明的名称一致,才能进行参数绑定传值。
使用 @RequestParam 进行参数重命名时,参数为必传参数,但也可以通过设置 @RequestParam 中的 required = false 来避免不传递参数时的报错。
4.5 传递数组 @RestController
@RequestMapping("/request")
public class RequestController {
@RequestMapping("/r7")
public String r7 (String[] array) {
return "接收到参数:" + Arrays.toString(array);
}
}
4.6 传递集合 和数组类似,同一个请求参数名有多个;使用集合时,要用到 @RequestParam 注解绑定参数关系。示例:
@RestController
@RequestMapping("/request")
public class RequestController {
@RequestMapping("/r8")
public String r8 (@RequestParam List<String> list) {
return "接收到参数:" + list;
}
}
4.7 传递 JSON JSON 是一种轻量级的数据交互格式,有自己的格式和语法,使用文本表示一个对象或数组的信息,因此,JSON 本质是字符串,负责在不同的语言中进行数据传递和交换。
传递 JSON 对象,需要使用 @RequestBody 注解,示例:
@RestController
@RequestMapping("/request")
public class RequestController {
@RequestMapping("/r9")
public String r9 (@RequestBody Person person) {
return "接收到参数:" + person;
}
}
响应结果中可以看到,后端成功给 Person 对象赋值。
4.8 获取 URL 中参数 @PathVariable 这个注解主要作用在请求 URL 路径上的数据绑定。SpringMVC 可以获取到写在 URL 上的传递参数。示例:
@RestController
@RequestMapping("/request")
public class RequestController {
@RequestMapping("/{articleId}")
public String r10 (@PathVariable("articleId") String articleId) {
return "接收到参数:" + articleId;
}
}
如果方法参数名和 URL 中的变量名称一致时,可以不用给@PathVariable 的属性赋值;如果不一致时,则需要为其属性赋值。
4.9 上传文件 @RequestPart 注解作用为,获取文件作为的请求参数。示例:
@RestController
@RequestMapping("/request")
public class RequestController {
@RequestMapping("/r12")
public String r12 (@RequestPart("file1") MultipartFile file) {
String originalFilename = file.getOriginalFilename();
String contentType = file.getContentType();
System.out.println(originalFilename);
System.out.println(contentType);
return "接收到文件:" + originalFilename;
}
}
@RestController
@RequestMapping("/request")
public class RequestController {
@RequestMapping("/getHeader")
public String getHeader (HttpServletRequest request) {
String header = request.getHeader("User-Agent" );
return "header: " + header;
}
}
简洁获取方式:通过 @RequestHeader 注解获取,参数较多时需要列出所有需要的参数。示例:
@RestController
@RequestMapping("/request")
public class RequestController {
@RequestMapping("/getHeader2")
public String getHeader2 (@RequestHeader("User-Agent") String userAgent) {
return "获取到 Header: " + userAgent;
}
}
五、响应
5.1 @RestController 和 @Controller 首先需要了解 @RestController 和 @Controller 注解。其实 @RestController = @Controller + @ResponseBody,而@Controller 是选择视图,返回的是视图,而@ResponseBody 定义返回的是数据。因此,如果想要返回静态页面,就需要使用@Controller。
@ResponseBody 可以修饰类和方法,修饰类时整个类中方法都返回数据;修饰方法则该方法返回的是数据。
5.2 返回静态页面 @Controller
@RequestMapping("/request")
public class RequestController {
@RequestMapping("/returnPage")
public String returnPage () {
return "/index.html" ;
}
}
使用浏览器访问该接口得到的为 index.html 的页面。
5.3 @ResponseBody 返回数据 返回数据可以使用 @RestController 注解,也可以使用@Controller + @ResponseBody 的形式,这两个是一样的。代码示例:
@Controller
@RequestMapping("/request")
public class RequestController {
@ResponseBody
@RequestMapping("/returnPage1")
public String returnPage1 () {
return "/index.html" ;
}
}
浏览器访问接口发现使用了@ResponseBody 接口后,将/index.html 作为一个字符串数据进行了响应,而不是页面。
5.4 返回 JSON Spring 会将 Map,List,对象等进行 JSON 形式的响应。示例:
@Controller
@RequestMapping("/request")
public class RequestController {
@ResponseBody
@RequestMapping("/returnJson")
public Person returnJson () {
return new Person ("zhangsan" , 18 , 1 );
}
@ResponseBody
@RequestMapping("/returnJson2")
public Map<String, String> returnJson2 () {
Map<String, String> map = new HashMap <>();
map.put("id" , "1" );
map.put("name" , "zhangsan" );
return map;
}
}
通过浏览器访问接口发现,响应的数据为 JSON 形式。
5.5 设置状态码 Spring MVC 根据方法的返回结果已经自动设置了响应状态码,但是也可以手动指定状态码,可以通过 Spring MVC 的内置对象 HttpServletResponse 提供的方法进行设置。
@Controller
@RequestMapping("/request")
public class RequestController {
@ResponseBody
@RequestMapping("/setStatus")
public String setStatus (HttpServletResponse response) {
response.setStatus(403 );
return "设置状态码成功" ;
}
}
通过设置 produces 属性的值,设置响应的报头 Content-Type。示例:
@Controller
@RequestMapping("/request")
public class RequestController {
@ResponseBody
@RequestMapping(value = "/setContentTyper", produces = "application/json")
public String setContentTyper () {
return "{\"OK\":1}" ;
}
}
在开发者工具中也可以看到响应报头的类型为 json 形式。
还可以设置其他 Header,借助 Spring MVC 的内置对象 HttpServletResponse 提供的方法来进行设置。
六、结语 到这里,关于 Spring Web MVC 前后端交互的核心内容就梳理得差不多了 —— 从连接的建立到请求的处理,再到响应的返回,这些都是日常接口开发里的高频操作,通过示例代码将一些入门注解的使用进行展示。希望这篇内容里的注解用法、参数传递技巧能帮你更快上手 Spring Web MVC 的实际开发。