簡要概述
首先,@Controller、@RestController注解都是用來標注控制器類,處理由DispatcherServlet 分發的請求。
只不過@RestController是Spring4之后加入的注解。
然后使用@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的數據,
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
