最近在做一个平台网站,用的是SSH注解配置。在使用jquery的ajax向后台请求数据,后台返回JSON后在浏览器下接收出现了问题。
用火狐、谷歌、360、IE11浏览器测试都能正常的接收后台返回的JSON数据,然而再用IE8、7、6三个版本测试时,居然接收不到,一直提示undefined。当时纠结的要死,不断的度娘、google,但结果让人大跌眼镜,居然很少人遇到这问题,有那么一两个遇到类似问题的帖子也无满意答案结贴了。后来去找技术经理,因为项目框架是他搭建的,以为可以解决,没想到技术经理折腾了好久也没发现是哪儿出现了问题,最后就来了一句:自己百度!此刻的心情,你们懂的......
自己折腾了几天,实在没辙了,自己新搭建了个struts2项目就用来测试IE8接收返回JSON为undefined问题,搭建完后测试第一个DEMO,居然能正常接收,我欲哭无泪啊。慢慢的对比公司项目和自己搭建的项目到底哪些地方不对劲,后来终于发现在配置struts.xml的地方,公司项目多了以下三个配置:
<constant name="struts.objectFactory" value="spring" />
<constant name="struts.configuration.xml.reload" value="true" />
<constant name="struts.i18n.encoding" value="utf8" />
而我自己搭建的项目没写这三个,果断将公司项目的行面三行注释掉,运行-->测试-->结果...你们猜?IE8、7、6接收后台返回的JSON数据不再是undefined了,居然正常接收了,真是又喜又气...
不敢相信,又将注释的三行恢复后再测试,之前的问题又出项了,可恶的undefined
最后终于知道了问题是出现在 <constant name="struts.i18n.encoding" value="utf8" /> 这个配置上,将原来的改成 <constant name="struts.i18n.encoding" value="GBK" /> 或直接删掉后问题解决。
以下是测试代码,大家没事可以测试测试:
struts.xml配置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<constant name="struts.objectFactory" value="spring" />
<constant name="struts.configuration.xml.reload" value="true" />
<constant name="struts.i18n.encoding" value="utf8" /><!-- 注意:问题出现在这里,将value="utf8"改为value="GBK"或直接把这句删掉后解决了问题 -->
</struts>
web.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
</web-app>
package com.goldweb.action;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import com.goldweb.common.StrutsBaseAction;
import com.goldweb.model.UserModel;
import com.goldweb.service.IUserService;
@SuppressWarnings("serial")
@Controller
@ParentPackage("json-default")
@Namespace("/user")
public class UserAction extends StrutsBaseAction {
// 消息内容
private String msg = "";
// 操作是否成功
private Boolean isOk = false;
@Autowired
private IUserService userService;
// 用户数据
private UserModel user;
/**
* /user/userLogin.action <br/>
* 用户登录 <br/>
* 所需参数:uname, upswd
*
* @return
*/
@Action(value = "userLogin", results = { @Result(name = "success", type = "json", params = {
"includeProperties", "isOk,msg" }) }, params = { "contentType", "text/html" })
public String userLogin() {
user = userService.userLogin(getuLoginName(), getuLoginPswd());
if (user != null) {
isOk = true;
msg = "用户登录成功!";
}
msg = "用户名或密码错误!";
return SUCCESS;
}
public String getMsg() {
return msg;
}
public Boolean getIsOk() {
return isOk;
}
public UserModel getUserModel() {
return user;
}
}
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>用户登录</title>
<script src="js/jquery.js" type="text/javascript"></script>
<script src="js/jquery.validate.js" type="text/javascript" ></script>
<script type="text/javascript">
$(function() {
$('#login_btn').click(function(){
$.ajax({
type : 'POST',
url : 'user/userLogin.action',
data : $('form#userLoginForm').serialize(),
cache : false,
beforeSend : function() {
$('#login_btn').val("登陆中...");
$('#login_btn').css('disabled', true);
},
success : function(data) {
alert(data);
if (data.isOk) {
$('#login_error_msg').html("登陆成功");
} else {
$('#login_error_msg').html(data.msg).css('color', 'red');
}
}
});
});
});
</script>
</head>
<body>
<fieldset style="width:500px; margin:0 auto;">
<legend>用户登陆</legend>
<form id="userLoginForm" method="post" action="">
<div id="login_error_msg" style="display: none;"></div>
<p>
<label>
用户名:
<input id="uname" name="uname" type="text" />
</label>
</p>
<p>
<label>
密码:
<input id="upswd" name="upswd" type="password" />
</label>
</p>
<p>
<input type="button" value="登陆" id="login_btn"/>
</p>
</form>
</fieldset>
</body>
</html>