最近维护一个 web 项目,需要增加查询参数,随着业务逻辑的细化,查询条件由最初的2个参数,变成了7个参数,这种情况太常见了。(项目环境:Spring Web 5.1.6、springBoot 2.1.4)
改完 html 页面,还需要修改 controller 文件,改了 controller 文件,还要修改service 和 dao 文件。
举个例子,最初控制器的方法:
@GetMapping("/hello")public void hello(@RequestParam String param1,@RequestParam String param2) { // 处理字符串参数 }
修改后的控制器:
@GetMapping("/hello")public void hello(@RequestParam String param1,@RequestParam String param2,@RequestParam String param3,@RequestParam String param4,@RequestParam String param5,@RequestParam String param6,@RequestParam String param7) { // 处理字符串参数 }
好几类都是如此,太痛苦了,就不能写成一个参数接收?
有的小伙伴会把这些参数封装成一个Vo,然后就可以用一个参数接收了。但是封装我也懒得封装,毕竟封装成一个对象也很麻烦呀!就没有其他办法了吗?
我就用Map集合接收参数如何?试了一下还真行,嘻嘻。
@GetMapping("/hello")public void hello(@RequestParam Map<String,String> map) {// 处理字符串参数}
既然用到了 @RequestParam 注解,我们就把这个注解捋一遍,看看它都能接收什么类型的参数。
一、@RequestParam简单介绍
@RequestParam 是 Spring MVC 框架中用于接收 HTTP 请求参数的注解。在Spring Boot 应用中,通常用于从 HTTP 请求中获取参数值。
假设有一个Spring MVC的Controller类,如下所示:
在这个Controller中,我们定义了一个 GET 请求处理方法 hello,它接受一个名为"name"的请求参数。@RequestParam 注解用于将 HTTP 请求中的参数值赋给对应的方法参数。在这个例子中,方法参数 name 将会接收名为"name"的请求参数的值。
当我们发送一个GET请求到/hello路径,并携带参数,比如/hello?name=John,Spring MVC会自动将参数值"John"注入到方法参数name中,然后方法就可以使用这个值进行处理,最终返回"Hello, John!"。
这就是@RequestParam的基本用法。它还支持一些额外的特性,比如设置默认值、将参数转换为特定类型等。
二、@RequestParam接收数据类型汇总
@RequestParam注解可以接受各种数据类型的参数,包括基本数据类型和其包装类、String、数组、List、Set等集合类型,以及自定义类型(如果能够被Spring MVC转换器转换)。
以下是一些常见的@RequestParam参数类型示例:
基本数据类型和其包装类
@GetMapping("/hello")public String hello(@RequestParam int age) { // 处理整型参数 return "Age: " + age;}
前端URL请求示例:
http://localhost:8080/hello?age=18
String类型
@GetMapping("/hello")public String hello(@RequestParam String name) { // 处理字符串参数 return "Hello, " + name + "!";}
前端URL请求示例:
http://localhost:8080/hello?name=andy
数组类型
@GetMapping("/hello1")public String hello1(@RequestParam String[] hobbies) { // 处理字符串数组参数 return "Hobbies: " + Arrays.toString(hobbies);}
前端URL请求示例:
http://localhost:8080/hello1?hobbies=value1&hobbies=value2&hobbies=value3
在这个URL中,hobbies 是@RequestParam注解期望接收的参数名,它对应String数组中的元素。每个参数名后面跟着等号("=")和相应的值,不同参数之间用"&"符号分隔。
List类型
@GetMapping("/hello")public String hello(@RequestParam List<String> hobbies) { // 处理字符串列表参数 return "Hobbies: " + hobbies;}
前端URL请求示例:
http://localhost:8080/hello?hobbies=value1&hobbies=value2&hobbies=value3
可变参数/变长参数
@GetMapping("/hello2")public String hello2(@RequestParam String... hobbies) { // 可变参数 return "Hobbies: " + Arrays.toString(ArrayUtils.toArray(hobbies));}
前端URL请求示例:
http://localhost:8080/hello2?hobbies=value1&hobbies=value2&hobbies=value3
变长参数不仅可以是String类型,还可以是复杂的对象类型。
6.Map集合
@GetMapping("/hello")public String hello(@RequestParam Map<String, String> params) { // 使用Map中的参数进行处理 String name = params.get("name"); String age = params.get("age"); return "Hello, " + name + "! You are " + age + " years old.";}
前端URL请求示例:
http://localhost:8080/hello?name=test&age=18
在这个URL中,"name=test"和"age=18"就是参数键值对,它们会被Spring MVC自动映射到@RequestParam Map<String, String> params参数中。
7.自定义类型
@GetMapping("/hello")public String hello(@RequestParam User user) { // 处理自定义类型参数 return "User: " + user.getName();}
前端URL请求示例:
http://localhost:8080/hello?name=test&age=18
这个 User 对象就是刚开始小伙伴把所有的参数封装成的Vo。一般使用自定义对象时,@RequestParam注解是可以忽略不写的。
三、@RequestParam属性使用
value属性
用来接收URL地址?之后的参数,必须和被接收参数名称保持一致。name属性是value属性的别名,它俩一个意思。
@RequestParam(value = "username") String userName
Required属性
@RequestParam 注解的 required 属性默认为 true,这意味着如果请求中没有提供相应的参数,将会抛出异常。可以将 required 设置为 false,以允许参数的缺失。
@RequestParam(value = "username", required = false) String username
3. defaultValue默认值
我们可以通过设置 defaultValue 属性来指定参数的默认值,在请求中没有提供参数时会使用该默认值。
@RequestParam(value = "page", defaultValue = "1") int page
以上就是本次的整理,解锁了 @RequestParam 的一个新用法。懒一点还是有好处的,哈哈。
领取专属 10元无门槛券
私享最新 技术干货