`
ronon
  • 浏览: 192772 次
  • 性别: 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  的。

分享到:
评论

相关推荐

    Jquery Ajax Error 调试错误的技巧

    `error`通常是服务器返回的错误信息字符串。 除了`error`事件,还有一些其他参数可以帮助我们调试Ajax请求: 1. **`beforeSend`**:在发送请求之前调用,可以用来预处理xhr对象,例如设置自定义头信息。 2. **`...

    jQuery中ajax错误调试分析

    `error` 回调函数接收三个参数:`jqXHR` 对象、`textStatus` 字符串和 `errorThrown` 错误对象。`jqXHR` 是一个基于 Promise 的对象,具有 `readyState`、`status`、`statusText` 和 `responseText` 等属性,这些...

    使用ajax跨域调用springboot框架的api传输文件

    然后,通过`FormData`对象将这个对象序列化为JSON字符串,并附加到文件一起发送。`FormData`对象用于存储键值对,特别适合于上传文件。这里的`contentType`和`processData`设置为`false`是为了防止jQuery尝试处理或...

    AJAX(XMLHttpRequest.status)状态码

    9. data:发送到服务器的数据,可以是对象、字符串等,GET请求会将数据附加到URL上。 10. dataType:预期服务器返回的数据类型,例如"xml"、"html"、"json"、"jsonp"等。 11. error:请求失败时调用的回调函数,有三...

    东哥面试题.md

    - **5xx系列**:表示服务器错误状态码,如500 Internal Server Error(服务器内部错误)、501 Not Implemented(功能未实现)。 这些状态码有助于客户端了解请求的处理情况,并采取相应的后续操作。 #### 3. 如何...

    java面试总结

    - **500 Internal Server Error**: 服务器内部错误。 - **503 Service Unavailable**: 服务器暂时不可用。 #### 四十一、协议以及默认的端口号 - **HTTP**: 默认端口80。 - **HTTPS**: 默认端口443。 - **FTP**: ...

    21春南开大学《网络爬虫与信息提取》在线作业参考答案.docx

    - **500 Internal Server Error**: 服务器遇到了不可预期的情况,无法完成请求。 - **503 Service Unavailable**: 服务器目前无法使用(由于超载或停机维护)。 - **403 Forbidden**: 请求被禁止。 - **404 Not ...

    ExtAspNet_v2.3.2_dll

    -Window的Target属性由字符串类型变为枚举类型,注意更新以前的代码:Target="_self" -> Target="Self", Target="_parent" -> Target="Parent"。 -MenuButton, LinkButton, Button, LinkButtonField的...

    ExtAspNet v2.2.1 (2009-4-1) 值得一看

    -Window的Target属性由字符串类型变为枚举类型,注意更新以前的代码:Target="_self" -> Target="Self", Target="_parent" -> Target="Parent"。 -MenuButton, LinkButton, Button, LinkButtonField的...

    java面试知识

    - **out**:输出流对象,用于输出内容到客户端。 - **session**:用户会话对象。 - **application**:应用程序范围对象。 - **config**:Servlet配置对象。 - **exception**:异常对象,在错误处理页面中可用。 ###...

    前端笔试面试题目总结.docx编程资料

    - **JSON**:JavaScript Object Notation,一种轻量级的数据交换格式,只支持服务器到客户端的单向数据传递。 - **JSONP**:JSON with Padding,一种跨域数据交互协议,允许服务器将数据封装在客户端提供的回调函数...

    前端开发面试题(含答案)

    - **状态码**: 200 OK、404 Not Found、500 Internal Server Error等。 **2. 安全** - **HTTPS**: 通过SSL/TLS加密传输数据。 - **CORS**: 跨域资源共享。 - **CSRF**: 跨站请求伪造。 **3. 正则表达式** - **...

Global site tag (gtag.js) - Google Analytics