Struts2自定义返回Json类型result

本来Struts2有自己的json类型的返回结果,并提供了插件,但是它有一个问题,那就是它会将所有序列化的字段都返回,如果想要制定返回Action的某一个属性,则需要在配置result时,配置参数(这里只是举个例子):

<param name="root">responseMap</param>  

配置了这个参数,返回结果就会从Action中的responseMap为根进行返回。

但是如果自定义结果类型,就可以自己控制了,而且不需要struts2-json-result插件,以下是配置信息:

<package name="default" extends="struts-default" namespace="/login">
    <result-types>
            <result-type name="jsonResult" class="com.lxl.erp.base.JSONResult" />
    </result-types>

    <action name="*/*" class="{1}" method="{2}">
        <result type="jsonResult" name="success" />
    </action>
</package>
com.lxl.erp.base.JSONResult为我们自己需要实现的返回类型的实现类:
package com.lxl.erp.base;

import java.io.PrintWriter;
import java.lang.reflect.UndeclaredThrowableException;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;

import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.ServletActionContext;
import org.apache.struts2.dispatcher.StrutsResultSupport;

import com.lxl.erp.common.HttpConstant;
import com.lxl.erp.common.ResourceLanguage;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.ExceptionHolder;
import com.opensymphony.xwork2.util.ValueStack;

import net.sf.json.JSONObject;

/**
 * @ClassName: JsonResult
 * @Description: Result fomed by json
 * @author aaron
 * @date Nov 7, 2011 4:27:06 PM
 * @version V1.0
 */
public final class JSONResult extends StrutsResultSupport
{
    private static final long serialVersionUID = 1L;

    @Override
    protected void doExecute(String finalLocation, ActionInvocation invocation)
            throws Exception
    {
        BaseAction bas = (BaseAction) invocation.getAction();
        bas.clearErrorsAndMessages();

        HttpServletResponse response = (HttpServletResponse) invocation
                .getInvocationContext().get(HTTP_RESPONSE);
        response.setContentType(HttpConstant.RESPONSE_CONTENT_TYPE);

        @SuppressWarnings("unchecked")
        Map<String, Object> responseMap = (Map<String, Object>) invocation
                .getStack().findValue(HttpConstant.RESPONSEMAP);
        if (responseMap == null)
        {
            responseMap = new HashMap<String, Object>(3);
        }
        else if (responseMap.get(HttpConstant.RETCODE) == null)
        {
            ValueStack s = invocation.getStack();
            for (int i = s.size(); i > 0; i--)
            {
                Object obj = s.pop();
                if (obj instanceof ExceptionHolder)
                {
                    responseMap.put(HttpConstant.RETCODE,
                            HttpConstant.ERROR_CODE);
                    responseMap.put(HttpConstant.RETMSG,
                            HttpConstant.UNKNOWNERROR);

                    Object o = ((ExceptionHolder) obj).getException();

                    if (o instanceof ServiceException)
                    {
                        String accept_language = ServletActionContext
                                .getRequest()
                                .getHeader(HttpConstant.REQUEST_HEADER_LANG);
                        String language = accept_language.split(",")[0];
                        Locale locale = Locale.getDefault();
                        if (language.toLowerCase()
                                .indexOf(ResourceLanguage.CHINESE) > -1)
                        {
                            locale = Locale.CHINA;
                        }
                        else if (language.toLowerCase()
                                .indexOf(ResourceLanguage.ENGLISH) > -1)
                        {
                            locale = Locale.US;
                        }
                        ResourceBundle bundle = ResourceBundle.getBundle(
                                ResourceLanguage.SOURCELOCATION, locale);

                        ServiceException exception = (ServiceException) o;

                        responseMap.put(HttpConstant.RETMSG,
                                exception.getErrorMsg(bundle));
                    }
                    else if (o instanceof Exception)
                    {
                        Exception exception = (Exception) o;
                        responseMap.put(HttpConstant.RETMSG,
                                exception.getCause().getMessage());
                    }
                    else if (o instanceof UndeclaredThrowableException)
                    {
                        o = ((UndeclaredThrowableException) o)
                                .getUndeclaredThrowable();
                    }
                    break;
                }
            }
        }

        PrintWriter pw = response.getWriter();
        pw.println(JSONObject.fromObject(responseMap));
        return;
    }
}

