前后臺數據交互使用json是一種很重要的方式.本文主要探討SpringMVC框架使用json傳輸的技術.
請注意,本文所提到的項目使用Spring?版本是4.1.7,其他版本在具體使用上可能有不一樣的情況.
一、最常見——使用@RequestBody的注解返回一個實體對象;
使用方式如下:
1:引入jar包:
jackson-core、jackson-databind、jackson-annotion;
Spring4以上的版本這么配置,需要jackson的版本在2以上.
maven依賴
<properties>
<jackson.version>2.7.3</jackson.version>
</properties>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>${jackson.version}</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>${jackson.version}</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>${jackson.version}</version></dependency>
2:Spring配置:
<mvc:annotation-driven/>
Spring4以上版本使用?<mvc:annotation-driven/>即包含了默認的配置,能夠轉化json,其他版本可能需要額外配置.
3:后臺:
@RequestMapping("/entity")public @ResponseBody Entity returnJson(){return new Entity("chentao","A handsome man");}
關鍵就是@ResponseBody注解,否則Spring會去映射與路徑匹配的jsp文件
4:前臺
這個路徑是可以直接調用的,結果會直接輸出到,但是一般來說,會使用jquery?Ajax來獲取數據:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><title>Welcome Page</title><!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations --><scriptsrc="https://code.jquery.com/jquery-3.2.1.min.js"integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4="crossorigin="anonymous"></script> </head> <body><h2>Hello World!</h2> <div id="div1"> </div> </body> <script>$.get("/json/entity",function (data) {$("#div1").html(data);}) </script> </html>
結果
?
a:不添加@ResponseBody注解的情況,通過鏈接注解訪問:
?
?
可以看到Spring?MVC框架這個時候去找/json/entity.jsp這個文件的. |
?
b:添加@ResponseBody注解后:
?
json數據能正確返回了.
?
二、更加靈活的方式——將json數據放進Request中交互。
Spring MVC使用@ResponseBody的方式確實很簡單,但是我們有時也會遇到這樣的場景 ,就是訪問一個新頁面時,可能既要找到新的頁面又要拿到新的數據去繪制頁面。
這種時候如果使用@ResponseBody這種方式,那么就需要使用ajax技術,向后臺請求兩次,一次請求頁面,一次請求數據。
如果希望通過一次請求就完成這個目標,那么就應該返回一個ModelAndView的對象,這樣SpringMVC既可以跳轉到一個頁面,也能把數據傳輸到Request中。
使用方式:
1:相關jar包:
使用對象轉化為Json的相關jar包,一般來說使用的時json-lib,實際上類似的框架和技術還有很多,比如上面的jackson就能做,不過筆者習慣于使用json-lib,使用起來會更方便和順手一點。
maven:? ?
<!-- https://mvnrepository.com/artifact/net.sf.json-lib/json-lib --><dependency><groupId>net.sf.json-lib</groupId><artifactId>json-lib</artifactId><version>2.4</version></dependency>
2:Spring 配置:無
3:后臺:
@RequestMapping("/page")public ModelAndView returnView(){ModelAndView mv = new ModelAndView();mv.setViewName("showJson");Entity entity = new Entity("chentao","a handsome man");JSONObject entityJson = JSONObject.fromObject(entity);mv.addObject("entityJson",entityJson);return mv;}
關鍵是JSONObject.fromObject()方法。
4:前臺:
<script>var json = ${entityJson};alert(json); </script>
注意這里的El表達式寫法${entityJson},瀏覽器在進行渲染之前,tomcat已經將${entityJson}替換為json字符串。這個時候json直接就是一個可以使用的對象而不再需要進行轉化
結果如下;
?
注意,這種方式只有在jsp頁面中才有效果,如果不是jsp頁面,只能乖乖使用第一種方式了。
三、總結
? | @Response注解的方式 | 返回ModelAndView方式 |
優點 | 編寫簡單;適合當前ajax方式; | 更加靈活,頁面和數據一同返回。 |
缺點 | 靈活性不足 | 需要手動轉化json; 前臺接受數據只能用在jsp頁面里。 |
實現要點 | @ResponseBody;jackson-jar包;ajax; | JsonObject.fromObject();El表達式:${}. |
? | ? | ? |
?
四、擴展
本文檔使用的是SpringMVC框架,實際上第一種方式本質上是使用Response的writer對象來傳遞數據,而第二種方式使用request傳遞數據。所以如果使用原生servlet或者其他框架也是能夠實現類似的功能的。
?