@Controller、@RestController、@RequestMapping、@ResponseBody、@RequestBody、@RequestParam用法詳解


簡要概述

首先,@Controller、@RestController注解都是用來標注控制器類,處理由DispatcherServlet 分發的請求。

只不過@RestControllerSpring4之后加入的注解。

然后使用@RequestMapping 、@RequestParam、@ResponseBody、@RequestBody 等一些注解用以定義URL 請求和Controller 方法之間的映射,這樣的Controller 就能被外界訪問到。此外Controller 不會直接依賴於HttpServletRequest 和HttpServletResponse 等HttpServlet 對象,它們可以通過Controller 的方法參數靈活的獲取到。

下面再來介紹一下這些注解的使用關系和場景

  • @Controller:它把用戶請求的數據經過業務處理層處理之后封裝成一個Model ,然后再把該Model返回給對應的View進行展示,即該注解返回的是一個頁面。
  • @RestControlle:返回的是json數據。

  用過thymeleaf 或freemarker的朋友可能會遇到一個訴求,我一個Controller類中既想有方法去返回html頁面,又想有其它的方法去返回json數據能不能做到呢?

當然是可以的!!!

@Controller+@ResponseBody

即假如你標注的@Controller的控制類,有某個方法想返回json數據了,就直接給該方法加上@ResponseBody注解。

下面來介紹一下@RequestMapping,這個也是最常見的注解之一,接口控制類中應該已經見怪不怪了,

該注解用於映射請求,也就是通過它來指定控制器可以處理哪些URL請求, 可以在方法和類的聲明中使用。

@RequestMapping 中的 value 和 path 屬性(這兩個屬性作用相同,可以互換)

@RequestMapping 中的 method 主要用來定義接收瀏覽器發來的何種請求。在Spring中,使用枚舉類

下面再重點介紹一下@RequestBody@RequestParam的區別

1、首先兩者的應用場景不一樣,使用@RequestParam:主要處理contentType為application/x-www-form-urlencoded的數據,

 

這種格式的特點就是,name/value 成為一組,每組之間用 & 聯接,而 name與value 則是使用 = 連接。如: wwwh.baidu.com/q?key=fdsa&lang=zh 這是get , 而 post 請求則是使用請求體,參數不在 url 中,在請求體中的參數表現形式也是: key=fdsa&lang=zh的形式。
 
這種方式的好處就是瀏覽器都支持,在請求發送過程中會對數據進行序列化處理,以鍵值對形式。
 
但是application/x-www-form-urlencoded 是沒有辦法將復雜的 JSON 組織成鍵值對形式,你可以發送請求,但是服務端收到數據為空, 因為 ajax不知道怎樣處理這個數據。
 

使用@ResponseBody:主要處理contentType不為application/x-www-form-urlencoded的數據,比如application/json

 

所以我們一般調用ajax請求用@ResponseBody一定要注意在ajax中要指明contentType:"application/json;charset=UTF-8" data:JSON.stringify(json數組);

(這里簡單科普一下,原生的表單提交或ajax提交的請求如果不指定contentType屬性(表單中為enctype)則都是默認為application/x-www-form-urlencoded)

 

看到這里那么有的小伙伴要就要問了,公司產品里很多頁面是調用ajax請求,接口用的是@RequestBody注解接收參數,也沒看到指定contentType為application/json;charset=UTF-8呀,如下圖所示

而且貌似參數都不是json格式的字符串而是一個JSON對象,這是因為 。。。

這個是工具類調用的ajax,也就是說這個ajax是被公司封裝過的,里面的內容如下

 

現在是不是一切都說得通了!!!

 有些小伙伴一直搞不明白JSON對象和json字符串的區別,這里也簡單科普一下

JSON的全稱是JavaScript Object Notation,即JSON是JavaScript原生格式,即一個JavaScript對象

JSON中的五種寫法:  ------    這里就不一一介紹了,有興趣的可以自己去百度。

而json字符串顧名思義,即JSON轉字符串,一般使用JSON.stringify()

 再繼續補充點干貨!!!

使用@RequestParam:要指明前端傳過來的參數名並與其對應

同一個方法中可以使用多個@RequestParam注解,比如form表單,往往不會提交指定某個字符串作為參數,而是提交整個表單,就可以用下面這種方式去接收表單的參數

那么@RequestBody注解可以使用多次嗎

答案是  不可以!!!

但是它可以定義一個對象去接收所有的參數,比如 

那么該實體變量匹配到的所有參數就都可以被接收了,如果匹配不到怎么辦,沒關系,如果是繼承了框架BaseEntity的實體,那么該實體則繼承了Map的特性

即使匹配不到也可以存到其的Map父類的 key-value中。

 

請使用手機"掃一掃"x


免責聲明!

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



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