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

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

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

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

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.objectFactory" value="spring" />
<constant name="struts.i18n.encoding" value="utf-8" />
<constant name="struts.enable.SlashesInActionNames" value="true" />
<package name="default" extends="struts-default" namespace="/login">
<result-types>
<result-type name="jsonResult" class="com.lxl.student.mng.base.JSONResult" />
</result-types> <action name="*/*" class="{1}" method="{2}">
<result type="jsonResult" name="success">
<param name="resultName">responseData</param>
</result>
</action>
</package> </struts>
com.lxl.erp.base.JSONResult为我们自己需要实现的返回类型的实现类:
package com.lxl.student.mng.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.student.mng.common.HttpConstant;
import com.lxl.student.mng.common.ResourceLanguage;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.ExceptionHolder;
import com.opensymphony.xwork2.util.ValueStack; import net.sf.json.JSONObject; public final class JSONResult extends StrutsResultSupport {
private static final long serialVersionUID = 1L; private String resultName; public void setResultName(String resultName) {
this.resultName = resultName;
} @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(resultName); 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.write(JSONObject.fromObject(responseMap).toString()); System.out.println(JSONObject.fromObject(responseMap)); return;
}
}

这样,只要在Action中添加一个属性responseMap存储要返回的数据,通过

(Map<String, Object>) invocation.getStack().findValue(resultName)

在值栈中获取返回的数据(resultName是在struts.xml中配置的,struts会将值压入到值栈中,通过这个配置的名字就可以找到)。

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

注:

HttpConstant.RESPONSE_CONTENT_TYPE="text/plain; charset=UTF-8"

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

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

    来源于:http://my.oschina.net/simpleton/blog/139212 摘要 主要实现步骤如下: 1.JSP页面使用脚本代码执行ajax请求 2.Action中查询出需要返回的 ...

  2. 转载:Struts2+Jquery实现ajax并返回json类型数据

    摘要: 主要实现步骤如下: 1.JSP页面使用脚本代码执行ajax请求 2.Action中查询出需要返回的数据,并转换为json类型模式数据 3.配置struts.xml文件 4.页面脚本接受并处理数 ...

  3. 3.自定义返回json格式的数据给前台(自定义Controller类中的Json方法)

    在mvc的项目中,我们前台做一些操作时,后台要返回一些结果给前台,这个时候我们就需要有一个状态来标识到底是什么类型的错误, 例如: 执行删除的时候,如果操作成功(1行受影响),我们需要返回状态为1并输 ...

  4. struts2 ajax jquery返回json类型

    三个页面, <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC & ...

  5. Extjs 4.1 struts2.3 返回json 初试

    之前曾经使用过3.x版本的extjs,当时可以结合struts实现各种基本的增删查改.但是4.1版本中增加了一些属性,出现了一些新的使用方法,导致错误不断,有的时候调用到相应的action却返回不了值 ...

  6. struts2注解返回json

    Struts2使用注解方式返回Json数据 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/Geek_Alex/article/details/788 ...

  7. SpringMvc返回JSON出现"$.result.currentLevel"

    "$.result.currentLevel" 问题描述 使用SpringMvc返回一个json数据的时候,会在产生的结果中出现如下的问题:"$.result.curre ...

  8. struts2后台返回json到jsp页面

    1.在action定义一个全局变量如: private Map<String, Object> dataMap; 2.控制层方法 说明:主要的目的是把我们定义的Map转为Json对象,然后 ...

  9. Spring boot返回JSON类型响应及Content-Type设置

    一.背景 服务器软件用Spring boot开发,API调用的响应消息格式为JSON. 对端调用接口后无法解析响应. 抓包看Response的Body部分确实是正确的JSON格式字符串. 二.问题分析 ...

随机推荐

  1. POJ 3615 Cow Hurdles

    http://poj.org/problem?id=3615 floyd 最短路径的变形 dist[i][j]变化为 : i j之间的最大边 那么输入的时候可以直接把dist[i][j] 当作i j ...

  2. hdu 5188 zhx and contest [ 排序 + 背包 ]

    传送门 zhx and contest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Othe ...

  3. Flex里监听mouseDownOutside事件解决弹出窗口点击空白关闭功能

    其实当用户在使用 PopUpManager 打开的某个组件外部单击时,会从该组件分派一个mouseDownOutside事件 监听该事件就能实现点击空白处关闭窗口的功能 this.addEventLi ...

  4. 关于HTML文件、JS文件、CSS文件

    把JS和CSS脚本写在html里和写在独立文件里有什么区别? 1. 都写在html里是性能最优的方案. 2. 都写在html里是可维护性最差的方案. 3. 分开写在js.css.html是可维护性最有 ...

  5. django学习之- Ajax

    提示:jquery要使用1版本,因为高版本已不兼容低版本的游览器.参考url:http://www.cnblogs.com/wupeiqi/articles/5703697.html原生ajax:Aj ...

  6. hdu6212 祖玛(区间DP)

    题意 有一个长度为n的01串,我们可以在某个地方插入一个0或者1,那么如果有连续颜色相同的>=3个,那么这段就会消去,两边的合拢.问将所有01串消去,最少需要插入多少个.(n<=200) ...

  7. ArcEngine影像图配准

    转自原文ArcEngine影像图配准 影像图配准主要包括以下几个方面 1.打开影像图 2.配准 3.影像图入库/保存 1.打开影像图的代码以前已经写过了. 2.配准   配准 主要使用IGeoRefe ...

  8. Cg入门6:函数2

    内建函数分为四类: 1.数学函数 2.几何函数 3.纹理函数 4.导数函数:事实上就是片段函数

  9. Android中传递对象的三种方法

    Android知识.前端.后端以至于产品和设计都有涉猎,想成为全栈工程师的朋友不要错过! Android中,Activity和Fragment之间传递对象,可以通过将对象序列化并存入Bundle或者I ...

  10. LeetCode 283 Move Zeroes(移动全部的零元素)

    翻译 给定一个数字数组.写一个方法将全部的"0"移动到数组尾部.同一时候保持其余非零元素的相对位置不变. 比如,给定nums = [0, 1, 0, 3, 12],在调用你的函数之 ...