@RequestMapping 用法详解之地址映射

@RequestMapping 用法详解之地址映射


引言:

前段时间项目中用到了REST风格来开发程序,但是当用POST,PUT模式提交数据时,发现服务器端接受不到提交的数据(服务器端参数绑定没有加任何注解),查看了提交方式为应用程序/ json,而且服务器端通过request.getReader()打出数据里确实存在浏览器提交的数据。为了找出原因,便对参数绑定(@RequestParam,@RequestBody,@RequestHeader,@PathVariable)进行了研究,同时也看了一下HttpMessageConverter的相关内容,在此一并总结。


简介:

@RequestMapping

RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

RequestMapping注解有六个属性,下面我们把她分成三类进行说明。

1,价值,方法;

价值:指定请求的实际地址,指定的地址可以是URI模板(后面将会说明);

方法:指定请求的方法类型,GET,POST,PUT,DELETE等;


2,消费,生产;

消费:指定处理请求的提交内容类型(Content-Type),例如application / json,text / html;

产生:指定返回的内容类型,仅当请求请求头中的(Accept)类型中包含该指定类型才返回;


3,params,headers;

params:指定请求中必须包含某些参数值是,才让该方法处理。

标题:指定请求中必须包含某些指定的标题值,才能让该方法处理请求。


示例:

1,value / method示例

默认RequestMapping(“.... str ...”)即为值的值;

[java]  查看纯 文本
  1. @Controller  
  2. @RequestMapping “/约会” )  
  3. public class  AppointmentsController {   
  4.   
  5.     私人最终 预约预约书   
  6.       
  7.     @Autowired  
  8.     public  AppointmentsController(AppointmentBook约稿){  
  9.         这个.appointmentBook =约会书;  
  10.     }  
  11.   
  12.     @RequestMapping (method = RequestMethod.GET)  
  13.     public  Map get(){  
  14.         return  appointmentBook.getAppointmentsForToday();  
  15.     }  
  16.   
  17.     @RequestMapping (value = “/ {day}” ,method = RequestMethod.GET)  
  18.     public  Map getForDay(@PathVariable @DateTimeFormat (iso = ISO.DATE)Date day,Model model){   
  19.         返回 约会Book.getAppointmentsForDay(day);  
  20.     }  
  21.   
  22.     @RequestMapping (value = “/ new” ,method = RequestMethod.GET)  
  23.     public  AppointmentForm getNewForm(){  
  24.         返回新的 AppointmentForm();   
  25.     }  
  26.   
  27.     @RequestMapping (method = RequestMethod.POST)  
  28.     public  String add(@Valid  AppointmentForm约会,BindingResult结果){  
  29.         if  (result.hasErrors()){  
  30.             返回“约会/新” ;   
  31.         }  
  32.         datingBook.addAppointment(约会);  
  33.         返回“redirect:/约会” ;   
  34.     }  
  35. }  

值的uri值为以下三类:

A)可以指定为普通的具体值;

B)可以指定为含有某变量的一类值(URI模板与路径变量);

C)可以指定为含正式表达式的一类值(URI模板与正则表达式);


例B)

[java]  查看纯 文本
  1. @RequestMapping (value = “/ owners / {ownerId}” ,method = RequestMethod.GET)  
  2. public  String findOwner(@PathVariable  String ownerId,Model model){  
  3.   所有者所有者= ownerService.findOwner(ownerId);    
  4.   model.addAttribute(“owner” ,owner);    
  5.   返回“displayOwner” ;    
  6. }  

例C)
[java]  查看纯 文本
  1. @RequestMapping “/spring-web/{ symbolicName : [az-]+}-{version:\d\.\d\.\d}.{extension:\.[az]}” )  
  2.   public void  handle(@PathVariable  String version,  @PathVariable  String extension){       
  3.     // ...  
  4.   }  
  5. }  


2消耗,产生示例

cousumes的样例:

[java]  查看纯 文本
  1. @Controller  
  2. @RequestMapping (value =  “/ pets” ,method = RequestMethod.POST,consumption = “application / json” )  
  3. public void  addPet(@RequestBody  Pet pet,Model model){       
  4.     //执行省略  
  5. }  
方法仅处理请求Content-Type为“application / json”类型的请求。


生产的样例:

[java]  查看纯 文本
  1. @Controller  
  2. @RequestMapping (value =  “/ pets / {petId}” ,method = RequestMethod.GET,produce = “application / json” )  
  3. @ResponseBody  
  4. public  Pet getPet(@PathVariable  String petId,Model model){      
  5.     //执行省略  
  6. }  

方法仅处理请求请求中接受头中包含了“application / json”的请求,同时暗示了返回的内容类型为application / json;


3个params,headers示例

params的样例:

[java]  查看纯 文本
  1. @Controller  
  2. @RequestMapping “/ owners / {ownerId}” )  
  3. public class  RelativePathUriTemplateController {   
  4.   
  5.   @RequestMapping (value =  “/ pets / {petId}” ,method = RequestMethod.GET,params = “myParam = myValue” )  
  6.   public void  findPet(@PathVariable  String ownerId,  @PathVariable  String petId,Model model){       
  7.     //执行省略  
  8.   }  
  9. }  

 仅处理请求中包含了名为“myParam”,值为“myValue”的请求;


标题的样例:

[java]  查看纯 文本
  1. @Controller  
  2. @RequestMapping “/ owners / {ownerId}” )  
  3. public class  RelativePathUriTemplateController {   
  4.   
  5. @RequestMapping (value =  “/ pets” ,method = RequestMethod.GET,headers = “Referer = http://www.ifeng.com/” )  
  6.   public void  findPet(@PathVariable  String ownerId,  @PathVariable  String petId,Model model){       
  7.     //执行省略  
  8.   }  
  9. }  

 仅处理请求的标题中包含了指定“参考”请求头和对应值为“ http://www.ifeng.com/”的请求;



上面仅仅介绍了,RequestMapping指定的方法处理哪些请求,下一篇将讲解怎样处理请求提交的数据(数据绑定)和返回的数据。

你可能感兴趣的:(Spring)