扩展struts2的结果集StrutsResultSupport 自定义Result处理JSON

以前在采用Struts2开发的项目中,对JSON的处理一直都在Action里处理的,在Action中直接Response,最近研读了一下Struts2的源码,发现了一个更加优雅的解决办法,自己定义一个ResultType,

首先大家先看下Struts2中的源码

包com.opensymphony.xwork2下的DefaultActionInvocation

472行

[java] view plaincopyprint?

  1. /**
  2. * Save the result to be used later.
  3. * @param actionConfig current ActionConfig
  4. * @param methodResult the result of the action.
  5. * @return the result code to process.
  6. */
  7. protected String saveResult(ActionConfig actionConfig, Object methodResult) {
  8. if (methodResult instanceof Result) {
  9. this.explicitResult = (Result) methodResult;
  10. // Wire the result automatically
  11. container.inject(explicitResult);
  12. return null;
  13. } else {
  14. return (String) methodResult;
  15. }
  16. }

如果resultType实现了Result接口,则执行

[java] view plaincopyprint?

  1. this.explicitResult = (Result) methodResult;
  2. // Wire the result automatically
  3. container.inject(explicitResult);
  4. return null;

现在我们来定义一个接口(JsonResult)来处理一般的POJO对象

[java] view plaincopyprint?

  1. package com.kiloway.struts;
  2. import java.io.PrintWriter;
  3. import javax.servlet.http.HttpServletResponse;
  4. import net.sf.json.JSONObject;
  5. import net.sf.json.JsonConfig;
  6. import org.apache.struts2.ServletActionContext;
  7. import org.apache.struts2.dispatcher.StrutsResultSupport;
  8. import com.opensymphony.xwork2.ActionInvocation;
  9. public class JsonResult extends StrutsResultSupport {
  10. private Object result;
  11. private JsonConfig jsonConfig;
  12. public Object getResult() {
  13. return result;
  14. }
  15. public JsonResult(JsonConfig jsonConfig) {
  16. super();
  17. this.jsonConfig = jsonConfig;
  18. }
  19. public void setResult(Object result) {
  20. this.result = result;
  21. }
  22. private static final long serialVersionUID = 7978145882434289002L;
  23. @Override
  24. protected void doExecute(String finalLocation, ActionInvocation invocation)
  25. throws Exception {
  26. HttpServletResponse response = null;
  27. try {
  28. response = ServletActionContext.getResponse();
  29. PrintWriter printWriter = response.getWriter();
  30. if (jsonConfig != null) {
  31. printWriter.write(JSONObject.fromObject(result).toString());
  32. } else {
  33. printWriter.write(JSONObject.fromObject(result, jsonConfig)
  34. .toString());
  35. }
  36. }catch(Exception e){
  37. throw new Exception("json parse error!");
  38. } finally {
  39. response.getWriter().close();
  40. }
  41. }
  42. }

JsonReulst定义好了该如何让Struts处理呢?

我们在struts.xml里面可以这样定义

[html] view plaincopyprint?

  1. <package name="default" namespace="/" extends="struts-default">
  2. <result-types>
  3. <result-type name="jsonResult" class="com.kiloway.struts.JsonResult"/>
  4. </result-types>
  5. <action name="student" class="com.kiloway.struts.Student">
  6. <result name="json" type="jsonResult"/>
  7. </action>
  8. </package>

reuslt的name可以任意,但type必须和你注册的ResultType相同。

Action 中直接这样调用

[java] view plaincopyprint?

  1. public JsonResult getJson()
  2. {
  3. UserInfo f = new UserInfo();
  4. f.setName("小睿睿");
  5. f.setPassword("哈哈");
  6. JsonResult jsonResult  = new JsonResult();
  7. jsonResult.setResult(f);
  8. return jsonResult;
  9. }

在我们的Action代码中就不用response.write了,完全交给了Reuslt对象去处理了(doExecute)

这样就很方便的处理了JSON格式的数据

在我下载的最新的struts的开发包里,发现了一个JSON处理插件 struts2-json-plugin-2.3.8.jar

该插件提供了更完善的JSON处理解决方案,下篇文章会介绍该插件的使用方式

来源:http://blog.csdn.net/myxx520/article/details/8655088

时间: 2024-10-14 10:39:51

扩展struts2的结果集StrutsResultSupport 自定义Result处理JSON的相关文章

Struts2自定义Result处理JSON

