自SpringMVC4.2之后,RequestParam内部有4个参数:
1、String name
2、String value
3、boolean required
4、String defaultValue
其中name和value分别是对方的别名,即二者没区别,我个人比较喜欢用name,因为它的某些特性使得name这个名字更直观,下面会说到。
先看第一个映射方法的定义:
@RequestMapping("/paramTest0") public @ResponseBody String paramTest(Long id){ String result = ""; result += id; return result; }
①然后我在浏览器地址栏上输入:http://localhost:8080/test/hello/paramTest0
浏览器显示:null
这里引申出了SpringMVC的一个特性,即当浏览器中没有输入相应参数和值,那么SpringMVC会给id赋值为null,注意是null而非0,因此参数都最好不要用基础类型。
②在浏览器中输入:http://localhost:8080/test/hello/paramTest0?userName=zhang&userName=li&id=9&userName=shit
浏览器显示:9
说明浏览器中只要有输入需要的参数即可,而不管是否包含多余的参数,且没有规定顺序。
③在浏览器中输入:http://localhost:8080/test/hello/paramTest0?id=6
显示为:6
这个就不解释了。
#########################################分隔符##################################################
再看第二个映射方法的定义:
@RequestMapping("/paramTest") public @ResponseBody String paramTest(@RequestParam(name="userName", required = false) String[] userNames, Long id){ String result = ""; if(userNames != null){ for(int i=0;i<userNames.length;i++){ result += userNames[i] + "#"; } } result += id; return result; }
①然后在浏览器输入:http://localhost:8080/test/hello/paramTest?userName=zhang&userName=li&id=5&userName=fuck
显示为:zhang#li#fuck#5
由此引申出:首先URL请求的参数部分可以有多对参数的参数名一样,如上面的userName,且它们中间可以用其它参数隔开(上面用了id=5隔开)而不会影响这几个参数名一样的参数值构成“数组”,
相同的参数名的值将会被浏览器变成类似userName="zhang,li,fuck",告诉服务器这是个数组,这里的元素值的顺序则是跟在URL请求中的顺序是对应的。
然后看我们方法参数里的是userNames而非userName,但是仍然显示正确,这是因为RequestParam的name或value属性的值userName才是和
浏览器那边传过来的参数名对应(个人认为这是name比value更直观一点的原因),而它注解的参数userNames就是
此注解"userName"要“赋值”的变量(或说RequestParam类似做了个中介将客户端请求中的参数值导向到相应的请求映射方法的参数上,即userNames)。
还要注意,一个@RequestParam只能注解一个参数,即后面的Long id上是没有该注解的。
RequestParam中的required是指这个参数是否客户端必须提供,defaultValue则是如果没有提供该参数默认值是什么(故required=true, defaultValue="xxx"就没意义了)。