http://www.cnblogs.com/wuyifu/archive/2013/05/11/3073047.html


在Action中以Struts2的方式输出JSON数据

本着“不重复发明轮子”的原则,我们将转换JSON数据的工作交给Struts2来做,那么相对于在Action中以传统方式输出JSON不同的是,Action是需要将注意力放在业务处理上,而无需关心处理结果是如何被转换成JSON被返回客户端的——这些 工作通过简单的配置,Struts2会帮我们做的更好。

01publicString testByAction() {
02// dataMap中的数据将会被Struts2转换成JSON字符串,所以这里要先清空其中的数据
03dataMap.clear();
04User user = newUser();
05user.setId("123");
06user.setName("JSONActionStruts2");
07user.setPassword("123");
08user.setSay("Hello world !");
09dataMap.put("user", user);
10// 放入一个是否操作成功的标识
11dataMap.put("success", true);
12// 返回结果
13returnSUCCESS;
14}

struts.xml中action的配置:

1<packagename="json"extends="json-default"namespace="/test">
2<actionname="testByAction"
3class="cn.ysh.studio.struts2.json.demo.action.UserAction"method="testByAction">
4<resulttype="json">
5<!-- 这里指定将被Struts2序列化的属性,该属性在action中必须有对应的getter方法 -->
6<paramname="root">dataMap</param>
7</result>
8</action>
9</package>


凡是使用Struts2序列化对象到JSON的action,所在的package必须继承自json-default,注意,这里唯一的result,没有指定name属性。


结果如下图所示:


struts2+json(3)_struts2+json(3)



上面很详细的说明了在WEB应用中如何返回JSON数据到客户端,讲了那么多种方式,涉及的技术核心无非只有两点:


1、将对象转换成符合JSON语法格式的字符串;
2、将符合JSON语法格式的字符串返回客户端;


第二点是整个实现过程的本质,但却不难做到;第一点其实也不难,他甚至有两种做法,一是通过字符串拼接方式,而是通过JSONObject以对象方式转换。看下面的一个例子:


06
publicclassJSONTest {
07
08
/**
09
* 将普通的pojo转换成JSON字符串
10
* @return
11
*/
12
publicJSONObject bean2json() {
13
User user = newUser();
14
user.setId("JSONTest");
15
user.setName("JSONTest");
16
user.setPassword("JSON");
17
user.setSay("Hello,i am JSONTest.java");
18
JSONObject jsonObject = newJSONObject();
19
jsonObject.accumulate("user", user);
20
System.out.println("User转换后的字符串:"+jsonObject.toString());
21
returnjsonObject;
22
}
23
24
/**
25
* 从JSONObject对象中反向解析出User对象
26
* @param jsonObject
27
*/
28
publicvoidjson2bean(JSONObject jsonObject) {
29
User user=(User)JSONObject.toBean((JSONObject)jsonObject.get("user"),User.class);
30
System.out.println("转换得到的User对象的Name为:"+user.getName());
31
}
32
33
publicstaticvoidmain(String[] s) {
34
JSONTest tester=newJSONTest();
35
tester.json2bean(tester.bean2json());
36
}
37
}



JSON格式的字符串返回到客户端后,客户端会将其解析并封装成真正的JSON对象,以供JS调用。



总结上述,其实只要明白了服务器返回JSON数据到客户端的原理,做起来就游刃有余了,他甚至有非常多的可选方案,但既然是基于 Struts2的实现,那么肯定还是要用Struts2的方式来做啦,因为这样确实可以省很多事。另外,在文章的最后,说明一下返回JSON数据时在 result中配置的参数的含义及其常见常见配置吧:

01
<resulttype="json">
02
<!-- 这里指定将被Struts2序列化的属性,该属性在action中必须有对应的getter方法 -->
03
<!-- 默认将会序列所有有返回值的getter方法的值,而无论该方法是否有对应属性 -->
04
<paramname="root">dataMap</param>
05
<!-- 指定是否序列化空的属性 -->
06
<paramname="excludeNullProperties">true</param>
07
<!-- 这里指定将序列化dataMap中的那些属性 -->
08
<paramname="includeProperties">
09
userList.*
10
</param>
11
<!-- 这里指定将要从dataMap中排除那些属性,这些排除的属性将不被序列化,一半不与上边的参数配置同时出现 -->
12
<paramname="excludeProperties">
13
SUCCESS
14
</param>
15
</result>



值得一提的是通过Struts2来返回JSON数据,在IE中会提示下载,这个不用关心,换个浏览器就能正常展示JSON数据,而在JS调用中,更是毫无影响。