关于使用struts2注解配置,action返回json到IE8及以下浏览器接收为undefined的问题

最近在做一个平台网站,用的是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>


JAVA代码

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;
	}

}


JSP代码

<%@ 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>


这是我遇到的一个小小问题,希望可以帮助以后遇到类似问题的朋友......



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值