你未看此花时,则此花与汝心同归于寂, 你来看此花时,此花颜色一时明白起来,便知此花不在你的心外。

上一章简单介绍了SpringMVC的返回值类型(六),如果没有看过,​​请观看上一章​​。

一. JSON

关于JSON,可以看老蝴蝶以前的文章: ​​JSON简介及前端简单解析(一)​​

二. SpringMVC对JSON的处理

SpringMVC 对JSON的处理,主要是通过 @RequestBody 和@ResponseBody 两个注解进行的。

SpringMVC中默认的JSON转换使用的是 jackson, 所用的类是 MappingJackson2HttpMessageConverter . 故需要先下载jackson.jar 包。

有两种形式。 借鉴网上的图片,老蝴蝶重新画了一下。为了加深印象。

SpringMVC的JSON处理及FastJSON的整合使用(七)_json

最常用的是第二种, key/value 的形式。

二.一 下载后导入 jackson有关的jar包。

SpringMVC的JSON处理及FastJSON的整合使用(七)_springMVC处理JSON格式_02

把这几个jackson 的jar包都引入进来,否则会类找不到的错误。

如:

SpringMVC的JSON处理及FastJSON的整合使用(七)_springMVC处理JSON格式_03

SpringMVC的JSON处理及FastJSON的整合使用(七)_springMVC处理JSON格式_04

二.二 springMVC配置文件 springmvc.xml 写原先的映射器和适配器

<!-- 先用以前的复杂形式 -->
<!-- 处理器映射器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>
处理器适配器
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<!--可添加其他的转换器-->
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean>
</list>
</property>
</bean>

二.三 后端处理JSON (原始的方式) ,返回值为 void

