关于webwork框架返回JSON数据格式的问题2015-10-27
来源:互联网 发布:淘宝网皮书包 编辑:程序博客网 时间:2024/06/07 02:20
最近接触到webwork框架,因为项目需求,需要将后台的数据采用json格式返回。
通过百度搜索,找到的方法也很多,但都讲得不够具体,不容易看懂。这里找到一个方法,写了一个返回json的类继承Result(http://www.thinksaas.cn/group/topic/329708/),觉得这种方法不错。具体代码如下:
JSONResult.java
package com.web.action;import com.opensymphony.xwork.ActionInvocation;import com.opensymphony.xwork.Result;import java.io.OutputStream;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import javax.servlet.http.HttpServletResponse;import java.lang.reflect.Field;import com.opensymphony.webwork.ServletActionContext;import com.opensymphony.xwork.ActionContext;import org.json.JSONObject;public class JSONResult implements Result {private static final Log LOG = LogFactory.getLog(JSONResult.class);// action中的json对象的名词private String jsonObjectProperty = "jsonObject";private String contentType = "application/json";private String encoding = "utf-8";@Overridepublic void execute(ActionInvocation invocation) throws Exception {// TODO Auto-generated method stubif (LOG.isDebugEnabled()) {LOG.debug("executing JSONResult");}// 通过xwork的invocation从webwork的action中获得JSONObject对象JSONObject jsonObject = getJSONObject(invocation);if (jsonObject != null) {String json = jsonObject.toString();HttpServletResponse response = getServletResponse(invocation);response.setContentType(getContentType());// encodingbyte[] bs = json.getBytes(this.encoding);response.setContentLength(bs.length);OutputStream os = response.getOutputStream();os.write(bs);os.flush();if (LOG.isDebugEnabled()) {LOG.debug("written [" + json+ "] to HttpServletResponse outputstream");}}}protected JSONObject getJSONObject(ActionInvocation invocation)throws Exception {ActionContext actionContext = invocation.getInvocationContext();// 从xwork配置中获得JSON对象名词Object obj = actionContext.getValueStack().findValue(jsonObjectProperty);if (obj == null) {LOG.error("property [" + jsonObjectProperty+ "] returns null, please check xwork.xml file");return null;}// 如果Action中的对象是JSONObject,那么就不需要反射动态转换为JSONObject// 如果Action中的对象就是POJO,那么这里自动组装JSONObjectif (!JSONObject.class.isInstance(obj)) {LOG.debug("build json object by reflection.");JSONObject jsonObj = new JSONObject();for (Field field : obj.getClass().getDeclaredFields()) {String getter = "get"+ Character.toUpperCase(field.getName().charAt(0))+ field.getName().substring(1);jsonObj.append(field.getName(), obj.getClass().getDeclaredMethod(getter).invoke(obj));}return jsonObj;}return (JSONObject) obj;}protected HttpServletResponse getServletResponse(ActionInvocation invocation) {return (HttpServletResponse) invocation.getInvocationContext().getContextMap().get(ServletActionContext.HTTP_RESPONSE);}public void setEncoding(String encoding) {this.encoding = encoding;}public String getEncoding() {return encoding;}public void setJsonObjectProperty(String jsonObjectProperty) {this.jsonObjectProperty = jsonObjectProperty;}public String getJsonObjectProperty() {return jsonObjectProperty;}public void setContentType(String contentType) {this.contentType = contentType;}public String getContentType() {return contentType;}}
Action类:JSONAction.java
package com.web.action;import org.json.JSONObject;import com.opensymphony.xwork.Action;import com.persistence.model.SysStation;public class JSONAction implements Action {private SysStation sysStation;//这是一个实体映射,映射实体方法这里不再讲述public SysStation getSysStation() {return sysStation;}public void setSysStation(SysStation sysStation) {this.sysStation = sysStation;}@Overridepublic String execute() throws Exception {// TODO Auto-generated method stubsysStation = new SysStation();sysStation.setCity("江苏");sysStation.setMobile("123456");return Action.SUCCESS;}}
配置xwork.xml文件
<result-types><result-type name="json" class="com.web.action.JSONResult" /></result-types>
<action name="jsonTest" class="com.web.action.JSONAction"><result name="success" type="json"> <param name="jsonObjectProperty">sysStation</param></result></action>
这里需要注意,如果action配置节较多的情况下,result-types需要放在package下面,注意配置节的顺序如下,否则出现报错:
package里元素必须按照一定的顺序排列:
result-types
interceptors
default-interceptor-ref
default-action-ref
default-class-ref
global-results
global-exception-mappings
action*(所有action放到最后)
接下来,重启服务,就应该可以直接用地址访问json数据
关于json数据,还需要注意一个问题就是json与jsonp的区别,获取json数据不能跨域,而jsonp则可以,具体说明可以百度了解。
0 0
- 关于webwork框架返回JSON数据格式的问题2015-10-27
- 关于返回json数据格式的问题
- 关于springmvc 处理ajax返回json数据格式的问题
- springmvc解决返回json的数据格式问题
- 关于JSON数据格式返回时间数据格式化问题
- thinkphp返回Json的数据格式
- 关于webwork框架的检验
- 解决处理后台返回json数据格式问题
- Jersey对返回Json数据格式的支持
- thinkphp返回Json数据格式
- SpingMVC返回json数据格式
- 关于jquery-ajax返回json的问题
- 关于Json返回null的问题
- 关于Spring返回json的问题
- 解决SpringMVC返回Json数据格式不严谨报异常的问题(草稿未完成)
- 关于birt与webwork结合的问题
- 关于Freemarket+webwork的编码问题
- 关于spring json view返回json内容的问题
- Carrier frequency 和 EARFCN的关系
- 黑马程序员——C语言基础---预处理指令
- mysql 查询每个人、每个月的消费金额及每年的消费总额
- 菜鸟的java学习-------第一篇初识java
- [77]Combinations
- 关于webwork框架返回JSON数据格式的问题2015-10-27
- rpm包打包过程详解(一)——rpm打包
- [Xamarin.Android] 结合Windows Azure与Google cloud message 来实现Push Notification
- Mezzanine入门(一)
- synchronized详解。
- 搭建期间未解决问题
- 批处理bat schtasks 启动远程应用
- Android抽奖(大转盘,随机)
- Android蓝牙设备的检测