一、简介
在使用Controller层处理前端请求时,接收前端页面参数是非常重要的一步,页面的参数该如何接收,常常会让人混淆,比如我~
本文也是我的学习笔记,希望可以帮助大家更好地理解和掌握这些方法,以Restful风格为例,参考了一些优快云大佬的文章,整理了一下常见的接收传参的方法。
IDE:idea、JDK:1.8
二、接收参数方式
准备环境:Book.class,BookController.class
实体类Book.class,里面的属性有以下:
@Data
public class Book {
private Long id;
private String name;
private float price;
}
控制器类BookController.class
/**
* 为了方便查看传参是否成功,我们将接收到的参数用log,info()打印在控制台, 该方法需要在控制器类上方添加@Slf4j注解
*/
@Slf4j
@RestController
@RequestMapping("/book")
public class BookController {
}
1.无注解的接收
注意:无注解的接收只能获取Get方式的请求的参数,如果用别的请求就会报错,并且接收不到页面传递过来的参数
@Slf4j
@RestController
@RequestMapping("/book")
public class BookController {
/**
* 无注解的接收,单个参数接收的方式
* http://localhost:8080/book/text1?id=1314
* @param id
*/
@GetMapping("/text1")
public void text1(Long id) {
log.info(id.toString()); // 1314
}
/**
* 无注解的接收,实体类接收的方式,会自动封装进book中,更加通用,推荐
* http://localhost:8080/book/text2?id=1314
* @param book
*/
@GetMapping("/text2")
public void text2(Book book) {
log.info(book.toString()); // Book(id=1314, name=null, price=0.0)
}
}
2.请求路径带参数
2.1 @RequestParam
@RequestParam将请求参数绑定到你控制器的方法参数上,这样就能够正确地获取前台传递的参数值,并进行后续的业务处理。使用@RequestParam注解可以有效避免参数传递不匹配的问题,提高系统的稳定性和安全性。
@RequestParam(value=”参数名”,required=”true/false”,defaultValue=””)
/*
value:参数名
required:是否包含该参数,默认为true,表示该请求路径中必须包含该参数,如果不包含就报错。
defaultValue:默认参数值,如果设置了该值,required=true将失效,自动为false,如果没有传该参数,就使用默认值
*/
@Slf4j
@RestController
@RequestMapping("/book")
public class BookController {
/**
* @RequestParam
* http://localhost:8080/book/test3?name=《编译原理》
* url参数中的name必须要和@RequestParam("name")一致
* @param name
*/
@DeleteMapping("/test3")
public void test3(@RequestParam("name")String name){
log.info(name);
}
/**
* @RequestParam
* http://localhost:8080/book/test4
* url中没有name参数不会报错,因为required=false、有参数就显示出来
* @param name
*/
@DeleteMapping("/test4")
public void test4(@RequestParam(value="name",required=false)String name){
log.info(name); // null
}
/**
* @RequestParam
* http://localhost:8080/book/test5?name=《编译原理》 显示为《编译原理》
* http://localhost:8080/book/test5?name 显示为《无名之书》
* defaultValue:默认参数值,如果设置了该值,required=true将失效,自动为false,如果没有传该参数,就使用默认值
* @param name
*/
@DeleteMapping("/test5")
public void test5(@RequestParam(value="name",required=true,defaultValue="《无名之书》")String name){
log.info(name); // 第一个url:《编译原理》,第二个url:《无名之书》
}
/**
* @RequestParam
* http://localhost:8080/book/test6?ids=23&ids=98&ids=64
* @RequestParam中的参数也可以省略,参数名默认就是和形参名称一致
* @param ids
*/
@DeleteMapping("/test6")
public void test6(@RequestParam List<Long> ids){
log.info(ids.toString()); // [23, 98, 64]
}
}
注意:
@RequestParam注解和HttpServletRequest的getParameter()方法的作用相同,都是用于从请求中获取参数的值。但是它们的实现方式略有不同。
@RequestParam注解是SpringMVC框架提供的注解,底层是基于Java反射机制实现的。它通过反射获取Controller方法的参数信息,并根据参数名和@RequestParam注解中的value属性值从请求中获取参数值,然后进行类型转换和参数绑定等操作。
而HttpServletRequest的getParameter()方法是Servlet API中提供的方法,底层是基于Servlet容器实现的。它通过解析HTTP请求中的参数字符串,将参数名和参数值存储在一个名为parameterMap的Map对象中,然后通过调用getParameter()方法获取对应的参数值。
2.2 @PathVariable
@PathVariable用于将 URL中的占位符参数绑定到方法的形参上。例如,对于以下的请求 URL:http://localhost:8080/user/1001,其中的 “1001” 就是一个占位符参数,可以使用 @PathVariable 注解将其绑定到方法的形参上。下面看一下具体的例子
@Slf4j
@RestController
@RequestMapping("/book")
public class BookController {
/**
* @PathVariable
* http://localhost:8080/book/test7/23
* url参数中的id必须要和@PathVariable("id")一致
* @param id
*/
@GetMapping("/test7/{id}")
public void test7(@PathVariable(value = "id") Long id) {
log.info(id.toString()); // 23
}
/**
* @PathVariable
* http://localhost:8080/book/test8/42
* 如果不指定参数名,则默认使用形参名称作为占位符参数名
* @param id
*/
@GetMapping("/test8/{id}")
public void test8(@PathVariable Long id) {
log.info(id.toString()); // 42
}
}
3.@RequsetBody
@RequestBody用于将请求体中的JSON或XML数据绑定到方法的形参上。而最常用的使用请求体传参的无疑是Post请求了,所以使用@RequestBody接收数据时,一般都用Post方式进行提交。
@Slf4j
@RestController
@RequestMapping("/book")
public class BookController {
/**
* @RequestBody
* http://localhost:8080/book/test9
* 请求体中:
* {
* "name": "《编译原理》",
* "id": 10086,
* "price": 40.6
* }
* @param book
*/
@PostMapping("/test9")
public void test9(@RequestBody Book book) {
log.info(book.toString()); // Book(id=10086, name=《编译原理》, price=40.6)
}
}
三、总结
接收前端页面参数是实现前后端数据交互的关键步骤,常见的接收传参的方法有:无注解接收、@RequestParam注解、@PathVariable注解和@RequestBody。
- 无注解接收:直接在方法的参数中定义需要接收的参数名,Spring会自动匹配参数名和前端传递的参数名,并将值赋给参数。
- @RequestParam注解:使用@RequestParam注解可以将前端传递的参数与方法参数绑定,例如:@RequestParam(“name”) String name,表示将前端传递的名为“name”的参数值绑定到方法参数name上。
- @PathVariable 注解:使用@PathVariable注解可以将URL中的参数与方法参数绑定,例如:@GetMapping(“/book/{id}”),表示将URL中的{id}与方法参数id绑定。
- @RequestBody:使用@RequestBody注解可以将前端传递的JSON数据转换为Java对象,例如:@RequestBody Book book,表示将前端传递的JSON数据转换为Book对象。
总之,根据不同的需求和场景,需要选择不同的接收传参的方法,希望本篇文章对大家有帮助~
参考文章:
前端传值的几种方式:https://blog.youkuaiyun.com/weixin_42260782/article/details/126059313
@RequestParam:https://blog.youkuaiyun.com/sswqzx/article/details/84195043
@PathVariable:https://blog.youkuaiyun.com/weixin_45393094/article/details/108814901