这样,只要在Action中添加一个属性responseMap(需要与自定义的结果类型中代码

(Map<String, Object>) invocati.getStack().findValue(HttpConstant.RESPONSEMAP)

中的HttpConstant.RESPONSEMAP对应哦,HttpConstant.RESPONSEMAP是自定义的常量)。

这样Action请求处理函数中,将要返回的请求数据结果放到responseMap中,然后返回SUCCESS就可以了,前台就可以通过ajax请求访问了。

时间: 2024-10-12 11:49:30

Struts2自定义返回Json类型result的相关文章

Struts2+Jquery实现ajax并返回json类型数据

主要实现步骤如下: 1.JSP页面使用脚本代码执行ajax请求 2.Action中查询出需要返回的数据,并转换为json类型模式数据 3.配置struts.xml文件 4.页面脚本接受并处理数据 网上看到很多关于Struts2+ajax+jquery+json的例子,但是很多都不完整,也看不明白,主要原因是返回jsno类型数据和原来的返回字符串类型数据不一样,并且网友们实现步骤没有说清楚,让初学的朋友捉摸不透到底该怎么做. 我做了个简单的demo,供网友们学习,最后我会附上链接,可以下载整个de

【转】struts2如何返回json和处理json

以下是小弟的一点研究成果,拿来和大家分享,我用了3到4中struts2操作json找了一种我认识最合理和最简单的,最下面有引用网上的资料,因为都一样就没有必要赘述了,上面都是我自己的实例,如有错误请大家指正. 需要的jar包是struts2.1.8,json插件就是2.1.8的struts2-json-plugin-2.1.8.1,因为json的第三方插件有很多,例如json-lib-2.4-jdk15和json虽然说可以实现json的处理,但是相对来说可能是有点麻烦,而S2自带的插件为简单一点

struts2后台返回json到jsp页面

1.在action定义一个全局变量如: private Map<String, Object> dataMap; 2.控制层方法 说明:主要的目的是把我们定义的Map转为Json对象,然后输出到前台    public String valiDateCode(){        HttpServletRequest request = ServletActionContext.getRequest();        HttpSession session = request.getSessi

Struts2学习笔记 - 结果类型result

所谓结果类型就是struts.xml文件中,action中的result节点,如下图,这个result的其中一个属性是type,它包含很多种类型,不同类型可以有不同的效果,下面将会介绍一些 1. 文件下载Stream stream 种类是用来下载文件用的,先来看看例子 <action name="download" class="cn.com.test.action.DownloadAction"> <result type="strea

struts2注释返回json数据

原文地址:https://www.cnblogs.com/asusdell/p/10482589.html

Struts2返回JSON对象的方法总结

一.为什么struts2要返回json       如果是作为客户端的HTTP+JSON接口工程,没有JSP等view视图的情况下,使用Jersery框架开发绝对是第一选择.而在基于Spring3 MVC的架构下,对HTTP+JSON的返回类型也有很好的支持.但是,在开发工作中,对功能的升级是基于既定架构是很常见的情况.本人碰到需要用开发基于Struts2的HTTP+JSON返回类型接口就是基于既定框架结构下进行的. struts2和json的集成,是为了适应在action 处理完后需要向对端输

ajax——优化0126(增删改查:添加查看详情,返回结果类型为JSON型,在窗口显示)

效果: 鼠标点击查看详情时 数据库: 0126.php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <me

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数据的原理及具体应用范例

早在我刚学Struts2之初的时候,就想写一篇文章来阐述Struts2如何返回JSON数据的原理和具体应用了,但苦于一直忙于工作难以抽身, 渐渐的也淡忘了此事.直到前两天有同事在工作中遇到这个问题,来找我询问,我又细细地给他讲了一遍之后,才觉得无论如何要抽一个小时的时间来写这篇文章, 从头到尾将Struts2与JSON的关系说清楚. 其实网络中,关于这个问题的答案已是海量,我当初也是从这海量的答案中吸收精华,才将“Struts2返回JSON数据”这个问题搞清楚的.但 是这些海量的答案,有一个共同