Spring mvc中Controller参数绑定注解详解
简介
Request Method参数常用的注解,我们根据他们处理的Request不同部分分为4类:
- 处理Request Uri(这里指的是Uri template中的Variable,不包含QuertString部分):@PathVariable
- 处理Request Header:@RequestHeader,@CookieValue
- 处理Request Body: @RequestParam,@RequestBody
- 处理Attribute类型:@SessionAttributes,@ModelAttribute;
1.@PathVariable
当使用@RequestMapping URI template样式映射时,即someUrl/{paramId},这时的paramId可以通过@PathVariable注解绑定它传过来的值到方法的参数上。
@Controller
@RequestMapping("/student/{studentId}")
public ResponseEntity<List<Students>> queryStudentById(@Paramvariable String studentId){
return new ReponseEntity<>(studentService.queryStudentById(studentId),HttpStatus.Ok)
}
2.@RequestHeader、@CookieValue
@RequestHeader注解,可以把Request请求header部分的值绑定到方法的参数上。
这时一个Request的Header部分:
Host localhost:8080
Accept text/html,application/xhtml+xml,aaplication/xml;q=0.9
Accept-Language fr,en-gb;q=0.7,en;q=0.3
Accept-Encoding gzip,defalte
Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive 300
使用@RequestHeader注解的Java片段:将Request header部分的Accept-Encoding和Keep-Alive的值分别绑定在encoding和keepAlive上。
@RequestMapping("displayHeaderInfo.do")
public void displayHeaderInfo(@RequestHeader("Accept-Encoding") String encoding,@RequestHeader("Keep-Alive") long keepAlive){
//...
}
@CookieValue可以把Request header中关于cookie的值绑定到方法的参数上
例如有这样的Cookie值
JSESSIONID=415AAC78C59DACE0B842
使用@CookieValue绑定制定Cookie值的Java代码:将JSESSIONID的值绑定到了参数cookie 上
@Requestmapping("displayHeaderInfo.do")
public void displayHeaderInfo(@CookieValue("JSESSIONID") String cookie){
//...
}
3.@RequestParam、@RequestBody
@RequestParam使用分为2种情况:第一种为常用情况
1. 处理简单类型的绑定:通过Request.getParamter()获取的String的值可直接转换为简单类型String的情况。使用Request.getParamter()的方式获取参数,可以处理get方式中的queeryString的值,也可以处理post方式中的body data的值;
2. 处理Content-Type:为application/s-www-form-urlencoded编码的内容,提交方式GET、POST;
@RequestParam有两个参数:value(用来指定要传入值的id名称)、required(用来指明参数是否必须绑定)
下面是使用@RequestParam的java代码片段:
@RequestMapping(value="/teacher",method=RequestMethod.GET,produces="application/json")
public ResponseEntity<List<Teacher>> queryByIdAndType(@RequestParam String id,@RequestParam int type){
return new ResponseEntity<>(teacherService.queryByIdAndType(id,type),HttpStatus.OK);
}
@RequestBody:常用来处理Content-Type,但并不是application/x-www-form-urlended编码的内容虽然可以处理它,例如application/json,application/xml等。
使用@RequestBody的代码
@RequestMapping(value="/something",method=RequestMethod.PUT)
public void handle(@RequestBody String body,Writer writer)throws IOException{
writer.write(body);
}
4.@SeesionAttributes、@ModelAttribute
@SessionAttributes:用来绑定HttpSession中的attribute对象的值,便于在方法中的参数里使用;拥有两个属性value、types,可以通过名字和类型指定要使用的attribute对象
@Controller
@RequestMapping("/editPet.do")
@SessionAttributes("pet")
public class EditPetForm{
@RequestMapping(method=RequestMethod.GET)
public String setupForm(Model model){
Pet pet=new Pet(1);
model.addAttribute("pet",pet)
}
}
@ModelAttribute:
参考博客:
* http://hbiao68.iteye.com/blog/1948380
* http://blog.csdn.net/li_xiao_ming/article/details/8349115
参考文档:
http://blog.csdn.net/walkerjong/article/details/7946109