日期:2014-05-16  浏览次数:20429 次

Struts2.x配合JSON和JQuery使用的简单实例
昨天一朋友问我一个关于JSON的问题,他是用Hibernate查询出2个实体对象(存在一对多的关系),然后放到Map集合中,最后再把Map放在List集合中。在调用JSON的
JSONArray.fromObject
方法时,出现
net.sf.json.JSONException: There is a cycle in the hierarchy

异常。在网上一顿狂查之后得知 是:“由于Hibernate中好多实体类都级联关系,也就是某个类,出现了别的类的引用对象充当属性。那么这样的话用JSON来进行处理会出现嵌套的异常”
看代码吧!
请求的JS代码如下:
$(document).ready(function(){
$("#submitRe").click(function(){
	$.post("loginAction.action",null,callback)
})

callback=function(jsonData,textStats){
	if("success"==textStats){
		alert(jsonData);
	}
}
})

处理请求类的Java代码为:
package com.accp.firststruts2.actions;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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

import net.sf.json.JSONArray;
import net.sf.json.JsonConfig;
import net.sf.json.util.CycleDetectionStrategy;

import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;

import com.accp.firststruts2.dto.Users;
import com.opensymphony.xwork2.ActionSupport;
/**
 * 
 * @author softceo945
 *
 */
public class LoginAction extends ActionSupport implements  ServletRequestAware,ServletResponseAware{

	private static final long serialVersionUID = -6884393637128187643L;
	HttpServletRequest request = null;
	HttpServletResponse response = null;

	public void setServletRequest(HttpServletRequest request) {
		this.request = request;
	}

	public void setServletResponse(HttpServletResponse response) {
		this.response = response;
	}
	
	public String execute() throws Exception {
		List<Map<String,Object>> listAll = new ArrayList<Map<String,Object>>();//最终返回的数据集合
		String str ="";//JSON文本
		for (int i = 0; i < 10; i++) {
			Users users  = new Users();
			users.setUsername("Users "+i);
			users.setPsd(Math.random()+"");
			users.setAge(i+15);
			users.setSex('男');
			
			Map<String,Object> a = new HashMap<String, Object>();
			a.put(users.getUsername(), users);
			listAll.add(a);
		}
		str=JSONArray.fromObject(listAll).toString();
		//如果存在关联关系映射,即N-M,或M-M时,调用下面的代码来处理,时间关系,本文就没建立N-M,或M-M关系了
//		JsonConfig config = new JsonConfig();        
//		config.setIgnoreDefaultExcludes(false);           
//		config.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);    
//		JSONArray JsonArr=JSONArray.fromObject(listAll, config);   
//		str=JsonArr.toString();   

		response.getWriter().write(str);
		return null;
	}
}

重点代码为:
//如果存在关联关系映射,即N-M,或M-M时,调用下面的代码来处理,时间关系,本文就没建立N-M,或M-M关系了
//		JsonConfig config = new JsonConfig();        
//		config.setIgnoreDefaultExcludes(false);           
//		config.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);      
//		JSONArray JsonArr=JSONArray.fromObject(listAll, config);   
//		str=JsonArr.toString();   

设置JSON-LIB的setCycleDetectionStrategy属性让其自己处理循环,省事但是数据过于复杂的话会引起数据溢出或者效率低下。