`

webwork加入result-types为json的返回类型(支持自动组装JSONObject的JSONResult,支持encoding编码)

阅读更多
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 WUZHENZHONG
 * @data 2012-07-02
 */
public class JSONResult implements Result {

	/**
	 * 
	 */
	private static final long serialVersionUID = 9010804483391553391L;
	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>
   <package name="system-default" extends="webwork-default">
	<result-types>
      		<result-type name="json" class="com.guagua.chat.search.JSONResult" />
    	</result-types>
                <action name="search" class="com.guagua.chat.search.SearchAction">
               	     <result name="cjcategory" type="json">
	          <param name="jsonObjectProperty">cjroomcategory</param>
	     </result>
                 </action>
    </package>
</xwork>

 类例子:

   

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;

import com.guagua.base.AuthFactory;
import com.guagua.base.AuthToken;
import com.guagua.base.UnauthorizedException;
import com.guagua.vas.constants.CacheConstants;
import com.guagua.vas.redis.RedIsService;
import com.opensymphony.webwork.ServletActionContext;

public class SearchAction {

	private static Logger logger = Logger.getLogger(SearchAction.class.getName());

	public CjRoomCategoryVo cjroomcategory = new CjRoomCategoryVo();
	
	
	/**
	 * 获取房间分类接口
	 * @return JSON
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public String getcjcategory()  throws Exception {
		Map<String,String> catemap = RedIsService.getJedisByKey(CacheConstants.CJ_ROOM_CATEGORY);
		String returnstr = "";
		if(catemap==null || catemap.size()<=0){
			catemap.put("cj_room_category_101_0", "{'category_id':101,'name':'桂林','parent_id':0}");
			catemap.put("cj_room_category_1011_101", "{'category_id':1011,'name':'桂林s','parent_id':101}");
			catemap.put("cj_room_category_1012_101", "{'category_id':1012,'name':'桂林sf','parent_id':101}");
			catemap.put("cj_room_category_102_0", "{'category_id':102,'name':'桂林1','parent_id':0}");
			catemap.put("cj_room_category_1013_102", "{'category_id':1013,'name':'桂林sf','parent_id':102}");
		}
		List arrayList = new ArrayList(catemap.entrySet());
		Collections.sort(arrayList, new TariffMapComparator());   
		for(Iterator it = arrayList.iterator();it.hasNext();){
			Map.Entry<String,String> entry = (Map.Entry<String,String>)it.next();
			if(entry.getKey().endsWith("_0")){
				String tempstr = "'category':"+entry.getValue();
				String[] tp = entry.getKey().split("_");
				StringBuffer subtempstr = new StringBuffer("");
				for(Iterator subit = arrayList.iterator();subit.hasNext();){
					Map.Entry<String,String> subentry = (Map.Entry<String,String>)subit.next();
					if(subentry.getKey().endsWith("_"+tp[3])){
						subtempstr.append(subentry.getValue()+",");
					}
				}
			    String tempsubstr = subtempstr.toString();
			    if(tempsubstr.length()>0){
			    	tempsubstr = tempsubstr.substring(0, tempsubstr.length()-1);
			    }
			    tempsubstr = "'subcategory':["+tempsubstr+"]";
			    String tempcountstr = "{"+tempstr+","+tempsubstr+"}";
			    returnstr = returnstr + tempcountstr+",";
			}
		}
		returnstr = "["+returnstr.substring(0, returnstr.length()-1)+"]";
		cjroomcategory.setJsonstr(returnstr);
		return "cjcategory";
	}

	public CjRoomCategoryVo getCjroomcategory() {
		return cjroomcategory;
	}

	public void setCjroomcategory(CjRoomCategoryVo cjroomcategory) {
		this.cjroomcategory = cjroomcategory;
	}
	
	/**
	 * 分类排序
	 * @author WUZHENZHONG
	 *
	 */
	@SuppressWarnings({"unused", "unchecked"})
	private class TariffMapComparator implements Comparator{   
		  
        public int compare(Object o1, Object o2) {   
            Map.Entry<String,String> obj1 = (Map.Entry<String,String>)o1;   
            Map.Entry<String,String> obj2 = (Map.Entry<String,String>)o2;            
            return obj1.getKey().toString().compareTo(obj2.getKey().toString());   
       }   
    }     
	
}

 

1
1
分享到:
评论

相关推荐

    webwork-reference-2.2.2.pdf

    从给定的文件信息“webwork-reference-2.2.2.pdf”中,我们可以提炼出一系列与WebWork框架相关的IT知识点。以下是对这些知识点的详细解释: ### WebWork框架概览 WebWork是一个用于Java Web应用程序开发的轻量级...

    WebWork docs -- webWork 详细的说明文档

    webWork 详细的说明文档, 由于我的上传大小有限, 这个好东西我只能是分两次上传了, 下载的人可能要辛苦一些了, 不过这些都是值得的, 将&lt;&lt;WebWork docs 2 -- webWork 详细的说明文档&gt;&gt; 也一同下载下来, 下载后两个...

    webwork-1.4-src.zip_webwork_webwork s_webwork.zip_webwork1.4.zip

    在"webwork-1.4-src.zip"这个压缩包中,包含了WebWork1.4的源代码,这对于学习和理解WebWork的工作原理以及进行定制开发非常有帮助。 1. **MVC模式**:WebWork1.4遵循MVC架构,将应用程序分为模型、视图和控制器三...

    WebWork docs 2 -- webWork 详细的说明文档

    WebWork是一个基于Java的轻量级MVC(Model-View-Controller)框架,它为构建高性能、可维护的Web应用程序提供了强大的支持。WebWork docs 2 是一套完整的WebWork框架的详细说明文档,包含了开发者在使用WebWork时...

    webwork-tags-API

    WebWork-Tags API 是一个专为WebWork框架设计的标签库,它提供了丰富的标签来简化JSP页面中的Java代码,从而提升开发效率和代码可读性。WebWork是一个基于Action的MVC(模型-视图-控制器)架构的Java Web应用框架,...

    appfuse-light-webwork-spring-jdbc-1.8.2.zip_Java 8_appfuse_webwo

    在"appfuse-light-webwork-spring-jdbc-1.8.2.zip"这个压缩包中,我们能看到一个基于Java 8、WebWork、Spring和JDBC的项目实例。 **Java 8** Java 8是Java平台的重大更新,引入了许多新特性,如lambda表达式、函数...

    webwork JAR xalan-j_2_7_1-bin-2jars

    WebWork是一个古老的Java Web应用程序框架,它在早期的MVC(模型-视图-控制器)设计模式中扮演了重要角色。然而,这个问题涉及到的是在使用WebWork时遇到的一个特定问题,即TOMCAT与JDK之间的冲突。这个问题通常出现...

    webwork-spring-hibernate.rar_spring_webwork

    标题中的"webwork-spring-hibernate.rar_spring_webwork"暗示了这个压缩包涉及的是一个集成WebWork、Spring和Hibernate的项目。这三个框架是Java Web开发中的重要组件,分别负责不同的职责:WebWork(或Struts)是...

    WebWork_Result

    ### WebWork_Result 配置详解 #### 一、配置文件概览 在WebWork框架中,`WebWork_Result`配置文件对于控制应用的行为至关重要。它主要用于定义如何处理Action执行后的结果,包括页面跳转、数据传递等。本文将对...

    WebWork-2.1.7 中文开发文档-小白

    WebWork-2.1.7 中文开发文档-小白

    berkano-user-mgt-webwork-1.0.0-sources.jar

    官方版本,亲测可用

    webwork2实例源代码

    WebWork2是一个基于Java的MVC(模型-视图-控制器)框架,它在早期的J2EE开发中被广泛使用。本实例源代码提供了深入理解WebWork2工作原理和应用开发的机会。以下是对WebWork2核心知识点的详细阐述: 1. **MVC架构**...

    webwork-2.2.5源码包下载.txt

    ### WebWork-2.2.5源码包下载与解析 #### 一、WebWork框架简介 WebWork是一个开源的Java Web应用开发框架,它基于Java Servlet API,并且支持多种编程模型,包括MVC(Model-View-Controller)模式。WebWork框架的...

    Struts2-Webwork2-DWR

    Struts2、Webwork2 和 DWR 是三个在 Web 开发领域中至关重要的技术,尤其在构建企业级的 WEB2.0 应用程序时。接下来,我们将详细探讨这三个技术的核心概念、工作原理以及它们之间的关系。 **Struts2** 是一个基于 ...

    webwork2-spring.jar

    用于集成WebWork2.1和Spring的一个jar文件,编译级别jdk1.4, 已测试过,可以整合

    WebWork教程-0.90版

    解压后的主要文件包括`webwork-2.x.jar`(主要Jar包)、`webwork-example.war`(功能演示示例)、`webwork-migration.jar`(用于1.x到2.x迁移)及文档等。 2. **部署Web容器** 推荐使用稳定的**Tomcat 4.1**作为...

    Webwork Web开发框架

    - 类型转换:自动将用户输入转换为所需的数据类型。 - 表达式语言(OGNL):一种强大的表达式语言,用于数据访问。 - IoC容器:实现了依赖注入,简化了对象之间的耦合。 - **架构组成**:WebWork 2建立在Xwork之...

    webwork的jar包

    而`webwork-src-2.2.7.jar` 文件则包含了源代码,这对于开发者来说非常有用,因为可以方便地查看和学习框架的内部实现。 在WebWork 2.2.4+Spring+Hibernate的组合中,我们可以看到WebWork与两个其他流行框架的集成...

    webwork-2.1.6.jar

    webwork-2.1.6.jar

Global site tag (gtag.js) - Google Analytics