zoukankan      html  css  js  c++  java
  • 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  的。

  • 相关阅读:
    ubuntu下环境变量
    Linux/Unix里,ln -s
    ubuntu安装和查看已安装
    Android系统中 setprop,getprop,watchprops命令的使用
    js中Math.random()生成指定范围数值的随机数
    mysql下sql语句 update 字段=字段+字符串
    铁道部2012年版全国72个铁路枢纽城市
    phprpc 使用实例(例实没错却不能执行)函数冲突gzdecode
    电脑开机一直蓝屏,一直重启要怎么办?
    电脑重装系统重装不了,老是蓝屏,是不是硬盘烧坏了!
  • 原文地址:https://www.cnblogs.com/xcxcxcxc/p/5541139.html
Copyright © 2011-2022 走看看