天天看點

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屬性讓其自己處理循環,省事但是資料過于複雜的話會引起資料溢出或者效率低下。