(六) - json處理
springMVC預設的 Json 解決方案是 Jackson, 所以只需要匯入 Jackson 的 jar, 即可使用.
匯入Jackson的依賴:
<!--Jackson--> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.8</version> </dependency> </dependencies>
jackson 可以通過以下三個註解來實現對 json 資料的處理:
- @ResponseBody
- @RestController
- @RequestBody
一. @ResponseBody
這個註解的意思是: 把這個handler的返回值轉成json返回給客戶端, 所以此handler不會跳轉到相關JSP頁面, 如果返回的是字串, 則不會轉成Json, 直接返回
handler 程式碼:
@Controller @RequestMapping("/jackson")public class TestJackson { @RequestMapping("/test1") //這個註解的意思是: 把這個handler的返回值轉成json返回給客戶端, 所以此handler不會跳轉到相關JSP頁面, 如果返回的是字串, 則不會轉成Json, 直接返回 @ResponseBody public JacksonData test1(){ System.out.println("test1"); JacksonData jacksonData = new JacksonData("name", "張三");return jacksonData; } }
JacksonData.java 程式碼:
public class JacksonData { private String jacksonName; private String jacksonValue; @Override public String toString() { return "JacksonData{" + "jacksonName='" + jacksonName + '\'' + ", jacksonValue='" + jacksonValue + '\'' + '}'; } public JacksonData(String jacksonName, String jacksonValue) { this.jacksonName = jacksonName; this.jacksonValue = jacksonValue; } public String getJacksonName() { return jacksonName; } public String getJacksonValue() { return jacksonValue; } public void setJacksonName(String jacksonName) { this.jacksonName = jacksonName; } public void setJacksonValue(String jacksonValue) { this.jacksonValue = jacksonValue; } }
訪問及返回:
在@ResponseBody註解下, 若return字串, 則直接將此字串返回給客戶端:
*注意: 此時由於未呼叫springMVC操作轉json, 直接返回中文會有亂碼問題, 需要我們設定編碼格式, 設定方式為在@RequestMapping註解的引數中指定value = "/test2", produces = "text/html;charset=utf-8"
@Controller @RequestMapping("/jackson") public class TestJackson { @RequestMapping(value = "/test2", produces = "text/html;charset=utf-8") @ResponseBody public String test2() { System.out.println("test2"); //在@ResponseBody註解下, 若return字串, 則直接將此字串返回給客戶端 return "伺服器資料"; } }
訪問及返回:
二.@RestController
當我們在一個Controller中的所有handler前都要加@ResponseBody註解時, 我們可以在這個Controller前面加上@RestController註解, 這樣, 其下的所有@ResponseBody註解都不需要加了, 同時,@RestController是一個複合註解, 其中集成了@Controller, 所以@Controller註解也可以省略, 如下示例:
@RequestMapping("/jackson") @RestController public class TestJackson { @RequestMapping("/test1") public JacksonData test1(){ System.out.println("test1"); JacksonData jacksonData = new JacksonData("name", "張三"); return jacksonData; } @RequestMapping(value = "/test2", produces = "text/html;charset=utf-8") public String test2() { System.out.println("test2"); return "伺服器資料"; } }
訪問及返回:
三.@RequestBody
@RequestBody 註解可以用來接收請求的 json 資料. 用法如下:
@RequestMapping("/jackson") @RestController public class TestJackson { @RequestMapping(value = "/test3", method = {RequestMethod.POST}) @ResponseBody //@RequestBody註解會讓springMVC接收前端傳過來的json資料並轉成JacksonData物件賦值給jacksonData public String test3(@RequestBody JacksonData jacksonData){ System.out.println(jacksonData); return "hello"; } }
@RequestBody 只能接收post的資料, 建立testJackson.jsp:
<html> <head> <title>Title</title> <script src="js/jquery-2.1.1.js"></script> </head> <body> <input id="i1" type="button" value="ajax" onclick="send_json1();">
<script> function send_json1() { var data = {jacksonName: "Ryan", jacksonValue: "good"}; var dataJson = JSON.stringify(data); $.ajax({ // url: "localhost:8080/jackson/test3", url: "${pageContext.request.contextPath}/jackson/test3", type: "post", data: dataJson, dataType:"json", contentType: "application/json", success: function (res) { alert(res); } }) } </script> </body> </html>
先直接訪問testJackson.jsp, 再通過這個頁面以 Ajax 將資料以post的方式提交到 servlet, 正常情況下伺服器將列印提交的資料.
但是按這樣的寫法, 我們可以發現, 在訪問到 testJackson.jsp, 呼叫Ajax之後, 服務端報錯 500:
如果是使用谷歌瀏覽器, 還會自動跳轉到 Sources 頁面並表示 jQuery 的xhr.send( options.hasContent && options.data || null ); 這行程式碼有問題, 我不是很懂谷歌報這個錯是什麼意思...