1. 程式人生 > >Ajax 傳遞json字串到客戶端時報 Internal server error

Ajax 傳遞json字串到客戶端時報 Internal server error

   
jQuery.ajax({
			url: 'business/xxxx!xxxx.action',
			data: 'id='+id,
			type: 'POST',
			dataType:"json",
			beforeSend: function() {
				            
			},
			error: function(XMLHttpRequest, textStatus, errorThrown) {
			       alert(errorThrown);//前臺打出:internal server error
                            alert(request.status);//前臺打出: 500
                            alert(request.readyState);//前臺打出:4
                            alert(textStatus);//前臺打出: 空字串
	             				                	
			},
			success: function(response) {
				var jsonObj = eval("("+response.jsonStr+")");
            }
});
 

    後端關鍵程式碼(省略查資料庫的部分,很簡單,就是將轉換好的json字串賦值給Action裡的某個變數):

this.setJsonStr(jsonStr);

問題來了,

當jsonStr資料內的某個屬性值比較大的時候,在這個案例裡是超出了3000個字元(一箇中文算三個字元),

而且含有大量中文時,前端會報錯,注意,是“資料大“+”大量中文“這兩個條件同時滿足才會出現該問題。

總之,這種情況下就前臺就會打出internal server error ,錯誤碼是500。

按理說3000多個字元並不大,並且所謂的大量中文,算了下大概佔1800個字元吧(乘以3之後),

目前還不知道根本原因是什麼。有知道的歡迎留言~

解決方案:

前端-->ajax請求的dataType改為: ”text", 

           獲取json物件改為:var jsonObj = eval("("+response+")");

後端-->  把方法的返回值從String改為 void,簡單的說就是不用struts2自帶的傳值方式,關鍵程式碼如下:

    this.getServletResponse().setContentType("text/html;charset=UTF-8");  
    super.getServletResponse().getWriter().write(jsonStr);  

 當然規範的寫法最後是要關掉/釋放 PrintWriter  的。