下面是整个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>