前后台数据交互使用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 -->
<script
src="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或者其他框架也是能够实现类似的功能的。

SpringMVC 返回json的两种方式的更多相关文章

  1. web Api 返回json 的两种方式

    web api写api接口时默认返回的是把你的对象序列化后以XML形式返回,那么怎样才能让其返回为json呢,下面就介绍两种方法: 方法一:(改配置法) 找到Global.asax文件,在Applic ...

  2. SpringMvc 返回json的三种方式

    参考:https://blog.csdn.net/fupengyao/article/details/62220886

  3. SpringMVC实现文件下载的两种方式及多文件下载

    1.传统方法 @RequestMapping("/download") public String download( String fileName ,String filePa ...

  4. c#操作json的两种方式

    总结一下C#操作json的两种方式,都是将对象和json格式相转. 1.JavaScriptSerializer,继承自System.Web.Script.Serialization private ...

  5. MVC web api 返回JSON的几种方式,Newtonsoft.Json序列化日期时间去T的几种方式。

    原文链接:https://www.muhanxue.com/essays/2015/01/8623699.html MVC web api 返回JSON的几种方式 1.在WebApiConfig的Re ...

  6. springMVC返回数据的四种方式

    转自:https://blog.csdn.net/itcats_cn/article/details/82119673 springMVC返回数据的四种方式:第一种,通过request.setAttr ...

  7. springmvc配置AOP的两种方式

    spingmvc配置AOP有两种方式,一种是利用注解的方式配置,另一种是XML配置实现. 应用注解的方式配置: 先在maven中引入AOP用到的依赖 <dependency> <gr ...

  8. 获取Executor提交的并发执行的任务返回结果的两种方式/ExecutorCompletionService使用

    当我们通过Executor提交一组并发执行的任务,并且希望在每一个任务完成后能立即得到结果,有两种方式可以采取: 方式一: 通过一个list来保存一组future,然后在循环中轮训这组future,直 ...

  9. Java中将xml文件转化为json的两种方式

    原文地址https://blog.csdn.net/a532672728/article/details/76312475 最近有个需求,要将xml转json之后存储在redis中,找来找去发现整体来 ...

随机推荐

  1. Python3 下实现 Tencent AI 调用

    1.背景 a.鹅厂近期发布了自己的AI api,包括身份证ocr.名片ocr.文本分析等一堆API,因为前期项目用到图形OCR,遂实现试用了一下,发现准确率还不错,放出来给大家共享一下. b.基于py ...

  2. JAVA提高十八:Vector&Stack深入分析

    前面我们已经接触过几种数据结构了,有数组.链表.Hash表.红黑树(二叉查询树),今天再来看另外一种数据结构:栈. 什么是栈呢,我们先看一个例子:栈就相当于一个很窄的木桶,我们往木桶里放东西,往外拿东 ...

  3. [LeetCode] 74 Search a 2D Matrix(二分查找)

    二分查找 1.二分查找的时间复杂度分析: 二分查找每次排除掉一半不合适的值,所以对于n个元素的情况来说: 一次二分剩下:n/2 两次:n/4 m次:n/(2^m) 最坏情况是排除到最后一个值之后得到结 ...

  4. 求知的木头 Cannot load browser "PhantomJS": it is not registered! Perhaps you are missing some plugin? 测试安装遇到的BUG

    原文链接 求知的木头   Cannot load browser "PhantomJS": it is not registered! Perhaps you are missin ...

  5. 【MySQL疑难杂症】如何将树形结构存储在数据库中(方案一、Adjacency List)

    今天来看看一个比较头疼的问题,如何在数据库中存储树形结构呢? 像mysql这样的关系型数据库,比较适合存储一些类似表格的扁平化数据,但是遇到像树形结构这样有深度的人,就很难驾驭了. 举个栗子:现在有一 ...

  6. H5页面项目的思路整理

    这是H5项目完成后的一些整理,有些理解不能非常准确,希望大家能帮忙指出. 移动端的适配 一些名词解释 visual viewport 可视视图 layout viewport 布局视图 vm 可视视图 ...

  7. python学习之路day1

    学习总结: 变量,字符的由来,python2和python3的区别,控制语句:if,for,while,break,continue用法 学习示例: if用法1:判断年龄 # -*- coding: ...

  8. NodeJS爬虫入门

    1. 写在前面 往常都是利用 Python/.NET 语言实现爬虫,然现在作为一名前端开发人员,自然需要熟练 NodeJS.下面利用 NodeJS 语言实现一个糗事百科的爬虫.另外,本文使用的部分代码 ...

  9. 深度解剖sesssion运行原理

    已经大半年没有更新博客了,一方面有比博客更重要的事情要做,另外一方面也没有时间来整理知识,所以希望在接下来的日子里面能够多多的写博客来与大家交流 什么是session session的官方定义是:Se ...

  10. Springboot 使用 JSR 303 对 Controller 控制层校验及 Service 服务层 AOP 校验,使用消息资源文件对消息国际化

    导包和配置 导入 JSR 303 的包.hibernate valid 的包 <dependency> <groupId>org.hibernate.validator< ...