Spring中的注解@RequestParam,@GetMapping,@PostMapping,@ResponseBody


轉載自Spring 注解之@RequestParam和@GetMapping@getMapping與@postMapping@ResponseBody詳解

摘要

 @RequestParam用來處理Content-Type 為 application/x-www-form-urlencoded編碼的內容,將請求參數名映射到方法參數名。在Http協議中,如果不指定Content-Type,則默認傳遞的參數就是application/x-www-form-urlencoded類型。

@RequestParam

       @RequestParam可以接受簡單類型的屬性,也可以接受對象類型(如viewUserByBean方法)。創建一個實體類對象作為參數承載體,Spring MVC會根據參數名稱自動將參數綁定到實體類對象的屬性上,viewUserByBean就是這么處理的。

      value:String 類型,請求參數名,如viewUserByEachEle 方法中的userName表示請求參數名,它的值將被綁定到方法參數name。

      required:是否必須,默認值為true,表示請求參數中必須包含對應的參數,否則,將拋出400錯誤碼;異常信息是org.springframework.web.bind.MissingServletRequestParameterException,提示“Required String parameter 'userName' is not present”。

      defaultValue:String 類型,表示如果請求中沒有同名參數時的默認值,默認值可以是SpEL表達式,如“#{systemProperties['java.vm.version']}”。

      其實如果不使用@RequestParam,Spring MVC也會將request的parameter自動綁定到method的parameter中,使用@RequestParam只不過是對parameter進行配置和對URL更精確化的配置。例如,在請求參數名和方法參數名相同時,則可以省略@RequestParam注解。

@RequestMapping

  @RequestMapping用於映射url到控制器類的一個特定處理程序方法。可用於方法或者類上面。也就是可以通過url找到對應的方法。

  @RequestMapping有8個屬性。

value:指定請求的實際地址。

method:指定請求的method類型(GET,POST,PUT,DELETE)等。

consumes:指定處理請求的提交內容類型(Context-Type)。

produces:指定返回的內容類型,還可以設置返回值的字符編碼。

params:指定request中必須包含某些參數值,才讓該方法處理。

headers:指定request中必須包含某些指定的header值,才讓該方法處理請求。

@getMapping@postMapping是組合注解

@getMapping = @requestMapping(method = RequestMethod.GET)。

@postMapping = @requestMapping(method = RequestMethod.POST)。

@ResponseBody

@ResponseBody的作用其實是將java對象轉為json格式的數據。

@responseBody注解的作用是將controller的方法返回的對象通過適當的轉換器轉換為指定的格式之后,寫入到response對象的body區,通常用來返回JSON數據或者是XML數據。
注意:在使用此注解之后不會再走視圖處理器,而是直接將數據寫入到輸入流中,他的效果等同於通過response對象輸出指定格式的數據。

@ResponseBody是作用在方法上的,@ResponseBody 表示該方法的返回結果直接寫入 HTTP response body 中,一般在異步獲取數據時使用【也就是AJAX】。
注意:在使用 @RequestMapping后,返回值通常解析為跳轉路徑,但是加上 @ResponseBody 后返回結果不會被解析為跳轉路徑,而是直接寫入 HTTP response body 中。 比如異步獲取 json 數據,加上 @ResponseBody 后,會直接返回 json 數據。@RequestBody 將 HTTP 請求正文插入方法中,使用適合的 HttpMessageConverter 將請求體寫入某個對象。

后台 Controller類中對應的方法:
@RequestMapping("/login.do")
@ResponseBody
public Object login(String name, String password, HttpSession session) {
    user = userService.checkLogin(name, password);
    session.setAttribute("user", user);
    return new JsonResult(user);
}
 
@RequestBody是作用在形參列表上,用於將前台發送過來固定格式的數據【xml格式 或者 json等】封裝為對應的 JavaBean 對象,
封裝時使用到的一個對象是系統默認配置的 HttpMessageConverter進行解析,然后封裝到形參上。
如上面的登錄后台代碼可以改為:
@RequestMapping("/login.do")
@ResponseBody
public Object login(@RequestBody User loginUuser, HttpSession session) {
    user = userService.checkLogin(loginUser);
    session.setAttribute("user", user);
    return new JsonResult(user);
}

@RequestBody
@RequestBody 注解則是將 HTTP 請求正文插入方法中,使用適合的 HttpMessageConverter 將請求體寫入某個對象。
作用:

  1) 該注解用於讀取Request請求的body部分數據,使用系統默認配置的HttpMessageConverter進行解析,然后把相應的數據綁定
到要返回的對象上; 
  2) 再把HttpMessageConverter返回的對象數據綁定到 controller中方法的參數上。

使用時機:

  A) GET、POST方式提時, 根據request header Content-Type的值來判斷:

  application/x-www-form-urlencoded, 可選(即非必須,因為這種情況的數據@RequestParam, @ModelAttribute也可以處理,當然@RequestBody也能處理); multipart/form-data, 不能處理(即使用@RequestBody不能處理這種格式的數據); 其他格式, 必須(其他格式包括application/json, application/xml等。這些格式的數據,必須使用@RequestBody來處理);

  B) PUT方式提交時, 根據request header Content-Type的值來判斷:

  application/x-www-form-urlencoded, 必須;multipart/form-data, 不能處理;其他格式, 必須;

說明:request的body部分的數據編碼格式由header部分的Content-Type指定;

@RequestMapping(value = "user/login")
@ResponseBody
// 將ajax(datas)發出的請求寫入 User 對象中
public User login(@RequestBody User user) {   
// 這樣就不會再被解析為跳轉路徑,而是直接將user對象寫入 HTTP 響應正文中
    return user;    
}

 


免責聲明!

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



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