Struts2自定义Result处理JSON

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

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

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处理解决方案。

原文http://blog.csdn.net/myxx520/article/details/8655088

时间: 2024-10-11 08:26:54

Struts2自定义Result处理JSON的相关文章

扩展struts2的结果集StrutsResultSupport 自定义Result处理JSON

以前在采用Struts2开发的项目中,对JSON的处理一直都在Action里处理的,在Action中直接Response,最近研读了一下Struts2的源码,发现了一个更加优雅的解决办法,自己定义一个ResultType, 首先大家先看下Struts2中的源码 包com.opensymphony.xwork2下的DefaultActionInvocation 472行 [java] view plaincopyprint? /** * Save the result to be used lat

jquery序列化from表单使用ajax提交返回json数据(使用struts2注解result type = json)

1.action类引入struts2的"json-default"拦截器栈 @ParentPackage("json-default") //示例 @ParentPackage(WapBaseAction.WAP_PACKAGE) //WAP_PACKAGE继承了json-default @Namespace("/") public class ModifyResumeAction extends WapBaseAction {... [emai

Struts2 自定义Result

注意:我只要是解决自定义返回Json 和异常处理问题 新建一个类 AjaxResult   继承 StrutsResultSupport 看看代码吧 public class AjaxResult extends StrutsResultSupport { /** * serialVersionUID */ private static final long serialVersionUID = 1L; private static final String AJAX_SUCCESS = "{\

Struts2自定义返回Json类型result

本来Struts2有自己的json类型的返回结果,并提供了插件,但是它有一个问题,那就是它会将所有序列化的字段都返回,如果想要制定返回Action的某一个属性,则需要在配置result时,配置参数(这里只是举个例子): <param name="root">responseMap</param> 配置了这个参数,返回结果就会从Action中的responseMap为根进行返回. 但是如果自定义结果类型,就可以自己控制了,而且不需要struts2-json-res

Struts2自定义拦截器Interceptor以及拦截器登录实例

1.在Struts2自定义拦截器有三种方式: -->实现Interceptor接口 public class QLInterceptorAction implements Interceptor{ private static final long serialVersionUID = 1L; public void destroy() { } public void init() {} public String intercept(ActionInvocation arg0) throws

struts2将数据通过Json格式显示于EasyUI-datagrid数据表格

1.搭建ssh开发环境 2.写好Dao.service等方法 3.建立DTO数据传输对象: package com.beichende.sshwork.user.web.dto; import java.util.ArrayList; import java.util.List; import com.beichende.sshwork.pojo.User; public class Pagination<T> { private int total; private List<User

struts2自定义转换器

Struts2自定义类型转换器分为局部类型转换器和全局类型转换器 (1)局部类型转换器 如果页面传来一个参数reg.action?birthday=2010-11-12到后台action,然后属性用date类型是可以接收到的,但是如果传的是20101112这样类型的字符串,用date类型是获取不到,并且会出现错误的,struts2提供了一种类型转换器供我们使用. 以下为局部类型转换器的开发步骤 a.首先要写一个类来继承StrutsTypeConverter b.然后覆盖convertFromSt

Struts2 配置文件result的name属性和type属性

Struts2 配置文件result的name属性和type属性:Name属性SUCCESS:Action正确的执行完成,返回相应的视图,success是 name属性的默认值: NONE:表示Action正确的执行完成,但并不返回任何视图: ERROR:表示Action执行失败,返回到 错误处理视图: INPUT:Action的执行,需要从前端界面获取参数,INPUT就是代表这个参数输入的界面,一般在应用中,会对这些参数进 行验证,如果验证没有通过,将自动返回到该视图: LOGIN:Actio

Struts2用AJAX实现JSON插件的使用

AJAX的详细描述就不做介绍了,大家基本都懂这个. 下面我们会通过两个具体的案例,来做具体的实现: 案例一: 案例描述:输入用户名,把用户名通过AJAX异步传输的方式发送至后台,判断此用户名是否存在. 第一步,我们需要导入这三个jar包:commons-lang3-3.1.jar.struts2-json-plugin-2.1.8.1.jar.xwork-core-2.1.6.jar,然后还有Struts2的几个基本jar包 第二步,还要导入jQuery的配置文件:jquery-1.8.0.mi