Struts2自定义Result处理JSON

来源:互联网 发布:ubuntu查看gpu使用率 编辑:程序博客网 时间:2024/06/06 04:51

以前在采用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;        }    }

如果resultType实现了Result接口,则执行

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;@Overrideprotected 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();}}}

JsonReulst定义好了该如何让Struts处理呢?

我们在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>

reuslt的name可以任意,但type必须和你注册的ResultType相同。


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处理解决方案,下篇文章会介绍该插件的使用方式



原创粉丝点击