`

webwork中自定义的JSON result

阅读更多

webwork2.1.7没有带json类型的result,2.2.7中的json类型的result好像有bug,不支持encoding编码。这里写了一个result,可以通用,并且可以将普通的POJO转化成JSON对象。很好用

package com.xujun.framework.webwork;

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 com.opensymphony.xwork.ActionInvocation;
import com.opensymphony.xwork.Result;
import org.json.JSONObject;

/**
 * 支持自动组装JSONObject的JSONResult,支持encoding编码。
 * @author 徐骏
 * @data 2009-11-25
 */
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";

 @Override
 public void execute(ActionInvocation invocation) throws Exception
 {

  if (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());
   // encoding
   byte[] 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,那么这里自动组装JSONObject
  if (!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;
 }

}
xwork.xml配置

 <!--My Result-->
    <result-types>
      <result-type name="json" class="com.xujun.framework.webwork.JSONResult" />
    </result-types>

<action name="jsonTest" class="com.ntyl.action.JSONAction">
      <result name="success" type="json">
        <param name="jsonObjectProperty">user</param>
      </result>
    </action>

JSONAction.java 注意User对象是POJO,我自己写的一个对象,result会自动的转化成JSONObject,当然如果这里就是一个JSONObject,通过put方法设置属性,那么也完全没有问题.

public class JSONAction  implements Action{
 private User user;

 public User getUser()
 {
  return user;
 }
 /**
  * @see com.opensymphony.xwork.Action#execute()
  */
 public String execute() throws Exception
 {
  user = new User();
  user.setUserName("xujun");
  user.setPassword("123456");
  user.setUserId(1);
  return Action.SUCCESS;
 }


}

分享到:
评论

相关推荐

    webwork in action

    - **实施WebWork动作**:第四章讲解了如何实现WebWork中的动作,包括动作的定义、参数传递、异常处理等内容。 - **使用拦截器增加功能**:第五章重点介绍了拦截器的作用及其配置方法,读者可以通过拦截器来增强动作...

    Webwork2-Guide.rar_webwork2

    5. 结果处理器(Result)根据Action返回的结果类型,决定如何展示给用户,如转发到JSP页面或者生成JSON响应。 6. 视图层(如JSP)从ValueStack中获取数据,渲染输出。 三、Webwork2中的MVC模式 1. **Model**: 业务...

    webwork Documentation

    WebWork框架允许开发者自定义主题,通过CSS和模板引擎实现统一的页面样式,提升用户体验的一致性。 ### 核心概念与技术 #### 配置与管理 WebWork框架通过XML配置文件来管理请求映射、拦截器、主题等,这为开发者...

    webwork 实例

    4. **Result**:定义了Action执行后的响应,可以是重定向、转发到特定的JSP页面,或者返回JSON、XML等格式的数据。 5. **ValueStack**:WebWork中的一个重要概念,它是一个对象栈,用于存储Action的属性,方便在...

    Struts 2 began as WebWork.

    此外,WebWork的Action和Result概念为处理HTTP请求和返回响应提供了简洁的模型。 Struts 2的诞生是在2005年,当Apache软件基金会决定将WebWork与Apache Struts 1.x合并,以创建一个更强大、更现代的框架。这次合并...

    ssh+extjs+json

    在SSH+EXTJS+JSON的组合中,Spring负责后端业务逻辑和数据访问,Struts2处理MVC流程,Hibernate处理数据持久化,EXTJS构建前端用户界面,而JSON作为前后端数据交换的格式,提高了数据传输效率和易读性。这种组合在...

    struts2.0.6 api chm

    2. **Interceptor**: 拦截器是Struts2中的一个重要概念,它允许在Action执行前后插入自定义逻辑,比如日志记录、权限验证、事务管理等。通过配置拦截器栈,开发者可以灵活地控制请求的处理流程。 3. **Value Stack*...

    struts深入浅出

    Struts2是Apache软件基金会下的一个项目,它继承了WebWork框架的核心功能,同时也吸取了Struts1的优点,提供了更灵活、强大的控制层解决方案。 一、Struts2核心概念 1. Action:Action是Struts2的核心,它是业务...

    struts_api.rar

    对于压缩包中的"api"文件,可能包含的是Struts的官方API文档,或者是开发者自定义的扩展API,这些都可以作为开发和调试的参考资料。 总之,Struts API是Java Web开发的重要工具,通过学习和掌握其API,开发者可以...

    struts小应用事例学习

    首先,Struts 2.0是Struts 1的升级版本,它融合了WebWork框架的许多优秀特性,提供了更强大、灵活的控制层解决方案。它的核心组件包括Action、Result、Interceptor等,这些组件共同协作以实现业务逻辑的处理和视图的...

    struts2包及配置

    Struts2框架整合了WebWork的核心功能和其他优秀框架的特点,提供了灵活的MVC实现,简化了Java Web应用的开发流程。 **一、Struts2框架基础** Struts2的核心组件包括Action、Result、Interceptor(拦截器)等。...

    struts-2.0.1-all.zip

    在实际开发中,开发者需要将这些jar包添加到项目的类路径中,然后按照Struts 2的配置规范设置struts.xml文件,定义Action、Result以及拦截器链。此外,还需要创建Action类,实现业务逻辑,并使用OGNL来绑定数据。 ...

    struts2的速成教程,充电的都来看了

    - **基本概念**:解释Struts2中的核心概念,如Action、Interceptor、Result等,帮助初学者理解框架的基本架构。 #### 三、Struts2核心概念详解 - **体系结构**:深入讲解Struts2的架构组成,包括请求处理流程、MVC...

    struts2.16

    Struts2.16支持多种Result类型,如dispatcher(用于转发到JSP页面)、stream(用于文件下载)和json(用于AJAX请求)。 2. **Interceptor(拦截器)**:拦截器是Struts2的重要特性,它允许开发者在Action执行前后...

    struts2系列教程

    - **12.4 Struts2与JSON示例**:如何在Struts2应用中使用JSON进行前后端交互。 #### 十三、集成Hibernate - **13.1 系统总体设计图**:整体架构设计思路。 - **13.2 系统用例图**:系统的主要功能模块。 - **13.3 ...

    struts2工程核心包

    1. **Action和Result**:Struts2中的Action是业务逻辑的载体,而Result则是Action执行后的结果,例如跳转到某个页面或执行其他操作。这些类在核心包中定义。 2. **配置管理**:包括struts.xml配置文件,用于定义...

    struts2 中文帮助文档

    6. **插件和UI标签库**:Struts2提供了一系列插件,如Tiles、JSON、Ajax等,用于增强功能。同时,其丰富的标签库简化了JSP页面的编写,如s:form、s:textfield、s:submit等。 7. **异常处理与国际化**:了解如何在...

    网络第一份struts2.0学习文档

    - 在Action配置中应用自定义拦截器。 #### 七、探讨IOC模式 - **IOC(Inversion of Control)**: - 控制反转的概念:将对象创建和依赖注入的过程从代码中分离出来。 - Struts2如何支持IOC:通过配置文件指定...

    Struts2权威指南(完整版)

    Result定义了请求处理后的输出,可以是JSP、Freemarker模板、JSON等格式。 2. **拦截器(Interceptor)**:拦截器是Struts2的一大创新,它们是可插拔的组件,可以在Action执行前后插入,实现如日志、权限验证、事务...

Global site tag (gtag.js) - Google Analytics