以前在采用Struts2开发的项目中,对JSON的处理一直都在Action里处理的,在Action中直接Response,最近研读了一下Struts2的源码,发现了一个更加优雅的解决办法,自己定义一个ResultType, 首先大家先看下Struts2中的源码 包com.opensymphony.xwork2下的DefaultActionInvocation 472行 /** * Save the result to be used later. * @param actionConfig cu

SSH系列:(15)自定义Result返回类型(StrutsResultSupport)

总的来说,写一个自定义的Result Type有三个步骤: (1)写一个实现了Result接口的类 (2)对该类进行注册 (3)使用该类 下面分成两个部分:第1个部分,只要是侧重于项目上的使用方式,第2部分是整理自Sturcts In Action书上的自定义返回Json类型的Result Tye. 1.对错误的特殊处理(项目中) 在有些特殊情况下,如果没有异常信息,但是有错误,并且有错误信息等内容,此时也需要进行友好的错误处理的话,那么可以借助StrutsResultSupport 返回结果类

Struts2类型转换(二)-自定义类型转换器

一.自定义类型转换器 1). 为什么需要自定义的类型转换器 ? 因为Struts不能自动完成字符串到引用类型的转换. 2). 如何定义类型转换器? I. 开发类型转换器的类: 扩展 StrutsTypeConverter 类: II. 配置类型转换器. 有两种配置方式 ①. 基于字段的配置: > 在字段所在的 Model(可能是 Action,也可能是一个JavaBean) 的包下, 新建一个 ModelClassName-conversion.properties 文件 > 在该文件中输入键

jquery序列化from表单使用ajax提交返回json数据(使用struts2注解result type = json)

1.action类引入struts2的"json-default"拦截器栈 @ParentPackage("json-default") //示例 @ParentPackage(WapBaseAction.WAP_PACKAGE) //WAP_PACKAGE继承了json-default @Namespace("/") public class ModifyResumeAction extends WapBaseAction {... [emai

MyEclipse对Struts2配置文件较检异常 Invalid result location value/parameter

有时在编写struts.xml时会报错,但是找不出有什么她方有问题.也能正常运行 MyEclipse有地方去struts的xml进行了验证,经查找把这里 的build去掉就可以了 MyEclipse对Struts2配置文件较检异常 Invalid result location value/parameter

Struts2 自定义Result

注意:我只要是解决自定义返回Json 和异常处理问题 新建一个类 AjaxResult   继承 StrutsResultSupport 看看代码吧 public class AjaxResult extends StrutsResultSupport { /** * serialVersionUID */ private static final long serialVersionUID = 1L; private static final String AJAX_SUCCESS = "{\

JAVAWEB开发之Struts2详解(一)——Struts2框架介绍与快速入门、流程分析与工具配置以及Struts2的配置以及Action和Result的详细使用

Struts2框架介绍 三大框架:是企业主流JavaEE开发的一套架构.Struts2 + Spring + Hibernate 什么是框架?为什么要学习框架? 框架是实现部分功能的代码(半成品),使用框架简化企业级软件开发. Struts2与MVC? Struts是一款优秀的MVC框架 MVC:是一种思想,是一种模式,将软件分为Model模型.View视图.Controller控制器 JAVAEE软件三层架构:web层(表现层).业务逻辑层.数据持久层(Sun提供javaEE开发规范) Jav

struts2学习笔记之十三:自定义过滤器

Struts2的拦截器 1.Struts2的拦截器只能拦截Action,拦截器是AOP的一种思路,可以使我们的系统架构 更松散(耦合度低),可以插拔,容易互换,代码不改变的情况下很容易满足客户需求 其实体现了OCP 2.如何实现拦截器?(整个拦截器体现了责任链模式,Filter也体现了责任链模式) * 继承AbstractInterceptor(体现了缺省适配器模式,建议使用该模式) * 实现Interceptor 3.如果自定了拦截器,缺省拦截器会失效,必须显示引用Struts2默认的拦截器

struts2注解总结[email&#160;protected]和@Result

除了使用配置文件配置之外,还可以使用注解来配置 下面是一些常用的注解 介绍: @Action/@Actions: @Action指定一个类为action,对应配置文件中的<action>....</action>标签,其中可以配置如下属性 results:配置返回的结果集属性,相当于struts2中的<result>列表,可以在{}中配置属性,具体如下 value:配置action的名字,相当于<action>中的name属性 interceptorRefs