@RequestParam绑定请求参数
Spring MVC 可以通过分析处理方法的签名,将HTTP请求信息(如请求参数)绑定到处理方法的入参中。Spring MVC对于Controller的处理方法签名的限制是很宽松的。
开发者可以对处理方法、方法入参 标注响应的注解(如:@PathVariable、@RequestParam、@RequestHeader etc),Spring MVC 会将HTTP请求信息绑定到相应的方法入参中,并根据方法的返回值做后续处理。
使用@RequestParam绑定请求参数值
使用@RequestParam注解,可以将指定的 请求参数的值 传递给指定的 方法参数。
该注解有四个属性:
- name : 指定要绑定的请求参数的名称
- value : 作用与name属性相同
- required :表示name属性中设置的请求参数是否必须存在。默认为true
- defaultValue :当name指定的请求参数未提供或具有空值(null)时,该请求参数的默认值。
简单的代码示例:
@Controller
@RequestMapping(value = "/springmvc")
public class HelloController {
private static final String SUCCESS = "success";
@RequestMapping(value = "/test")
public String testRequestParam(@RequestParam(name = "username",required = true,defaultValue = "monkey") String name , @RequestParam(value = "age",required = false) Integer age)
{
System.out.println(name+"<-->"+age);
return SUCCESS;
}
用于测试的请求:
<a href="/springmvc/test?username=jack&age=22">testRequestParam</a>
测试结果:
jack<-->22
1)、当username请求参数不存在时:
<a href="/springmvc/test?age=22">testRequestParam</a>
报出:HTTP Status 400 - Required String parameter 'username' is not present
2)当username不提供值时:
<a href="/springmvc/test?username&age=22">testRequestParam</a>
输出:monkey<-->22
3)当age请求参数不存在、或不提供值 时
<a href="/springmvc/test?username">testRequestParam</a>
<a href="/springmvc/test?username=jack&age">testRequestParam</a>
输出 :monkey<-->null
monkey<-->null
因为age请求参数设置了required = false,所以即使不存在age请求参数,也不会报错。
但此处有一点需注意:
testRequestParam(@RequestParam(name = "username",required = true,defaultValue = "monkey") String name , @RequestParam(value = "age",required = false) Integer age)
该方法的age参数建议为Integer,因为当age请求参数不存在、或不提供值 时,传递给age参数(testRequestParam方法的age参数,不是HTTP请求参数)的值为null,而int类型(基本数据类型)的值是不允许为null。会抛出java.lang.IllegalStateException
HTTP Status 500 - Request processing failed; nested exception is java.lang.IllegalStateException: Optional int parameter 'age' is present but cannot be translated into a null value due to being declared as a primitive type. Consider declaring it as object wrapper for the corresponding primitive type.
假如根据业务需要(或者自己任性)testRequestParam方法的age参数必须为int类型时,可以通过@RequestParam注解的defaultValue = “0”属性,来避免上述异常。
@RequestHeader注解绑定请求头
使用@RequestHeader注解可以将请求头中的属性值绑定到处理方法的参数中。该注解与@RequestParam有相同的四个属性,用法也没什么不同。
例如:
public String handlerMethod(@RequestHeader(value = “Accept-Language”)String acceptLanguage)
console : zh-CN,zh;q=0.8