前面的章节,有提到可以通过@PathVariable注解来映射restful风格的url中的值到方法中去,本章就看看如果不使用restful风格的url来怎么进行参数的传递。
RequestParam就是来实现参数传递的,能够把用户的输入绑定到后台的方法上面。它有三个主要的属性:
value:定义参数的名称
required:定义参数是否是必须的,默认是true
defaultValue:定义参数的默认值
下面结合具体的示例代码来看一下如何使用:
1、下面的这段代码定义了三个参数,一个name,一个sex,一个age,可以看出来以下两种方式是等价的,它们的作用是一样的
@RequestParam("name") String userName @RequestParam(value = "name") String userName
2、参数的绑定是name,而不是userName,即如果传递的参数名称为userName,那么就不能接收到参数
@RequestMapping("/testReqParam") public String testRequestParam(@RequestParam("name") String userName, @RequestParam("sex") String sex, @RequestParam(value = "age") int age, Model model) { model.addAttribute("name", userName); model.addAttribute("sex", sex); model.addAttribute("age", age); return "result"; }
测试代码:下面定义了三个请求,第一个完整参数,get请求,第二个完整参数post请求,第三个缺少参数age。前两个都会成功,最后一个会404的,因为required的默认值是true
RequestParam测试,get请求形式 here
RequestParam测试,get请求形式,缺少age参数,出现404 here
3、required属性定义,直接这么定义会不会出问题,答案是会的,会出现500错误。为什么?因为age参数是null,在spring mvc在进行类型转换的时候,null不能转为int类型,那要怎么办呢?
@RequestMapping("/testAttrRequired500Error") public String testAttrRequired500Error(@RequestParam("name") String userName, @RequestParam("sex") String sex, @RequestParam(value = "age", required = false) int age, Model model) { model.addAttribute("name", userName); model.addAttribute("sex", sex); model.addAttribute("age", age); return "result"; }
这一段代码把int修改为了Integer,此时无论是否缺少age参数都是可以成功的。
@RequestMapping("/testAttrRequired") public String testAttrRequired(@RequestParam("name") String userName, @RequestParam("sex") String sex, @RequestParam(value = "age", required = false) Integer age, Model model) { model.addAttribute("name", userName); model.addAttribute("sex", sex); model.addAttribute("age", age); return "result"; }
测试代码
required属性设为false,500错误的定义形式,参数转化错误 here
required属性设为false,缺少参数age 不会出错,因为定义类型为Integer here
4、defaultValue的使用,定义参数的默认是,如果没有传递该参数,使用此处定义的,此时即使缺少age参数,也不会出现错误了,因为会使用0来作为age的值。
@RequestMapping("/testAttrDefaultValue") public String testAttrDefaultValue(@RequestParam("name") String userName, @RequestParam("sex") String sex,@RequestParam(value = "age", required = false, defaultValue = "0") int age, Model model) { model.addAttribute("name", userName); model.addAttribute("sex", sex); model.addAttribute("age", age); return "result"; }
测试代码
required属性设为false,设置defaultValue为0,缺少age参数也不会出错, 因为给定了一个默认值,按照该值进行转换 here
5、RequestHeader和CookieValue的使用,不太会用到,和RequestParam用法一致,示例代码如下所示:
/** * 注解 @RequestHeader 可以定义获取请求头的信息 * 注解 @CookieValue 可以定义获取请求的cookie中的值 */ @RequestMapping("/testRequestHeaderAndCookieValue") public String testRequestHeader(@RequestHeader("Accept-Language") String language, @CookieValue("JSESSIONID") String sessionId, Model model) { System.out.println("header:" + language + "\tsessionId:" + sessionId); return "result"; }
测试代码:
@RequiredHeader和@CookieValue的使用说明: here
项目源代码:
https://git.oschina.net/acesdream/spring-mvc