目前比較流行前後端分離,後端只需為前端提供 restfull 介面,所有的介面都返回 json 格式的資料,前端接收到 json 資料之後再進行處理。
那麼在 SpringMVC 中如何向前端輸出 json 格式的資料呢?
常見的有 3 種方式,我們來了解下。
1、方式 1:方法上新增@ResponseBody
需求
使用 springmvc 提供一個介面,以 json 格式輸出使用者列表。
3 個步驟
step1:maven 配置引入 jackjson
jackjson 用於將 java 物件轉換為 json 格式的字串,也可以將 json 格式的字串轉換為 java 物件
我們的介面需要將 java 物件轉換為 json 格式的字串輸出到客戶端,所以我們需要用到這個包。
step2:springmvc 配置檔案中添加註解驅動
添加了這段程式碼之後,springmvc 就被賦予了將 java 物件轉換為 json 格式字串輸出到客戶端的能力。
step3:處理器的方法上新增@ResponseBody 註解
如下程式碼,我們希望 list()方法用於向客戶端以 json 格式輸出使用者列表。
此時只需要在這個方法上面新增一個
@ResponseBody
註解,SpringMVC 發現這個方法上有
@ResponseBody
這個註解,並且方法返回值是一個普通的 java 物件的時候,會將方法的返回值使用 jackson 轉換為 json 格式的字串,然後輸出到客戶端。
@Controllerpublic class UserController { /** * 使用者列表(使用者id->使用者資訊) */ Map userDtoMap = new ConcurrentHashMap<>(); { userDtoMap。put(1L, new UserDto(1L, “路人”, 30)); userDtoMap。put(2L, new UserDto(2L, “張三”, 20)); userDtoMap。put(3L, new UserDto(3L, “李四”, 18)); } @GetMapping(“/user/list。do”) @ResponseBody public Collection list() { return this。userDtoMap。values(); }}
驗證效果
谷歌瀏覽器中訪問下這個介面
F12 看一下介面的響應頭,如下,可以看到 response 的
Content-Type
的值為
application/json;chatset=UTF-8
,這個說明響應結果的內容格式是 json 格式。
2、方式 2:Controller 上新增@ResponseBody 註解
當我們 controller 中方法很多的時候,且所有方法都要求返回 json 格式的資料的時候,如果按照方式 1,我們需要在每個方法上都要新增
@ResponseBody
註解,此時有更簡單的方法,將所有方法上的
@ResponseBody
註解都去掉,然後在 Controller 上加上
@ResponseBody
就可以了。
比如下面這段程式碼,我們可以將 2 個方法上面的
@ResponseBody
幹掉,然後在類上新增
@ResponseBody
註解就可以了。
@Controllerpublic class UserController { Map userDtoMap = new ConcurrentHashMap<>(); { userDtoMap。put(1L, new UserDto(1L, “路人”, 30)); userDtoMap。put(2L, new UserDto(2L, “張三”, 20)); userDtoMap。put(3L, new UserDto(3L, “李四”, 18)); } @GetMapping(“/user/list。do”) @ResponseBody public Collection list() { return this。userDtoMap。values(); } @GetMapping(“/user/{id}。do”) @ResponseBody public UserDto user(@PathVariable(“id”) Long id) { return this。userDtoMap。get(id); }}
調整之後如下
@Controller@ResponseBodypublic class UserController { Map userDtoMap = new ConcurrentHashMap<>(); { userDtoMap。put(1L, new UserDto(1L, “路人”, 30)); userDtoMap。put(2L, new UserDto(2L, “張三”, 20)); userDtoMap。put(3L, new UserDto(3L, “李四”, 18)); } @GetMapping(“/user/list。do”) public Collection list() { return this。userDtoMap。values(); } @GetMapping(“/user/{id}。do”) public UserDto user(@PathVariable(“id”) Long id) { return this。userDtoMap。get(id); }}
3、方式 3:Controllers 上使用@RestController
我們回頭再看下上面程式碼,如下圖,UserController 上有 2 個註解
@Controller
和
@ResponseBody
,而 SpringMVC 提供了一個更好的註解
@RestController
,相當於這 2 個註解的合體,所以可以用來替換這 2 個註解。
4、restfull 介面通用返回值
客戶端呼叫伺服器端介面的時候,介面有可能會發生異常,這些異常資訊需要返回給呼叫者,通常我們會為錯誤定義錯誤碼以及提示資訊。
一般我們會定義通用的返回值型別,格式如下:
/** * rest介面通用返回值資料結構 * @param */public class ResultDto
控制器中所有的方法都返回 ResultDto 型別的結果,如下程式碼
@RestControllerpublic class UserController { Map userDtoMap = new ConcurrentHashMap<>(); { userDtoMap。put(1L, new UserDto(1L, “路人”, 30)); userDtoMap。put(2L, new UserDto(2L, “張三”, 20)); userDtoMap。put(3L, new UserDto(3L, “李四”, 18)); } @GetMapping(“/user/list。do”) public ResultDto
5、案例程式碼
git地址:https://gitee。com/javacode2018/springmvc-series
6、總結
掌握@ResponseBody 的用法,用來返回 json 格式的資料,注意需要在 springmvc 配置檔案中添加註解驅動的配置,否則呼叫會報錯
<
mvc:annotation-driven
/>
掌握通用介面返回值的用法
原文連結:https://mp。weixin。qq。com/s/PcNQ7xCmooz_rQflaKpcWg