@RequestMapping,@RequsetBody等注解說明


@RequestMapping,@RequestBody的注解的使用

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

springMVC的工作流程圖

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

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

springMvc的時序圖如下:

srpingmvc處理一個web請求的時序圖

@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的請求類型。

  • 使用示例
  1. 編寫測試的類

     //控制器
     @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&note=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對象來接受這個參數。

注意兩點:

  1. 就是前端傳遞的對象屬性必須和后端對應。比如 后端定義的user屬性為 int id ,String name ,前端也必須使用相同的類型和字段來定義。
  2. 要使用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

測試結果:

測試成功

參考資料:

  1. 《深入淺出springboot》 楊開振
  2. springboot的官方文檔

在正確的道路上,全力以赴,夢想終究照進現實。來自一個菜鳥程序員的雞湯。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM