javascript
SpringMVC 返回json的两种方式
前后臺(tái)數(shù)據(jù)交互使用json是一種很重要的方式.本文主要探討SpringMVC框架使用json傳輸?shù)募夹g(shù).
請(qǐng)注意,本文所提到的項(xiàng)目使用Spring?版本是4.1.7,其他版本在具體使用上可能有不一樣的情況.
一、最常見——使用@RequestBody的注解返回一個(gè)實(shí)體對(duì)象;
使用方式如下:
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/>即包含了默認(rèn)的配置,能夠轉(zhuǎn)化json,其他版本可能需要額外配置.
3:后臺(tái):
@RequestMapping("/entity")public @ResponseBody Entity returnJson(){return new Entity("chentao","A handsome man");}關(guān)鍵就是@ResponseBody注解,否則Spring會(huì)去映射與路徑匹配的jsp文件
4:前臺(tái)
這個(gè)路徑是可以直接調(diào)用的,結(jié)果會(huì)直接輸出到,但是一般來說,會(huì)使用jquery?Ajax來獲取數(shù)據(jù):
<%@ 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>結(jié)果
?
a:不添加@ResponseBody注解的情況,通過鏈接注解訪問:
?
?
| 可以看到Spring?MVC框架這個(gè)時(shí)候去找/json/entity.jsp這個(gè)文件的. |
?
b:添加@ResponseBody注解后:
?
json數(shù)據(jù)能正確返回了.
?
二、更加靈活的方式——將json數(shù)據(jù)放進(jìn)Request中交互。
Spring MVC使用@ResponseBody的方式確實(shí)很簡(jiǎn)單,但是我們有時(shí)也會(huì)遇到這樣的場(chǎng)景 ,就是訪問一個(gè)新頁面時(shí),可能既要找到新的頁面又要拿到新的數(shù)據(jù)去繪制頁面。
這種時(shí)候如果使用@ResponseBody這種方式,那么就需要使用ajax技術(shù),向后臺(tái)請(qǐng)求兩次,一次請(qǐng)求頁面,一次請(qǐng)求數(shù)據(jù)。
如果希望通過一次請(qǐng)求就完成這個(gè)目標(biāo),那么就應(yīng)該返回一個(gè)ModelAndView的對(duì)象,這樣SpringMVC既可以跳轉(zhuǎn)到一個(gè)頁面,也能把數(shù)據(jù)傳輸?shù)絉equest中。
使用方式:
1:相關(guān)jar包:
使用對(duì)象轉(zhuǎn)化為Json的相關(guān)jar包,一般來說使用的時(shí)json-lib,實(shí)際上類似的框架和技術(shù)還有很多,比如上面的jackson就能做,不過筆者習(xí)慣于使用json-lib,使用起來會(huì)更方便和順手一點(diǎn)。
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:后臺(tái):
@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;}關(guān)鍵是JSONObject.fromObject()方法。
4:前臺(tái):
<script>var json = ${entityJson};alert(json); </script>注意這里的El表達(dá)式寫法${entityJson},瀏覽器在進(jìn)行渲染之前,tomcat已經(jīng)將${entityJson}替換為json字符串。這個(gè)時(shí)候json直接就是一個(gè)可以使用的對(duì)象而不再需要進(jìn)行轉(zhuǎn)化
結(jié)果如下;
?
注意,這種方式只有在jsp頁面中才有效果,如果不是jsp頁面,只能乖乖使用第一種方式了。
三、總結(jié)
| ? | @Response注解的方式 | 返回ModelAndView方式 |
| 優(yōu)點(diǎn) | 編寫簡(jiǎn)單;適合當(dāng)前ajax方式; | 更加靈活,頁面和數(shù)據(jù)一同返回。 |
| 缺點(diǎn) | 靈活性不足 | 需要手動(dòng)轉(zhuǎn)化json; 前臺(tái)接受數(shù)據(jù)只能用在jsp頁面里。 |
| 實(shí)現(xiàn)要點(diǎn) | @ResponseBody;jackson-jar包;ajax; | JsonObject.fromObject();El表達(dá)式:${}. |
| ? | ? | ? |
?
四、擴(kuò)展
本文檔使用的是SpringMVC框架,實(shí)際上第一種方式本質(zhì)上是使用Response的writer對(duì)象來傳遞數(shù)據(jù),而第二種方式使用request傳遞數(shù)據(jù)。所以如果使用原生servlet或者其他框架也是能夠?qū)崿F(xiàn)類似的功能的。
?
轉(zhuǎn)載于:https://www.cnblogs.com/ct-csu/p/8157418.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的SpringMVC 返回json的两种方式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Request的getHeader()和
- 下一篇: 拦截器及 Spring MVC 整合