1.org.springframework.web.bind.annotation包下注解
1.1 @PostMapping、@GetMapping、@RequestMapping、@RestController、@ResponseBody、@RequestParam、@RequestPart、@PutMapping
(1)@RequestMapping
@RequestMapping如果沒有指定請求方式,將接收Get、Post、Head、Options等所有的請求方式.
(2)@GetMapping
@GetMapping是一個組合注解,是@RequestMapping(method = RequestMethod.GET)的縮寫。該注解將HTTP Get 映射到 特定的處理方法上。
get是把參數數據隊列加到提交表單的ACTION屬性所指的URL中,值和表單內各個字段一一對應,在URL中可以看到。
get是從服務器上獲取數據。
若符合下列任一情況,則用GET方法:
* 請求是為了查找資源,HTML表單數據僅用來幫助搜索。
* 請求結果無持續性的副作用。
* 收集的數據及HTML表單內的輸入字段名稱的總長不超過1024個字符。
(3)@PostMapping
@PostMapping是一個組合注解,是@RequestMapping(method = RequestMethod.POST)的縮寫。
get方式的安全性較Post方式要差些,包含機密信息的話,建議用Post數據提交方式;
post是向服務器傳送數據。
若符合下列任一情況,則用POST方法:
* 請求的結果有持續性的副作用,例如,數據庫內添加新的數據行。
* 若使用GET方法,則表單上收集的數據可能讓URL過長。
* 要傳送的數據不是采用7位的ASCII編碼。
(4)@requestBody(后端方法接收請求體)
@requestBody注解常用來處理content-type不是默認的application/x-www-form-urlcoded編碼的內容,比如說:application/json或者是application/xml等。一般情況下來說常用其來處理application/json類型。
@RequestBody主要用來接收前端傳遞給后端的json字符串中的數據的(請求體中的數據的);
后端代碼接收測試截圖:
(5)@RequestParam(后端方法接收請求參數)
注解@RequestParam接收的參數是來自requestHeader中,即請求頭。通常用於GET請求,比如常見的url:http://localhost:8081/spring-boot-study/novel/findByAuthorAndType?author=唐家三少&type=已完結,其在Controller
層的寫法如下圖所示:

@RequestParam有三個配置參數:
required
表示是否必須,默認為true
,必須。defaultValue
可設置請求參數的默認值。value
為接收url的參數名(相當於key值)。
@RequestParam也可用於其它類型的請求,例如:POST、DELETE等請求。
@RequestParam接收參數,要求postman以表單的格式發送數據(即使用form-data)
(6)@RequestPart
@RequestPart
這個注解用在multipart/form-data
表單提交請求的方法上。多用於文件上傳場景。
前台請求:jsonData
為Person
對象的json
字符串uploadFile
為上傳的圖片
(7)@PutMapping
和PostMapping作用等同,都是用來向服務器提交信息。如果是添加信息,傾向於用@PostMapping,如果是更新信息,傾向於用@PutMapping。兩者差別不是很明顯。
(8)@RestController
@RestController = @Controller + @ResponseBody組成,等號右邊兩位同志簡單介紹兩句,就明白我們@RestController的意義了:
- @Controller 將當前修飾的類注入SpringBoot IOC容器,使得從該類所在的項目跑起來的過程中,這個類就被實例化。當然也有語義化的作用,即代表該類是充當Controller的作用
- @ResponseBody 它的作用簡短截說就是指該類中所有的API接口返回的數據,甭管你對應的方法返回Map或是其他Object,它會以Json字符串的形式返回給客戶端,本人嘗試了一下,如果返回的是String類型,則仍然是String。
總之,用@Controller,返回的是頁面;@Controller加上@ResponseBody,返回的是JSON、XML或其他文本。
用@RestController,意味着這個Controller的所有方法上面都加了@ResponseBody,不論你在每個方法前加、或不加@ResponseBody,都一樣。所以這種Controller不會返回頁面。
@Controller @RequestMapping("/test") public class MyController1 { @ResponseBody @GetMapping(path="/get1", produces = "text/plain;charset=utf-8") public String getMethod1(String str) { return str; } @GetMapping(path="/get2", produces = "text/plain;charset=utf-8") public String getMethod2(String str) { return str; } }
訪問 /test/get2,並攜帶參數 str="index" ,返回名為 index 頁面,如index.jsp。
1.2 案例分析
案例一:
package com.ttbank.flep.file.controller; import com.ttbank.flep.file.entity.User; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.*; import java.util.ArrayList; import java.util.List; @Api("用戶信息管理") @RestController @RequestMapping("/user/*") public class UserController { private final static List<User> userList = new ArrayList<>(); { userList.add(new User(1, "Tom", "A fool cat")); userList.add(new User(2, "Jerry", "A clever mouse")); } @ApiOperation("獲取用戶列表") @GetMapping("list") public List userList() { return userList; } @ApiOperation("新增用戶") @PostMapping("add") public boolean add(User user) { return userList.add(user); } @ApiOperation("更新用戶") @ApiImplicitParam(name = "user", value = "單個用戶信息", dataType = "User") @PutMapping("update") public boolean update(User user) { return userList.remove(user) && userList.add(user); } @ApiOperation("批量刪除用戶") @ApiImplicitParam(name = "users", value = "N個用戶信息", dataType = "List<User>") @DeleteMapping("delete") public boolean delete(@RequestBody List<User> users) { return userList.removeAll(users); } }
(1)利用PostMan訪問,進行一個add添加操作,http://127.0.0.1:7003/flep/file/user/add
(2)利用PostMan訪問,進行一個list添加操作,http://127.0.0.1:7003/flep/file/user/list
案例二:
通過@requestBody可以將請求體中的JSON字符串綁定到相應的bean上,當然,也可以將其分別綁定到對應的字符串上。
$.ajax({ url:"/login", type:"POST", data:'{"userName":"admin","pwd","admin123"}', content-type:"application/json charset=utf-8", success:function(data){ alert("request success ! "); } }); @requestMapping("/login") public void login(@requestBody String userName,@requestBody String pwd){ System.out.println(userName+" :"+pwd); }
這種情況是將JSON字符串中的兩個變量的值分別賦予了兩個字符串,但是呢假如我有一個User類,擁有如下字段:
String userName;
String pwd;
那么上述參數可以改為以下形式:@requestBody User user 這種形式會將JSON字符串中的值賦予user中對應的屬性上
需要注意的是,JSON字符串中的key必須對應user中的屬性名,否則是請求不過去的。
參考文獻:https://blog.csdn.net/justry_deng/article/details/80972817(推薦閱讀)
https://cloud.tencent.com/developer/article/1414464
https://blog.csdn.net/qq_47443027/article/details/114696716(推薦閱讀)