springboot一些註解

RestController和Controller的區別

@RestController = @ResponseBody + @Controller

如果只是使用@RestController註解Controller,則Controller中的方法無法返回jsp頁面,或者html,配置的視圖解析器 InternalResourceViewResolver不起作用,返回的內容就是Return 裏的內容。
如果需要返回到指定頁面,則需要用 @Controller配合視圖解析器InternalResourceViewResolver纔行。
如果需要返回JSON,XML或自定義mediaType內容到頁面,則需要在對應的方法上加上@ResponseBody註解。

@RequestMapping @GetMapping @PostMapping

@RequestMapping如果沒有指定請求方式,將接收Get,Post,Head,Options等所有的請求方式
@GetMapping是一個組合註解,同@RequestMapping(method = RequestMethod.GET)
@PostMapping是一個組合註解,同@RequestMapping(method = RequestMethod.POST)

@SpringBootApplication

使用這個註解相當於加上了下面三個註解:
@Configuration 允許將其他@bean註解標識的類加入到spring容器中,相當於spring配置文件中的beans標籤。
 
@EnableAutoConfiguration 啓動自動配置,spring boot會根據我們添加的依賴來啓用一些配置
 
@ComponentScan 會自動掃描當前包和子包下的標有@Component,@Service,@Repository,@Controller的類。相當於以前spring配置文件中的context:component-scan

@RequestMapping @ResponseBody 和 @RequestBody @RequestParam

RequestMapping
@RequestMapping 是一個用來處理請求地址映射的註解,可用於類或方法上。
用於類上,表示類中的所有響應請求的方法都是以該地址作爲父路徑;
用於方法上,表示在類的父路徑下追加方法上註解中的地址將會訪問到該方法,此處需注意@RequestMapping用在類上可以沒用,但是用在方法上必須有。

@Responsebody 註解表示該方法的返回的結果直接寫入 HTTP 響應正文(ResponseBody)中,一般在異步獲取數據時使用,通常是在使用 @RequestMapping 後,
返回值通常解析爲跳轉路徑,加上 @Responsebody 後返回結果不會被解析爲跳轉路徑,而是直接寫入HTTP 響應正文中。 
該註解用於將Controller的方法返回的對象,通過適當的HttpMessageConverter轉換爲指定格式後,寫入到Response對象的body數據區。 
使用時機: 
返回的數據不是html標籤的頁面,而是其他某種格式的數據時(如json、xml等)使用;異步獲取 json 數據,加上 @Responsebody 註解後,就會直接返回 json 數據。
 
@RequestBody
@RequestBody 註解則是將 HTTP 請求正文插入方法中,使用適合的 HttpMessageConverter 將請求體寫入某個對象。
一般用於處理非 Content-Type: application/x-www-form-urlencoded編碼格式的數據,比如:application/json、application/xml等類型的數據。
作用:

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

@RequestParam
@RequestParam接收的參數是來自HTTP請求體或請求url的QueryString中,接受簡單類型的屬性,也可以接受對象類型
@RequestParam用來處理 Content-Type 爲 application/x-www-form-urlencoded 編碼的內容,Content-Type默認爲該屬性。@RequestParam也可用於其它類型的請求,例如:POST、DELETE等請求。

如果Content-Type設置爲“application/x-www-form-urlencoded;charset=UTF-8”無論是POST請求還是GET請求都是可以通過這種方式成功獲取參數,但是如果前端POST請求中的body是Json對象的話,會報上述錯誤。

請求中傳JSON時設置的Content-Type 如果是application/json或者text/json時,JAVA中request.getParameter("")怎麼也接收不到數據。這是因爲,Tomcat的HttpServletRequest類的實現類爲org.apache.catalina.connector.Request(實際上是org.apache.coyote.Request)。

當前端請求的Content-Type是Json時,可以用@RequestBody這個註解來解決。@RequestParam 底層是通過request.getParameter方式獲得參數的,換句話說,@RequestParam 和request.getParameter是同一回事。因爲使用request.getParameter()方式獲取參數,可以處理get 方式中queryString的值,也可以處理post方式中 body data的值。所以,@RequestParam可以處理get 方式中queryString的值,也可以處理post方式中 body data的值。@RequestParam用來處理Content-Type: 爲 application/x-www-form-urlencoded編碼的內容,提交方式GET、POST。

@RequestBody接受的是一個json對象的字符串,而不是Json對象,在請求時往往都是Json對象,用JSON.stringify(data)的方式就能將對象變成json字符串。

總結:

前端請求傳Json對象則後端使用@RequestParam;
前端請求傳Json對象的字符串則後端使用@RequestBody。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章