日期:2014-05-16 浏览次数:20496 次
以前在采用Struts2开发的项目中,对JSON的处理一直都在Action里处理的,在Action中直接Response,最近研读了一下Struts2的源码,发现了一个更加优雅的解决办法,自己定义一个ResultType,
首先大家先看下Struts2中的源码
包com.opensymphony.xwork2下的DefaultActionInvocation
472行
    /**
     * Save the result to be used later.
     * @param actionConfig current ActionConfig
     * @param methodResult the result of the action.
     * @return the result code to process.
     */
    protected String saveResult(ActionConfig actionConfig, Object methodResult) {
        if (methodResult instanceof Result) {
            this.explicitResult = (Result) methodResult;
            // Wire the result automatically
            container.inject(explicitResult);
            return null;
        } else {
            return (String) methodResult;
        }
    }this.explicitResult = (Result) methodResult;
            // Wire the result automatically
            container.inject(explicitResult);
            return null;
现在我们来定义一个接口(JsonResult)来处理一般的POJO对象
package com.kiloway.struts;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletResponse;
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.dispatcher.StrutsResultSupport;
import com.opensymphony.xwork2.ActionInvocation;
public class JsonResult extends StrutsResultSupport {
	private Object result;
	private JsonConfig jsonConfig;
	public Object getResult() {
		return result;
	}
	public JsonResult(JsonConfig jsonConfig) {
		super();
		this.jsonConfig = jsonConfig;
	}
	public void setResult(Object result) {
		this.result = result;
	}
	private static final long serialVersionUID = 7978145882434289002L;
	@Override
	protected void doExecute(String finalLocation, ActionInvocation invocation)
			throws Exception {
		HttpServletResponse response = null;
		try {
			response = ServletActionContext.getResponse();
			PrintWriter printWriter = response.getWriter();
			if (jsonConfig != null) {
				printWriter.write(JSONObject.fromObject(result).toString());
			} else {
				printWriter.write(JSONObject.fromObject(result, jsonConfig)
						.toString());
			}
		}catch(Exception e){
			throw new Exception("json parse error!");
		} finally {
			response.getWriter().close();
		}
		
	}
}
我们在struts.xml里面可以这样定义
<package name="default" namespace="/" extends="struts-default"> <result-types> <result-type name="jsonResult" class="com.kiloway.struts.JsonResult"/> </result-types> <action name="student" class="com.kiloway.struts.Student"> <result name="json" type="jsonResult"/> </action> </package>
Action 中直接这样调用
public JsonResult getJson()
	{
		UserInfo f = new UserInfo();
		f.setName("小睿睿");
		f.setPassword("哈哈");
		JsonResult jsonResult  = new JsonResult();
		jsonResult.setResult(f);
		return jsonResult;
	}
在我们的Action代码中就不用response.write了,完全交给了Reuslt对象去处理了(doExecute)
这样就很方便的处理了JSON格式的数据
在我下载的最新的struts的开发包里,发现了一个JSON处理插件 struts2-json-plugin-2.3.8.jar
该插件提供了更完善的JSON处理解决方案,下篇文章会介绍该插件的使用方式