前面的章节,有提到可以通过@PathVariable注解来映射restful风格的url中的值到方法中去,本章就看看如果不使用restful风格的url来怎么进行参数的传递。

RequestParam就是来实现参数传递的,能够把用户的输入绑定到后台的方法上面。它有三个主要的属性:

value:定义参数的名称

required:定义参数是否是必须的,默认是true

defaultValue:定义参数的默认值

下面结合具体的示例代码来看一下如何使用:

1、下面的这段代码定义了三个参数,一个name,一个sex,一个age,可以看出来以下两种方式是等价的,它们的作用是一样的

@RequestParam("name")StringuserName@RequestParam(value="name")StringuserName

2、参数的绑定是name,而不是userName,即如果传递的参数名称为userName,那么就不能接收到参数

@RequestMapping("/testReqParam")publicStringtestRequestParam(@RequestParam("name")StringuserName,@RequestParam("sex")Stringsex,@RequestParam(value="age")intage,Modelmodel){model.addAttribute("name",userName);model.addAttribute("sex",sex);model.addAttribute("age",age);return"result";}


测试代码:下面定义了三个请求,第一个完整参数,get请求,第二个完整参数post请求,第三个缺少参数age。前两个都会成功,最后一个会404的,因为required的默认值是true

<p>RequestParam测试,get请求形式<ahref="/testRequestParam/testReqParam?name=lxy&sex=male&age=15">here</a></p><formaction="/testRequestParam/testReqParam"method="post"><p>post请求形式</p>name:<inputtype="text"name="name"value=""/><br/>sex:<inputtype="text"name="sex"value=""/><br/>age:<inputtype="text"name="age"value=""/><br/><inputtype="submit"value="submit"/></form><p>RequestParam测试,get请求形式,缺少age参数,出现404<ahref="/testRequestParam/testReqParam?name=lxy&sex=male">here</a></p>

3、required属性定义,直接这么定义会不会出问题,答案是会的,会出现500错误。为什么?因为age参数是null,在spring mvc在进行类型转换的时候,null不能转为int类型,那要怎么办呢?

@RequestMapping("/testAttrRequired500Error")publicStringtestAttrRequired500Error(@RequestParam("name")StringuserName,@RequestParam("sex")Stringsex,@RequestParam(value="age",required=false)intage,Modelmodel){model.addAttribute("name",userName);model.addAttribute("sex",sex);model.addAttribute("age",age);return"result";}


这一段代码把int修改为了Integer,此时无论是否缺少age参数都是可以成功的。

@RequestMapping("/testAttrRequired")publicStringtestAttrRequired(@RequestParam("name")StringuserName,@RequestParam("sex")Stringsex,@RequestParam(value="age",required=false)Integerage,Modelmodel){model.addAttribute("name",userName);model.addAttribute("sex",sex);model.addAttribute("age",age);return"result";}

测试代码

<p>required属性设为false,500错误的定义形式,参数转化错误<ahref="/testRequestParam/testAttrRequired500Error?name=lxy&sex=male">here</a></p><p>required属性设为false,缺少参数age不会出错,因为定义类型为Integer<ahref="/testRequestParam/testAttrRequired?name=lxy&sex=male">here</a></p>

4、defaultValue的使用,定义参数的默认是,如果没有传递该参数,使用此处定义的,此时即使缺少age参数,也不会出现错误了,因为会使用0来作为age的值。

@RequestMapping("/testAttrDefaultValue")publicStringtestAttrDefaultValue(@RequestParam("name")StringuserName,@RequestParam("sex")Stringsex,@RequestParam(value="age",required=false,defaultValue="0")intage,Modelmodel){model.addAttribute("name",userName);model.addAttribute("sex",sex);model.addAttribute("age",age);return"result";}

测试代码

<p>required属性设为false,设置defaultValue为0,缺少age参数也不会出错,因为给定了一个默认值,按照该值进行转换<ahref="/testRequestParam/testAttrDefaultValue?name=lxy&sex=male">here</a></p>

5、RequestHeader和CookieValue的使用,不太会用到,和RequestParam用法一致,示例代码如下所示:

/***注解@RequestHeader可以定义获取请求头的信息*注解@CookieValue可以定义获取请求的cookie中的值*/@RequestMapping("/testRequestHeaderAndCookieValue")publicStringtestRequestHeader(@RequestHeader("Accept-Language")Stringlanguage,@CookieValue("JSESSIONID")StringsessionId,Modelmodel){System.out.println("header:"+language+"\tsessionId:"+sessionId);return"result";}

测试代码:

<p>@RequiredHeader和@CookieValue的使用说明:<ahref="/testRequestParam/testRequestHeaderAndCookieValue">here</a></p>


项目源代码:

https://git.oschina.net/acesdream/spring-mvc