request.getParameter()和@RequestParam的区别
- request.getParameter("name")和@RequestParam String name的获取方式是不同的
REQUEST获取参数方式
(1)getParameter(String name)
获取name对应的value,如果有多个,返回第一个。
(2)getParameterNames()
获取request里所有的name,返回Enumeration类型。
(3)getParameterValues(String name)
获取name对应的所有value
其实这三种方式都是从一个全局变量Map<String, String[]> 中获取的值
由此可见:key是String类型,也就是name,而value是String数组类型,请求时是可以提供多个相同的key,value值进行请求
示例:
http://127.0.0.1:8088/get/getparam?id=123&id=456 (可以请求多个相同key和多个value)
这种情况下如果使用getParameter方法进行获取,返回的则是对应的key的value
如果一个key对应多个值,Spring默认只返回 String数组 下标为0的value 【重点】:返回的是单个value 的String
如果想获取所有,就要用到getParameterValues方法来进行获取了
@REQUESTPARAM获取参数
@RequestParam 并非调用.getParameter("name")方法
示例:
上图的返回结果:123,456
源码求证 (从InvocableHandlerMethod一路debug调试到RequestParamMethodArgumentResolver发现以下代码:)
这里发现,@RequestParam 注解获取参数,其实调用的是getParameterValues方法,该方法返回的是String数组,并且源码中做了判断,在数组不为null的情况下,如果数组长度为1返回第一个元素,如果否则(大于1)返回所有。
结论
request.getParameter和@RequestParam本质上是不同的,所以在不确定是否有多个value的情况下,@RequestParam是不能代替request.getParameter来使用的!
规范的@RequestParam写法应该是@RequestParam String[] name,
而request.getParameter获取的确确实实是第一个value,可能我们研发过程中很少遇到多个相同key提交请求这种情况,但是这种情况是真实存在的,如果不了解这段代码,还是把@RequestParam当作获取第一个参数使用,早晚会出问题。