轉載自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; }