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

转载于:https://www.cnblogs.com/azhqiang/p/4676048.html

Struts2自定义Result处理JSON相关推荐

  1. php自定义函数格式化,PHP自定义函数格式化json数据实例

    这篇文章主要介绍了PHP自定义函数格式化json数据的方法,结合实例形式分析了php通过自定义函数进行字符串与数组的遍历.转换.计算等操作实现json数据格式化的功能,需要的朋友可以参考下 具体如下: ...

  2. springmvc 自定义view支持json和jsonp格式数据返回

    1.如果controlloer上用@ResponseBody注解,则用<mvc:message-converter>里面配置的json解析器进行解析 <mvc:annotation- ...

  3. php 自定义格式化,PHP自定义函数格式化json数据示例

    本文实例讲述了PHP自定义函数格式化json数据的方法.分享给大家供大家参考,具体如下: /** * Formats a JSON string for pretty printing * * @pa ...

  4. Struts2 自定义验证器

    1.工程目录结构图: 2.以下依次帖代码:     a).    web.xml <?xml version="1.0" encoding="UTF-8" ...

  5. struts2自定义标签_Struts 2 –没有为动作和结果输入定义结果

    struts2自定义标签 Recently while working on a Struts 2 project, I got a strange error message No result d ...

  6. java action result_Struts2 Result 返回JSON对象详解

    如果是作为客户端的HTTP+JSON接口工程,没有JSP等view视图的情况下,使用Jersery框架开发绝对是第一选择.而在基于Spring3 MVC的架构下,对HTTP+JSON的返回类型也有很好 ...

  7. python类定义中、对象字符串的特殊方法是_python中自定义类对象json字符串化的方法_python json转字符串、...

    python中自定义类对象json字符串化的方法 1. 用 json 或者simplejson 就可以 2.定义转换函数: def convert_to_builtin_type(obj): prin ...

  8. java的tcp实时接收json格式报文_tcp - 如何使用带有rsocket Java的TcpClientTransport将自定义数据格式转换为JSON - 堆栈内存溢出...

    我有一个Tcp数据提供程序,它使用管道定界符发出数据,该定界符需要转换为JSON,然后存储在NoSQL数据存储区中. 我已使用RSocket中的TcpClientTransport协议连接到提供程序, ...

  9. var obj = eval(result); 解析json

    l  var obj = eval(result);解析json 转载于:https://www.cnblogs.com/baijin05/p/5040422.html

最新文章

  1. 第一章:1.1.3 典型信号
  2. 【翻译】卡通图解DNS,你的信息怎么被泄露的?
  3. C#获取程序集的版本号和最后编译时间
  4. 你知道“拉黑”、“关注”、“点赞”、“转发”、“分享到朋友圈”等英语咋说吗?
  5. 东芝移动硬盘驱动_传输数据不用等,高速移动硬盘数据线畅享快传体验
  6. dj鲜生-08-用户注册的功能-上-实现注册的主逻辑和其本的验证功能-伴随着调试
  7. c# string 转 datetime_tesseract || PDF转PNG转txt
  8. Java集合基础知识总结
  9. 西昌学院计算机科学与技术好不好,西昌学院好不好评价怎么样
  10. timequest静态时序分析学习笔记之工具使用
  11. java spit 点_java split 的一些用法注意点。
  12. CFS 调度器数据结构篇
  13. IE中使用Google Chrome Frame运行HTML 5
  14. Python 免费翻译API
  15. mysql localhost无法连接
  16. 2022最新淘客三合一cms商城优惠券系统搭建教程
  17. 让IE浏览器打开JSON文件直接显示
  18. 修改TOMCAT6.0内存的方法
  19. 机器学习入门例子--预测浏览量
  20. 熬过最艰难的日子说说

热门文章

  1. 一次 Druid 连接池泄露引发的血案!
  2. 在校生如何快速提升竞争力
  3. 理解分布式系统中的缓存架构(上)
  4. 左耳朵耗子论微服务 Serverless 及 FaaS | GIAC 访谈
  5. Spring Boot中使用MongoDB数据库
  6. Java:假设车库有3个车位(可以通过boolean[]数组来表示车库)可以停车,写一个程序模拟多个用户开车离开,停车入库的效果。注意:车位有车时不能停车。
  7. Module not found: Error: Can't resolve 'less-loader' in 'E:\NodeDemo\vue_assistant_lsp'
  8. 论转发与重定向参数传递问题(jsp+servlet项目开发遇到的问题)
  9. date oracle 表中_从 MySQL 迁移数据到 Oracle 中的全过程
  10. ajax提交后立刻刷新,Ajax提交表单页面刷新很快的解决方法