@RequestMapping,@RequestBody的注解的使用
當下的主流web開發框架當屬springMVC,究其原因就是SpringMVC可以很容易的將后台的數據轉化為各種類型的數據,,很好的適應了移動互聯網的數據多樣化變化的要求。比如可以很容易的將數據轉化
為我們常使用的json數據集,也可以轉化為Excel,PDF,XML等的數據集。隨着springboot的發展,注解開發因為其開發速度快,編譯期間容易發現錯誤的出處,注解開發已經成為趨勢。這篇博文就基於srpingboot下的
springmvc注解進行梳理,以下的所有代碼測試都是以springboot為基礎構建的。

springMVC的工作流程圖
在了解具體的注解使用之前,了解一下springMVC的工作流程和工作的時序圖是很有必要的。

說明:由於現在大部分項目都是前后端分離,大部分情況下,后端只需要傳遞指定的Json數據集即可,所以這里的springmvc的流程圖中的視圖是基於json視圖的。
springMvc的時序圖如下:

@RequestMapping注解的使用
-
作用: 使用靈活的方法將web的請求路徑映射在一個類上或者一個方法上。一般映射在類上,在方法上主要使用他的變體的四個注解,@GetMapping @PostMapping @PutMapping,@DeleteMapping 以遍更好的區別不同的請求類型。
-
主要屬性:通過源碼了解到的屬性如下:
@Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented @Mapping public @interface RequestMapping { // 配置請求映射名稱 String name() default ""; // 通過路徑映射 @AliasFor("path") String[] value() default {}; // 通過路徑映射回path的配置項 @AliasFor("value") String[] path() default {}; // 限定響應HTTP請求的類型,GET,POST,HEAD,OPPTIONS,PUT,TRACE等 // 默認響應所有的請求 RequestMethod[] method() default {}; // 當存在http參數時,才響應的請求 String[] params() default {}; // 限定請求頭存在對應的參數才響應 String[] headers() default {}; // 限定HTTP的請求體提交類型,如"application/json","text/html" String[] consumes() default {}; // 限定返回的內容類型,僅當HTTP的請求頭中的(Accept)類型中包含指定的該類型才返回 String[] produces() default {}; }
比較常用的屬性還是value和path這兩個屬性,這兩個屬性來配置路徑的,當然也可以使用method屬性來配置HTTP的請求類型。
- 使用示例
-
編寫測試的類
//控制器 @Controller @RequestMapping("/my") public class UserController { /** * 獲取用戶 * @return 以json格式返回數據 */ @RequestMapping("/getuser") @ResponseBody public User getUser(){ User user = new User(); user.setId(1); user.setName("chenw1024"); return user; }}
2.測試
瀏覽器 輸入 http://localhost:8080/my/getuser

可以看到瀏覽器展示出了用戶的信息。這是因為這里還使用了一個注解 @ReponseBody這個注解。主要返回服務端的響應結果。
@ReponseBody注解
-
主要作用: 就是將服務器響應的結果以json數據集的格式返回給客戶端。也就是將方法的返回值綁定到web的響應體中。
上述的例子,將用戶的信息返回給客戶端,現在我們注釋掉這個@ResponseBody會如何呢@RequestMapping("/getuser") // @ResponseBody public User getUser(){ User user = new User(); user.setId(1); user.setName("chenw1024"); return user;}
再次測試可以發現 請求找不到:

看看@ResponseBody這個注解的源碼
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ResponseBody {
}
從源碼可以了解到這個注解並沒有屬性,但是使用它還是很經常的。一般應用在方法上。
@RequestParm注解
-
作用: 確定前后端參數名稱的映射關系,也就是將前端和后端的參數對應起來。
比一個簡單的例子,一個人在家里的小名是狗蛋,在公司里的名字是李四。有一天,李四的朋友去公司找李四,知呼李四的小名狗蛋,而公司並不知道狗蛋是誰,這時剛好和李四是同事的小何,他知道李四就是狗蛋,狗蛋就是李四,就幫忙找到了李四。這里的小何就是@RequestParm。

-
屬性 通過源碼進行說明:
public @interface RequestParam { // 指定映射的名稱 @AliasFor("name") String value() default ""; // 指定參數名稱,一般指定的是前端的參數名稱 @AliasFor("value") String name() default ""; // 是否允許參數為空,默認為true 也就是前端參數個數必須和后端對應, boolean required() default true; // 就是允許參數為空的情況下,提供的一個默認值 String defaultValue() default ValueConstants.DEFAULT_NONE; }
常用的屬性就是 value屬性和required 這來兩個屬性。
-
使用用例
/* * @param id * @param name * @return */ @RequestMapping("/annotation") @ResponseBody public Map<String,Object> getParmm(@RequestParam("user_id") int id, @RequestParam("user_name") String name,@RequestParam(value = "note",required = false)String note){ Map<String,Object> map = new HashMap<>(); map.put("id",id); map.put("name",name); map.put("note",note); return map; }
user_id,user_name ,note 這是前端的參數 通過@RequestParm 就映射到相應的方法上的參數。
-
測試
瀏覽器輸入 http://localhost:8080/my/annotation?user_id=3&user_name=chen¬e=hello
測試結果:

測試成功
有時候,可能我們並不需要傳遞全部的參數,在這里如果我們只傳遞兩個參數,會怎么樣,
瀏覽器輸入: http://localhost:8080/my/annotation?user_id=3&user_name=chen
測試結果:

報400的錯誤,說明是客戶端傳遞的參數個數和服務端參數個數的不相等。解決這個問題,只要將對應屬性required的值設置為false ,這里由於我們不傳遞note的值,所以將@RequestParam(value = "note")String note改為 @RequestParam(value = "note",required = false)String note
再測試一遍:
瀏覽器輸入: 瀏覽器輸入: http://localhost:8080/my/annotation?user_id=3&user_name=chen
測試結果:

測試成功
如果一個實體的字段很多,這樣傳遞參數就很不方便。這時候就要提到另一個注解了,那就是@RequsetBody這個注解。
@RequestBody注解
-
作用:
就是將前端的對象映射成后端的一個對象。比如:前端傳遞一個User對象,使用這個注解,后端的相應的方法就可以使用user對象來接受這個參數。
注意兩點:
- 就是前端傳遞的對象屬性必須和后端對應。比如 后端定義的user屬性為 int id ,String name ,前端也必須使用相同的類型和字段來定義。
- 要使用Json數據集進行傳遞,也就是設置為 contentType: "application/json"
-
使用用例
/** * 使用@RequestBody這個注解接受json的數據集 * 就是請求的Json數據集的屬性必須和實體類的屬性一致,並且類型也要一致 * localhost:8080/my/insert {"id":1,"name":"chen"} 這個是請求體的json * @param user * @return */ @PostMapping("/insert") @ResponseBody public Map<String,Object> insert(@RequestBody User user){ Map<String,Object> map = new HashMap<>(); map.put("user",user); return map; }
使用postman進行測試:
設置json數據:

測試結果

@PathVariable注解
-
作用
通過url來向后端傳遞參數。主要用於rest風格,比如要獲取一個用戶編號為1,姓名為chen的用戶,就可輸入/get/1/chen 來查詢,@PathVariable注解就是將URL中的相應參數映射到方法中的參數中去。
-
使用用例
假設要通過編號和姓名來查詢用戶,就可以使用@PathVariable這個注解。
/** * 通過uRL 傳遞參數 使用注解 @PathVariable * 訪問:localhost:8080/my/get/1/chen * 注意傳入的參數名盡量和方法的參數名一致,也可以在@PathVariable 中指定,不管如 何,必須保證@PathVariable的請求參數和路徑中的相同 * @param id * @param name * @return */ @GetMapping("/get/{id}/{name}") @ResponseBody public User getUser(@PathVariable int id,@PathVariable String name){ Map<String,Object> map = new HashMap<>(); User user = new User(); user.setId(id); user.setName(name); return user; }
測試如下:
瀏覽器輸入: localhost:8080/my/get/1/chen
測試結果:

測試成功
參考資料:
- 《深入淺出springboot》 楊開振
- springboot的官方文檔
在正確的道路上,全力以赴,夢想終究照進現實。來自一個菜鳥程序員的雞湯。