@RequestMapping(value="toLogin")
public String toLogin(){
return "user/login";
}
@RequestMapping(value="/voidJson")
public void getJsonUser(@RequestBody User user,HttpServletResponse response){
System.out.println("前台传过来的值是:"+user.toString());
//以void的形式返回
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
ObjectMapper object=new ObjectMapper();
user.setName("我是老蝴蝶"); //改变前台传过来的值
user.setId(1); //添加新的属性值

try {
System.out.println("输出值为:"+object.writeValueAsString(user));

response.getWriter().println(object.writeValueAsString(user));
} catch (JsonGenerationException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (JsonMappingException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}

二.四 前台传入json ,注意路径和返回数据类型

<body>
<h2>两个蝴蝶飞欢迎你</h2>
<span id="name"></span> <br>
<span id="sex"></span> <br>
<span id="description"></span> <br>
<span id="id"></span> <br>

<button onclick="execVoidJSON()">执行voidjson</button>
<script type="text/javascript">
function execVoidJSON(){
//1。 定义对象
var user={"name":"两个蝴蝶飞","sex":24,"description":"一个快乐的程序员"};

//2。 执行ajax程序
$.ajax({
type:"post",
contentType:"application/json;charset=utf-8",
url:"voidJson.action", //注意请求路径
data:JSON.stringify(user),
success:function(data){
//接收过来的是字符串
var jsonData=JSON.parse(data);
$("#name").html(jsonData.name);
$("#sex").html(jsonData.sex);
$("#description").html(jsonData.description);
$("#id").html(jsonData.id);
}
})
}

</script>
</body>

二.五 运行服务器,测试结果

SpringMVC的JSON处理及FastJSON的整合使用(七)_spring_05

点击 按钮, 控制台打印输出

SpringMVC的JSON处理及FastJSON的整合使用(七)_json_06

前台页面展示,

SpringMVC的JSON处理及FastJSON的整合使用(七)_spring_07

响应数据类型

SpringMVC的JSON处理及FastJSON的整合使用(七)_springMVC处理JSON格式_08

还需要将 json字符串转换成json数据,太麻烦。

下面,开始进行相应的优化。

二.六 springmvc.xml 配置文件优化

直接将 二.二 步骤中的内容转换成

<!-- 适配器和映射器简写 -->
<mvc:annotation-driven></mvc:annotation-driven>

即可。 会自动注入 json 转换器。 一般开发中常用这种形式。

二.七 利用@ResponseBody 注解进行将java 对象转换成 json串,返回值为java 对象。

@RequestMapping(value="toLogin")
public String toLogin(){
return "user/login";
}

@RequestMapping(value="/responseJson")
public @ResponseBody User getResponseUser(@RequestBody User user){
System.out.println("前台传过来的值是:"+user.toString());
user.setName("我是老蝴蝶"); //改变前台传过来的值
user.setId(1); //添加新的属性值
return user; //很简单的写法。
}

二.八 前台传入json

<body>
<h2>两个蝴蝶飞欢迎你</h2>
<span id="name"></span> <br>
<span id="sex"></span> <br>
<span id="description"></span> <br>
<span id="id"></span> <br>
<button onclick="execResponseJSON()">执行Responsejson</button>
<script type="text/javascript">
function execResponseJSON(){
//1。 定义对象
var user={"name":"两个蝴蝶飞","sex":24,"description":"一个快乐的程序员"};
//2。 执行ajax程序
$.ajax({
type:"post",
contentType:"application/json;charset=utf-8",
url:"responseJson.action", //注意请求路径
data:JSON.stringify(user),
success:function(data){
//可直接使用data
$("#name").html(data.name);
$("#sex").html(data.sex);
$("#description").html(data.description);
$("#id").html(data.id);
}
})
}

</script>
</body>

二.九 运行服务器,进行查看

SpringMVC的JSON处理及FastJSON的整合使用(七)_spring_09

控制台打印输出:

SpringMVC的JSON处理及FastJSON的整合使用(七)_spring_10

前台数据展示:

SpringMVC的JSON处理及FastJSON的整合使用(七)_json_11

响应数据类型

SpringMVC的JSON处理及FastJSON的整合使用(七)_spring_12

上面就是 请求 json字符串的形式。 当然,响应的时候,也可以响应集合。 这个在下面讲解。

二.十 JSON 的key/value 形式传入。

1 . 在后端的时候,不用@RequestBody 注解了,只需要用@ResponseBody 注解即可。

@RequestMapping(value="toLogin")
public String toLogin(){
return "user/login2";
}
@RequestMapping(value="/keyJson")
public @ResponseBody User getKeyUser(User user){
System.out.println("前台传过来的值是:"+user.toString());
user.setName("我是老蝴蝶Key"); //改变前台传过来的值
user.setId(1); //添加新的属性值
return user;
}

2 .前台页面

<body>
<h2>两个蝴蝶飞欢迎你</h2>
<span id="name"></span> <br>
<span id="sex"></span> <br>
<span id="description"></span> <br>
<span id="id"></span> <br>
<button onclick="execKeyValueJSON()">执行keyValueJson</button>
<script type="text/javascript">
function execKeyValueJSON(){
//注意,这个时候传入的是字符串。
var user="name='两个蝴蝶飞KeyValue'&sex=24&description='一个快乐的程序员keyValue'";
//2。 执行ajax程序
$.ajax({
type:"post",
url:"keyJson.action", //注意请求路径
data:user,
success:function(data){
$("#name").html(data.name);
$("#sex").html(data.sex);
$("#description").html(data.description);
$("#id").html(data.id);
}
})
}
</script>
</body>

3 . 运行服务器,进行测试。

SpringMVC的JSON处理及FastJSON的整合使用(七)_spring_13

控制台打印输出

SpringMVC的JSON处理及FastJSON的整合使用(七)_spring_14

前端数据展示

SpringMVC的JSON处理及FastJSON的整合使用(七)_springMVC处理JSON格式_15


响应数据类型返回

SpringMVC的JSON处理及FastJSON的整合使用(七)_json_16

二.十一 返回集合类型 如List

采用 key/value 的形式进行讲解。

1 . 后端数据 返回

@RequestMapping(value="toLogin")
public String toLogin(){
return "user/login2";
}


@RequestMapping(value="/listJson")
public @ResponseBody List<User> getUserList(User user){
List<User> userList=new ArrayList<User>();
User user0=new User();
user0.setName("两个蝴蝶飞");
user0.setDescription("一个快乐的程序员");
userList.add(user0);

User user1=new User();
user1.setName("精灵妹");
user1.setDescription("一个快乐的精灵");
userList.add(user1);

User user2=new User();
user2.setName("老蝴蝶");
user2.setDescription("一个快乐的老蝴蝶");
userList.add(user2);

User user3=new User();
user3.setName("精小妹");
user3.setDescription("一个快乐的精小妹");
userList.add(user3);

return userList;

}

2 . 前端页面展示

<body>
<h2>两个蝴蝶飞欢迎你</h2>
<div id="listJson">

</div>
<button onclick="execListJSON()">执行listJson</button>
<script type="text/javascript">
function execListJSON(){
//1。定义对象
var user="name='两个蝴蝶飞KeyValue'&sex=24&description='一个快乐的程序员keyValue'";
//2。 执行ajax程序
$.ajax({
type:"post",
url:"listJson.action", //注意请求路径
data:user,
success:function(data){
var str="<table><tr><th>姓名</th><th>描述</th></tr>";
$.each(data,function(idx,item){
str+="<tr>";
str+="<td>"+item.name+"</td>";
str+="<td>"+item.description+"</td>";
str+="</tr>";
})
str+="</table>";
$("#listJson").append(str);
}
})
}
</script>
</body>

3 . 运行服务器

SpringMVC的JSON处理及FastJSON的整合使用(七)_json_17

前端数据展示为:

SpringMVC的JSON处理及FastJSON的整合使用(七)_spring_18


响应数据类型

SpringMVC的JSON处理及FastJSON的整合使用(七)_spring_19

响应数据:

SpringMVC的JSON处理及FastJSON的整合使用(七)_springMVC处理JSON格式_20

三. SpringMVC与fastjson 进行整合

三.一 添加fastjson 的jar包。

注意,在添加fastjson jar包之前,一定要去除掉以前的jackson 的jar包,不然还是会默认加载的。这一点是非常重要的。

SpringMVC的JSON处理及FastJSON的整合使用(七)_spring_21

三.二 修改json 方式为fastjson

<!-- 设置fastjson的配置方案 -->
<mvc:annotation-driven>
<!-- 设置不使用默认的消息转换器 -->
<mvc:message-converters register-defaults="false">
<!-- 配置Spring的转换器 -->
<bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
<bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter"/>
<bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
<bean class="org.springframework.http.converter.BufferedImageHttpMessageConverter"/>
<!-- 配置fastjson中实现HttpMessageConverter接口的转换器 -->
<bean id="fastJsonHttpMessageConverter"
class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<!-- 加入支持的媒体类型:返回contentType -->
<property name="supportedMediaTypes">
<list>
<!-- 这里顺序不能反,一定先写text/html,不然ie下会出现下载提示 -->
<value>text/html;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
<!-- 可添加其他的属性来扩展功能,如日期 -->
<property name="features">
<list>
<!-- 默认的意思就是不配置这个属性,配置了就不是默认了 -->
<!-- 是否输出值为null的字段 ,默认是false-->
<value>WriteMapNullValue</value>

<value>WriteNullNumberAsZero</value>
<value>WriteNullListAsEmpty</value>
<value>WriteNullStringAsEmpty</value>
<value>WriteNullBooleanAsFalse</value>
<value>WriteDateUseDateFormat</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>

三.三 后端处理

@RequestMapping(value="/listJson",produces={"application/json"})
public @ResponseBody List<User> getUserList(User user){
List<User> userList=new ArrayList<User>();
User user0=new User();
user0.setName("两个蝴蝶飞");
user0.setDescription("一个快乐的程序员");
userList.add(user0);

User user1=new User();
user1.setName("精灵妹");
user1.setDescription("一个快乐的精灵");
userList.add(user1);

User user2=new User();
user2.setName("老蝴蝶");
user2.setDescription("一个快乐的老蝴蝶");
userList.add(user2);

User user3=new User();
user3.setName("精小妹");
user3.setDescription("一个快乐的精小妹");
userList.add(user3);

return userList;

}

注意,此时一定不要忘记用 produces 的属性,否则会按照 springmvc.xml 中的supportedMediaTypes 第一个属性值即text/html 进行解析。

三.四 前端页面显示

与 二.十一 的前端显示是一样的,回过来的数据就是 json对象了。

三.五 重启服务器,进行验证。

SpringMVC的JSON处理及FastJSON的整合使用(七)_json_22

在这里插入图片描述

当然,也可以返回单个bean 对象值。 也需要写 produces 的属性值。

@RequestMapping(value="/responseJson",produces={"application/json"})
public @ResponseBody User getResponseUser(@RequestBody User user){
System.out.println("前台传过来的值是:"+user.toString());
user.setName("我是老蝴蝶"); //改变前台传过来的值
user.setId(1); //添加新的属性值
return user;
}

前端的话,与 二.八 章节的前端的值一致。 这里不再重复写。

谢谢!!!