Java充电社
专辑
博文
联系我
本人继续续收门徒,亲手指导
SpringMVC教程
-> @RequestParam用法及原理详解
1、Helloword
2、@Controller、@RequestMapping
3、接口测试利器
4、如何接受请求中的参数?
5、@RequestBody接收Json格式数据
6、多文件上传
7、返回页面常见的5种方式
8、返回json格式数据 & 通用返回值设计
9、SpringMVC返回null是什么意思?
10、异步处理请求
11、如何集成静态资源?
12、拦截器怎么用?
13、统一异常处理
14、实战篇:通用返回值 & 异常处理设计
15、全注解的方式 & 原理解析
16、源码解析SpringMVC处理请求的流程
17、源码解析SpringMVC容器的启动过程
18、RequestBodyAdvice:对@ReuqestBody进行增强
19、ResponseBodyAdvice:对@ResponseBody进行增强
20、RESTful接口详解
21、接口调用利器RestTemplate
22、参数解析器HandlerMethodArgumentResolver解密
23、@RequestParam用法及原理详解
24、@RequestBody原理解密
25、@RequestHeader详解
26、@CookieValue详解
27、@RequestAttribute详解
28、@SessionAttribute详解
29、重定向和转向详解
30、Converter转换器详解
31、跨域问题详解
32、类容协商,颠覆你的认知
33、终章
34、CORS通信
35、浏览器安全策略 & CORS
36、Http中的Content-Type详解
上一篇:参数解析器HandlerMethodArgumentResolver解密
下一篇:@RequestBody原理解密
<div style="display:none"></div> 大家好,我是路人,这是SpringMVC系列第23篇。 前面没有详细介绍SpringMVC中各种注解的用法,这里准备一一补上,今天来看@RequestParam注解的用法。 ## 1、预备知识 1. <a href="http://www.itsoku.com/course/6/214" target="_blank">接口测试利器 HTTP Client</a> 2. <a href="http://www.itsoku.com/course/6/233" target="_blank">参数解析器HandlerMethodArgumentResolver解密</a> ## 2、@RequestParam注解的作用 标注在接口的方法参数上,被标注的参数的值来源于`request.getParameter`或`request.getParameterValues`。 **推荐阅读**:[2021 最新版 Java 微服务学习线路图 + 视频](https://mp.weixin.qq.com/s?__biz=MzkwOTAyMTY2NA==&mid=2247484192&idx=1&sn=505f2faaa4cc911f553850667749bcbb&scene=21#wechat_redirect) ## 3、@RequestParam源码 ```java @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface RequestParam { /** * 对应request中参数名称 */ @AliasFor("name") String value() default ""; /** * 同value */ @AliasFor("value") String name() default ""; /** * 请求中是否必须有这个参数,默认为true */ boolean required() default true; /** * 默认值 */ String defaultValue() default ValueConstants.DEFAULT_NONE; } ``` ## 4、案例1:@RequestParam指定name,获取对应参数的值 ### 4.1、案例接口代码 ```java /** * {@link RequestParam}中指定name,用来取name的值对应的请求参数中的值 * * @param name:可以不传递name参数,不传递的时候默认值为ready * @param age * @param pets * @return */ @RequestMapping("/requestparam/test1") public Map<String, Object> test1(@RequestParam(value = "name", required = false, defaultValue = "ready") String name, //相当于request.getParameter("name") @RequestParam("age") int age, //Integer.parseInt(request.getParameter("age")) @RequestParam("interests") String[] interests, //request.getParameterValues("pets") @RequestParam("pets") List<String> pets //Arrays.asList(request.getParameterValues("pets")) ) { Map<String, Object> result = new LinkedHashMap<>(); result.put("name", name); result.put("age", age); result.put("interests", interests); result.put("pets", pets); return result; } ``` ### 4.2、用例1:所有参数都传值 ```java POST http://localhost:8080/chat18/requestparam/test1 Content-Type: application/x-www-form-urlencoded name=路人&age=35&interests=篮球&interests=旅游&pets=小狗&pets=小猫 ``` 运行上面用例代码输出 ```java { "name": "路人", "age": 35, "interests": [ "篮球", "旅游" ], "pets": [ "小狗", "小猫" ] } ``` ### 4.3、用例2:name不传递,会取默认值ready ```java POST http://localhost:8080/chat18/requestparam/test1 Content-Type: application/x-www-form-urlencoded age=35&interests=篮球&interests=旅游&pets=小狗&pets=小猫 ``` 运行上面用例代码输出 ```json { "name": "ready", "age": 35, "interests": [ "篮球", "旅游" ], "pets": [ "小狗", "小猫" ] } ``` ### 4.4、用来3:required属性为true,不传,则报错 ```java POST http://localhost:8080/chat18/requestparam/test1 Content-Type: application/x-www-form-urlencoded ``` 参数都没有传递,而接口要求除name之外的,其他几个参数都必须传递,所以这个案例结果会报400错,提示age参数不存在,这个错误比较常见,大家熟悉下,以后看到了就知道什么问题了。 ![](https://itsoku.oss-cn-hangzhou.aliyuncs.com/itsoku/blog/article/234/bfece79b-0619-4022-b186-8b1636a45745.png) ## 5、案例2:@RequestParam不指定name,获取所有参数值 当我们想用一个Map来接收所有参数的之后,代码如下,@RequestParam不用指定name的值,参数类型为Map<String,String>,所有请求参数会以参数名称:值的方式丢在Map中。 ```java /** * {@link RequestParam}不指定name,用于接收所有参数的值, * 参数类型为Map<String,String>,key为请求中的参数名称,value为值 * * @param paramMap * @return */ @RequestMapping("/requestparam/test2") public Map<String, String> test2(@RequestParam Map<String, String> paramMap) { return paramMap; } ``` 运行下面的用例调用上面接口 ```java ### POST http://localhost:8080/chat18/requestparam/test2 Content-Type: application/x-www-form-urlencoded name=路人&age=35&interests=篮球&interests=旅游&pets=小狗&pets=小猫 ``` 运行输出 ```json { "name": "路人", "age": "35", "interests": "篮球", "pets": "小狗" } ``` interests和pet都是有多个值,上面的结果中都只获取了第一个 值,如果我们想获取所有的值呢,下面看案例3。 ## 6、案例3:@RequestParam不指定name,获取所有参数值 ```java /** * {@link RequestParam}不指定name,用于接收所有参数的值, * 参数类型为MultiValueMap<String, String>:key为请求中的参数名称,value为值的集合List<String> * * @param paramMap * @return */ @RequestMapping(value = "/requestparam/test3", produces = MediaType.APPLICATION_JSON_VALUE) public MultiValueMap<String, String> test3(@RequestParam MultiValueMap<String, String> paramMap) { return paramMap; } ``` 这个接口的参数是`MultiValueMap`类型,这玩意是干啥的?好像很陌生啊,哈哈 再模式的东西,把其源码放出来,瞬间明了了,如下,可以看出来`MultiValueMap`相当于`Map<String,List<String>>` ```java public interface MultiValueMap<K, V> extends Map<K, List<V>> { } ``` 运行下面的用例调用上面接口,注意下面第3行,表示我们期望服务器端返回json格式数据 ```java POST http://localhost:8080/chat18/requestparam/test3 Content-Type: application/x-www-form-urlencoded Accept: application/json name=路人&age=35&interests=篮球&interests=旅游&pets=小狗&pets=小猫 ``` 运行输出,结果的值比较特别,是一个String类型的数组,这次获取到所有参数的值了。 ```json { "name": [ "路人" ], "age": [ "35" ], "interests": [ "篮球", "旅游" ], "pets": [ "小狗", "小猫" ] } ``` ## 7、@RequestParam原理 @RequestParam标注的参数的值是有下面2个类处理的,有兴趣了解的建议先看一下上一篇中的:[参数解析器HandlerMethodArgumentResolver解密](https://mp.weixin.qq.com/s/XQ1K4eXtGvfG_0RReFVg8Q),然后再来看下面2个类的源码就是小意思了。 ```java org.springframework.web.method.annotation.RequestParamMethodArgumentResolver org.springframework.web.method.annotation.RequestParamMapMethodArgumentResolver ``` ## 8、总结 - @RequestParam注解用来标注在控制器方法的参数上,springmvc从request中获取请求的值赋值给方法的参数 - @RequestParam指定name时,可以获取request中指定参数的值,相当于request.getParameter(name)或request.getParameters(name) - @RequestParam未指定name,参数类型为:Map<String,String>时,用来接收request中所有参数的值,Map中key为参数名称,value为参数的值 - @RequestParam未指定name,参数类型为MultiValueMap<String, String>时,用来接收request中所有参数的值,key为请求中的参数名称,value为值的集合List<String> - **推荐阅读**:[尚硅谷 Java 学科全套教程(总 207.77GB)](https://mp.weixin.qq.com/s?__biz=MzkzOTI3Nzc0Mg==&mid=2247484964&idx=2&sn=c81bce2f26015ee0f9632ddc6c67df03&scene=21#wechat_redirect) ## 9、代码位置及说明 ### 9.1、git地址 ```html https://gitee.com/javacode2018/springmvc-series ``` ### 9.2、本文案例代码结构说明 ![](https://itsoku.oss-cn-hangzhou.aliyuncs.com/itsoku/blog/article/234/5318ddca-c2c5-4c09-82ac-9f6fcdb9b266.png) <a style="display:none" target="_blank" href="https://mp.weixin.qq.com/s/_S1DD2JADnXvpexxaBwLLg" style="color:red; font-size:20px; font-weight:bold">继续收门徒,亲手带,月薪 4W 以下的可以来找我</a> ## 最新资料 1. <a href="https://mp.weixin.qq.com/s?__biz=MzkzOTI3Nzc0Mg==&mid=2247484964&idx=2&sn=c81bce2f26015ee0f9632ddc6c67df03&scene=21#wechat_redirect" target="_blank">尚硅谷 Java 学科全套教程(总 207.77GB)</a> 2. <a href="https://mp.weixin.qq.com/s?__biz=MzkwOTAyMTY2NA==&mid=2247484192&idx=1&sn=505f2faaa4cc911f553850667749bcbb&scene=21#wechat_redirect" target="_blank">2021 最新版 Java 微服务学习线路图 + 视频</a> 3. <a href="https://mp.weixin.qq.com/s?__biz=MzkwOTAyMTY2NA==&mid=2247484573&idx=1&sn=7f3d83892186c16c57bc0b99f03f1ffd&scene=21#wechat_redirect" target="_blank">阿里技术大佬整理的《Spring 学习笔记.pdf》</a> 4. <a href="https://mp.weixin.qq.com/s?__biz=MzkwOTAyMTY2NA==&mid=2247484544&idx=2&sn=c1dfe907cfaa5b9ae8e66fc247ccbe84&scene=21#wechat_redirect" target="_blank">阿里大佬的《MySQL 学习笔记高清.pdf》</a> 5. <a href="https://mp.weixin.qq.com/s?__biz=MzkwOTAyMTY2NA==&mid=2247485167&idx=1&sn=48d75c8e93e748235a3547f34921dfb7&scene=21#wechat_redirect" target="_blank">2021 版 java 高并发常见面试题汇总.pdf</a> 6. <a href="https://mp.weixin.qq.com/s?__biz=MzkwOTAyMTY2NA==&mid=2247485664&idx=1&sn=435f9f515a8f881642820d7790ad20ce&scene=21#wechat_redirect" target="_blank">Idea 快捷键大全.pdf</a> ![](https://itsoku.oss-cn-hangzhou.aliyuncs.com/itsoku/blog/article/1/2883e86e-3eff-404a-8943-0066e5e2b454.png)
#custom-toc-container