温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

四、Spring MVC的RequestParam注解

发布时间:2020-07-26 23:21:39 来源:网络 阅读:14663 作者:艾斯的梦想 栏目:开发技术

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

<p>RequestParam测试,get请求形式
 <a href="/testRequestParam/testReqParam?name=lxy&sex=male&age=15">here</a>
 </p>

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

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";
}

测试代码

<p>required属性设为false,500错误的定义形式,参数转化错误
    <a href="/testRequestParam/testAttrRequired500Error?name=lxy&sex=male">here</a>
</p>

<p>required属性设为false,缺少参数age 不会出错,因为定义类型为Integer
    <a href="/testRequestParam/testAttrRequired?name=lxy&sex=male">here</a>
</p>

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";
}

测试代码

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

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";
}

测试代码:

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


项目源代码:

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


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI