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

下面是整个Action的完整代码:
017
018
publicclassUserAction extendsActionSupport {
023
privatestaticfinallongserialVersionUID = 1L;
025
//将会被Struts2序列化为JSON字符串的对象
026
privateMap<String, Object> dataMap;

031
publicUserAction() {
032
//初始化Map对象
033
dataMap = newHashMap<String, Object>();
034
}
035
036
/**
037
* 测试通过action以视图方式返回JSON数据
038
* @return
039
*/
040
publicString testByJSP() {
041
User user = newUser();
042
user.setId("123");
043
user.setName("JSONActionJSP");
044
user.setPassword("123");
045
user.setSay("Hello world !");
046
JSONObject jsonObject=newJSONObject();
047
jsonObject.accumulate("user", user);
048
jsonObject.accumulate("success", true);
049
//这里在request对象中放了一个data,所以struts的result配置中不能有type="redirect"
050
ServletActionContext.getRequest().setAttribute("data", jsonObject.toString());
051
returnSUCCESS;
052
};
053
054
/**
055
* 测试通过action以Struts2默认方式返回JSON数据
056
* @return
057
*/
058
publicString testByAction() {
059
// dataMap中的数据将会被Struts2转换成JSON字符串,所以这里要先清空其中的数据
060
dataMap.clear();
061
User user = newUser();
062
user.setId("123");
063
user.setName("JSONActionStruts2");
064
user.setPassword("123");
065
user.setSay("Hello world !");
066
dataMap.put("user", user);
067
// 放入一个是否操作成功的标识
068
dataMap.put("success", true);
069
// 返回结果
070
returnSUCCESS;
071
}
072
073
/**
074
* 通过action是以传统方式返回JSON数据
075
* @throws IOException
076
*/
077
publicvoiddoAction() throwsIOException{
078
HttpServletResponse response=ServletActionContext.getResponse();
079
//以下代码从JSON.java中拷过来的
080
response.setContentType("text/html");
081
PrintWriter out;
082
out = response.getWriter();
083
//将要被返回到客户端的对象
084
User user=newUser();
085
user.setId("123");
086
user.setName("JSONActionGeneral");
087
user.setPassword("JSON");
088
user.setSay("Hello , i am a action to print a json!");
089
JSONObject json=newJSONObject();
090
json.accumulate("success", true);
091
json.accumulate("user", user);
092
out.println(json.toString());
093
//      因为JSON数据在传递过程中是以普通字符串形式传递的,所以我们也可以手动拼接符合JSON语法规范的字符串输出到客户端
094
//      以下这两句的作用与38-46行代码的作用是一样的,将向客户端返回一个User对象,和一个success字段
095
//      String jsonString="{\"user\":{\"id\":\"123\",\"name\":\"JSONActionGeneral\",\"say\":\"Hello , i am a action to print a json!\",\"password\":\"JSON\"},\"success\":true}";
096
//      out.println(jsonString);
097
out.flush();
098
out.close();
099
}
100
101
/**
102
* Struts2序列化指定属性时,必须有该属性的getter方法,实际上,如果没有属性,而只有getter方法也是可以的
103
* @return
104
*/
105
publicMap<String, Object> getDataMap() {
106
returndataMap;
107
}
108
109
}
完整的struts.xml配置文件如下:查看源码打印
01   <?xmlversion="1.0"encoding="UTF-8"?>  
02   <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
03   "http://struts.apache.org/dtds/struts-2.0.dtd">  
04   <struts>  
05   <packagename="json"extends="json-default"namespace="/test">  
06   <actionname="testByAction"  
07   class="cn.ysh.studio.struts2.json.demo.action.UserAction"method="testByAction">  
08   <resulttype="json">  
09   <!-- 这里指定将被Struts2序列化的属性,该属性在action中必须有对应的getter方法 -->  
10   <!-- 默认将会序列所有有返回值的getter方法的值,而无论该方法是否有对应属性 -->  
11   <paramname="root">dataMap</param>  
12   <!-- 指定是否序列化空的属性 -->  
13   <!--  
14   <param name="excludeNullProperties">true</param>  
15   -->  
16   <!-- 这里指定将序列化dataMap中的那些属性 -->  
17   <!--  
18   <param name="includeProperties">  
19   userList.*  
20   </param>  
21   -->  
22   <!-- 这里指定将要从dataMap中排除那些属性,这些排除的属性将不被序列化,一半不与上边的参数配置同时出现 -->  
23   <!--  
24   <param name="excludeProperties">  
25   SUCCESS  
26   </param>  
27   -->  
28   </result>  
29   </action>  
30   </package>  
31   <packagename="default"extends="struts-default"namespace="/">  
32   <actionname="testJSONFromActionByGeneral"  
33   class="cn.ysh.studio.struts2.json.demo.action.UserAction"method="doAction">  
34   </action>  
35   <actionname="testByJSP"  
36   class="cn.ysh.studio.struts2.json.demo.action.UserAction"method="testByJSP">  
37   <resultname="success">/actionJSP.jsp</result>  
38   </action>  
39   </package>  
40   </struts>