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


架構:struts2+JQuery

需求:就是前台請求后台,后台查詢數據庫,將數據轉換成json格式,使用struts2框架賦值給action內的變量jsonStr,前台通過 response.jsonStr 得到 json字符串,接着做相關操作。

 

    前端代碼:

   
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  的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM