下面是整个Action的完整代码:
- package cn.ysh.studio.struts2.json.demo.action;
- import java.io.IOException;
- import java.io.PrintWriter;
- import java.util.HashMap;
- import java.util.Map;
- import javax.servlet.http.HttpServletResponse;
- import org.apache.struts2.ServletActionContext;
- import net.sf.json.JSONObject;
- import cn.ysh.studio.struts2.json.demo.bean.User;
- import com.opensymphony.xwork2.ActionSupport;
- public class UserAction extends ActionSupport {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- //将会被Struts2序列化为JSON字符串的对象
- private Map<String, Object> dataMap;
- /**
- * 构造方法
- */
- public UserAction() {
- //初始化Map对象
- dataMap = new HashMap<String, Object>();
- }
- /**
- * 测试通过action以视图方式返回JSON数据
- * @return
- */
- public String testByJSP() {
- User user = new User();
- user.setId("123");
- user.setName("JSONActionJSP");
- user.setPassword("123");
- user.setSay("Hello world !");
- JSONObject jsonObject=new JSONObject();
- jsonObject.accumulate("user", user);
- jsonObject.accumulate("success", true);
- //这里在request对象中放了一个data,所以struts的result配置中不能有type="redirect"
- ServletActionContext.getRequest().setAttribute("data", jsonObject.toString());
- return SUCCESS;
- };
- /**
- * 测试通过action以Struts2默认方式返回JSON数据
- * @return
- */
- public String testByAction() {
- // dataMap中的数据将会被Struts2转换成JSON字符串,所以这里要先清空其中的数据
- dataMap.clear();
- User user = new User();
- user.setId("123");
- user.setName("JSONActionStruts2");
- user.setPassword("123");
- user.setSay("Hello world !");
- dataMap.put("user", user);
- // 放入一个是否操作成功的标识
- dataMap.put("success", true);
- // 返回结果
- return SUCCESS;
- }
- /**
- * 通过action是以传统方式返回JSON数据
- * @throws IOException
- */
- public void doAction() throws IOException{
- HttpServletResponse response=ServletActionContext.getResponse();
- //以下代码从JSON.java中拷过来的
- response.setContentType("text/html");
- PrintWriter out;
- out = response.getWriter();
- //将要被返回到客户端的对象
- User user=new User();
- user.setId("123");
- user.setName("JSONActionGeneral");
- user.setPassword("JSON");
- user.setSay("Hello , i am a action to print a json!");
- JSONObject json=new JSONObject();
- json.accumulate("success", true);
- json.accumulate("user", user);
- out.println(json.toString());
- // 因为JSON数据在传递过程中是以普通字符串形式传递的,所以我们也可以手动拼接符合JSON语法规范的字符串输出到客户端
- // 以下这两句的作用与38-46行代码的作用是一样的,将向客户端返回一个User对象,和一个success字段
- // String jsonString="{\"user\":{\"id\":\"123\",\"name\":\"JSONActionGeneral\",\"say\":\"Hello , i am a action to print a json!\",\"password\":\"JSON\"},\"success\":true}";
- // out.println(jsonString);
- out.flush();
- out.close();
- }
- /**
- * Struts2序列化指定属性时,必须有该属性的getter方法,实际上,如果没有属性,而只有getter方法也是可以的
- * @return
- */
- public Map<String, Object> getDataMap() {
- return dataMap;
- }
- }
完整的struts.xml配置文件如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
- "http://struts.apache.org/dtds/struts-2.0.dtd">
- <struts>
- <package name="json" extends="json-default" namespace="/test">
- <action name="testByAction"
- class="cn.ysh.studio.struts2.json.demo.action.UserAction" method="testByAction">
- <result type="json">
- <!-- 这里指定将被Struts2序列化的属性,该属性在action中必须有对应的getter方法 -->
- <!-- 默认将会序列所有有返回值的getter方法的值,而无论该方法是否有对应属性 -->
- <param name="root">dataMap</param>
- <!-- 指定是否序列化空的属性 -->
- <!--
- <param name="excludeNullProperties">true</param>
- -->
- <!-- 这里指定将序列化dataMap中的那些属性 -->
- <!--
- <param name="includeProperties">
- userList.*
- </param>
- -->
- <!-- 这里指定将要从dataMap中排除那些属性,这些排除的属性将不被序列化,一半不与上边的参数配置同时出现 -->
- <!--
- <param name="excludeProperties">
- SUCCESS
- </param>
- -->
- </result>
- </action>
- </package>
- <package name="default" extends="struts-default" namespace="/">
- <action name="testJSONFromActionByGeneral"
- class="cn.ysh.studio.struts2.json.demo.action.UserAction" method="doAction">
- </action>
- <action name="testByJSP"
- class="cn.ysh.studio.struts2.json.demo.action.UserAction" method="testByJSP">
- <result name="success">/actionJSP.jsp</result>
- </action>
- </package>
- </struts>