架構: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 的。