前面的章节,有提到可以通过@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  

    

post请求形式

    name:
    sex:
    age:
    

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