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

  • 相关阅读:
    如何在linux系统中设置静态ip地址
    spring 学习
    java 反射机制和invoke方法
    CentoS7装机
    eclipse 添加jar包的方式
    No-args constructor for class does not exist. Register an InstanceCreator with G
    freemarker页面如何获取绝对路径basePath
    MySQL备份还原
    MySQL用户授权与权限
    CentOS7修改SSH远程连接端口
  • 原文地址:https://www.cnblogs.com/xcxcxcxc/p/5541139.html
Copyright © 2011-2022 走看看