Struts2自定义返回Json类型result
本来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的更多相关文章
- Struts2+Jquery实现ajax并返回json类型数据
来源于:http://my.oschina.net/simpleton/blog/139212 摘要 主要实现步骤如下: 1.JSP页面使用脚本代码执行ajax请求 2.Action中查询出需要返回的 ...
- 转载:Struts2+Jquery实现ajax并返回json类型数据
摘要: 主要实现步骤如下: 1.JSP页面使用脚本代码执行ajax请求 2.Action中查询出需要返回的数据,并转换为json类型模式数据 3.配置struts.xml文件 4.页面脚本接受并处理数 ...
- 3.自定义返回json格式的数据给前台(自定义Controller类中的Json方法)
在mvc的项目中,我们前台做一些操作时,后台要返回一些结果给前台,这个时候我们就需要有一个状态来标识到底是什么类型的错误, 例如: 执行删除的时候,如果操作成功(1行受影响),我们需要返回状态为1并输 ...
- struts2 ajax jquery返回json类型
三个页面, <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC & ...
- Extjs 4.1 struts2.3 返回json 初试
之前曾经使用过3.x版本的extjs,当时可以结合struts实现各种基本的增删查改.但是4.1版本中增加了一些属性,出现了一些新的使用方法,导致错误不断,有的时候调用到相应的action却返回不了值 ...
- struts2注解返回json
Struts2使用注解方式返回Json数据 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/Geek_Alex/article/details/788 ...
- SpringMvc返回JSON出现"$.result.currentLevel"
"$.result.currentLevel" 问题描述 使用SpringMvc返回一个json数据的时候,会在产生的结果中出现如下的问题:"$.result.curre ...
- struts2后台返回json到jsp页面
1.在action定义一个全局变量如: private Map<String, Object> dataMap; 2.控制层方法 说明:主要的目的是把我们定义的Map转为Json对象,然后 ...
- Spring boot返回JSON类型响应及Content-Type设置
一.背景 服务器软件用Spring boot开发,API调用的响应消息格式为JSON. 对端调用接口后无法解析响应. 抓包看Response的Body部分确实是正确的JSON格式字符串. 二.问题分析 ...
随机推荐
- Java面试题,深入理解final关键字
final关键字 final的简介 final可以修饰变量,方法和类,用于表示所修饰的内容一旦赋值之后就不会再被改变,比如String类就是一个final类型的类. final的具体使用场景 fina ...
- 分布式RPC框架性能大比拼
https://github.com/grpc/grpc http://colobu.com/2016/09/05/benchmarks-of-popular-rpc-frameworks/ http ...
- kvm虚拟化学习笔记(三)之windows kvm虚拟机安装
KVM虚拟化学习笔记系列文章列表----------------------------------------kvm虚拟化学习笔记(一)之kvm虚拟化环境安装http://koumm.blog.51 ...
- centos7下cp -rf总是提示覆盖的解决办法
发现每次执行cp命令,其实是执行了cp -i命令的别名,因此无论怎么输入都提示是否覆盖. cat ~/.bashrc,有“alias cp='cp -i'”,难怪如此!!! 添加#号,#alias c ...
- poj 2965 The Pilots Brothers' refrigerator(dfs 枚举 +打印路径)
链接:poj 2965 题意:给定一个4*4矩阵状态,代表门的16个把手.'+'代表关,'-'代表开.当16个把手都为开(即'-')时.门才干打开,问至少要几步门才干打开 改变状态规则:选定16个把手 ...
- POJ-2240 -Arbitrage(Bellman)
题目链接:Arbitrage 让这题坑了,精度损失的厉害.用赋值的话.直接所有变成0.00了,无奈下,我仅仅好往里输了,和POJ1860一样找正环,代码也差点儿相同,略微改改就能够了,可是这个题精度损 ...
- Swift简单介绍 教程
Swift是什么? Swift是苹果于WWDC 2014公布的编程语言.这里引用The Swift Programming Language的原话: Swift is a new programmi ...
- 提升Android编译速度
Android codebase都非常大.编译一次都须要花非常多时间.假设是preloader/lk/bootimage还好,可是Android的话都是非常久. 实际上这个编译时间还是能够进一步缩短! ...
- leetcode笔记:Majority Element
一. 题目描写叙述 Given an array of size n, find the majority element. The majority element is the element t ...
- gnu-ucos 增加 bmp 位图显示
昨天又下了点功夫弄了个在tft屏幕上显示bmp位图的. 我选择的是24位tft真彩測显示方式所以也要选择真彩色位图.网上给出的16位位图数组无法使用.在csdn上下载了2个制作工具,一个是c代码的,一 ...