`
ronon
  • 浏览: 187096 次
  • 性别: Icon_minigender_2
  • 来自: 武汉
社区版块
存档分类
最新评论

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics