AJAX responseXML返回为空

时间:2022-10-13 15:28:27
初学AJAX,想实现JS接收Struts1.2 Action中动态生成的XML文档,可是总为空,不知道怎么解决啊

XMLHttpRequest.responseXML 空
XMLHttpRequest.responseText 很好的获取服务端返回的XML数据

很多资料都说设置 response.setContentType("text/xml");

我都设置了,可是
XMLHttpRequest.responseXML还是为空,不知道如何解决


Action代码:


public ActionForward responseAjaxRequest(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception
{
response.setContentType("text/xml;charset=gb2312");
StringBuffer stringBuffer = new StringBuffer();

stringBuffer.append("<?xml version='1.0' encoding='gb2312'?>");
stringBuffer.append("\n");
stringBuffer.append("<books>");
stringBuffer.append("\n");
stringBuffer.append("<book>Struts开发基础</book>");
stringBuffer.append("\n");
stringBuffer.append("<book>Hibernate开发基础</book>");
stringBuffer.append("\n");
stringBuffer.append("<book>Spring开发基础</book>");
stringBuffer.append("\n");
stringBuffer.append("</books>");

String xmlFile = stringBuffer.toString();
PrintWriter printWriter = response.getWriter();
printWriter.write(xmlFile);
printWriter.flush();
printWriter.close();

return null;
}




14 个解决方案

#1


先简单点测试啊
printWriter.write("<ok>ok</ok>");试试能否返回,再判断是否是编码问题

#2


测试过了,不是编码问题,即

如果我不设置 response.setContentType("text/xml;charset=gb2312");
XML文档中存在中文时
responseText中会出现乱码 
responseXML还是为空

设置 response.setContentType("text/xml;charset=gb2312");
responseText中打印出来的XML正常
responseXML还是为空

#3


也觉得是编码问题  你jsp的编码是怎么样的?

#4


var xmlContent = getXmlHttpRequestObject();
alert(xmlContent);
不知道这么写可以不

#5


这么写
var searchReq = getXmlHttpRequestObject();
searchReq.open("GET", url, true);(这个url你是的.do)
 searchReq.onreadystatechange = handleSearchSuggest; 
searchReq.send(null);

然后你在handleSearchSuggest这个方法里去得到返回值。searchReq.responseText可以返回一个文本

#6



stringBuffer.append("<?xml version='1.0' encoding='gb2312'?>");
很可能是这里有错误,encoding='gb2312'你设成utf-8的试试看。

#7


你在ie里测试的还是其他浏览器?
你确认输出的都是上面的xml部分,而没有其他如:<html>标签等?

#8


你返回的xml没有什么问题···那就是你页面调用ajax的问题了~参考下面的例子改改看
var req;
function Change_Select() {
var url = "";
if (window.XMLHttpRequest) {
req = new XMLHttpRequest();
} else if (window.ActiveXObject) {
req = new ActiveXObject("Microsoft.XMLHTTP");
}

if (req) {
req.open("GET", url, true);
req.onreadystatechange = callback;
req.send(null);
}

}
function callback() {
if (req.readyState == 4) {
if (req.status == 200) {
parseMessage();
} else {
alert("Not able to retrieve description" + req.statusText);
}
}
}

function parseMessage() {
var xmlDoc = req.responseXML;

}

#9


ajax返回的编码应该是UTF-8
response.setContentType("text/xml;utf-8");
response.setHeader("Cache-Control ", "no-cache");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();

#10


都测试过了,真的不行呢,不知道什么原因!

把代码贴出来:

StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("<?xml version='1.0' encoding='UTF-8'?>");
stringBuffer.append("root");
stringBuffer.append("<book>Java开发基础</book>");
stringBuffer.append("<book>Java开发基础</book>");
stringBuffer.append("<book>Java开发基础</book>");
stringBuffer.append("/root");

String xmlFile = stringBuffer.toString();
response.setHeader("Cache-Control ", "no-cache");
response.setContentType("text/xml;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
PrintWriter printWriter = response.getWriter();
printWriter.write(xmlFile);
printWriter.flush();
printWriter.close();

return null;


HTML部分:

if (xmlHttp == null)
{
// 创建 xmlHttp 对象
createXMLHttpRequest();
}

// 通过timestamp="+new Date().getTime();使得每次发送的URL不同,强制浏览器刷新
var url = "site.ajax.linkage.do?method=responseCompRequest&timestamp=" + new Date().getTime();

xmlHttp.open("post", url, true);
xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
xmlHttp.onreadystatechange = function(){deptListCallback(compID);};
xmlHttp.send(null);

function deptListCallback(id)
{
if (xmlHttp.readyState == 4)
{
if(xmlHttp.status == 200)
{
processServerResponseForDeptMessage();
}
}
}

function processServerResponseForDeptMessage()
{
var xmlRead = xmlHttp.responseXML();
alert("xmlRead" + xmlRead);
}


然后,IE7.0显示 object does't support this property or method

#11


但是,这段代码:

function processServerResponseForDeptMessage()
{
    var xmlRead = xmlHttp.responseXML();
    alert("xmlRead" + xmlRead);
}



换为 

var xmlRead = xmlHttp.responseText;
alert("xmlRead" + xmlRead);

的时候,上面 stringBuffer的内容就打印出来.

#12


呵呵,不好意思,上面

var xmlRead = xmlHttp.responseXML();

弄错了,多了后面的括号,

然后就是把括号去掉后,xmlRead 打印出来为空
改为 var xmlRead = xmlHttp.responseText;

xmlRead 打印出上面 stringBuffer的内容.

#13


问题解决了吗?? 同样情况,急~~

#14


引用 8 楼 fancy161 的回复:
你返回的xml没有什么问题···那就是你页面调用ajax的问题了~参考下面的例子改改看
Java code
var req;
function Change_Select() {
    var url = "";
    if (window.XMLHttpRequest) {
        req = new XMLHttpRequest();
    } else if (windo……


我也遇到过同样的问题,可以得到responseText,而responseXML为空。看到了8楼的回答,大受启发,检查了调用ajax的语句,发现了一句
if (ajaxReq.overrideMimeType) {
            ajaxReq.overrideMimeType('text/xml');
        }
于是注释掉,再运行,就OK了!
谢谢8楼的意见,也希望对大家都有用啦

#1


先简单点测试啊
printWriter.write("<ok>ok</ok>");试试能否返回,再判断是否是编码问题

#2


测试过了,不是编码问题,即

如果我不设置 response.setContentType("text/xml;charset=gb2312");
XML文档中存在中文时
responseText中会出现乱码 
responseXML还是为空

设置 response.setContentType("text/xml;charset=gb2312");
responseText中打印出来的XML正常
responseXML还是为空

#3


也觉得是编码问题  你jsp的编码是怎么样的?

#4


var xmlContent = getXmlHttpRequestObject();
alert(xmlContent);
不知道这么写可以不

#5


这么写
var searchReq = getXmlHttpRequestObject();
searchReq.open("GET", url, true);(这个url你是的.do)
 searchReq.onreadystatechange = handleSearchSuggest; 
searchReq.send(null);

然后你在handleSearchSuggest这个方法里去得到返回值。searchReq.responseText可以返回一个文本

#6



stringBuffer.append("<?xml version='1.0' encoding='gb2312'?>");
很可能是这里有错误,encoding='gb2312'你设成utf-8的试试看。

#7


你在ie里测试的还是其他浏览器?
你确认输出的都是上面的xml部分,而没有其他如:<html>标签等?

#8


你返回的xml没有什么问题···那就是你页面调用ajax的问题了~参考下面的例子改改看
var req;
function Change_Select() {
var url = "";
if (window.XMLHttpRequest) {
req = new XMLHttpRequest();
} else if (window.ActiveXObject) {
req = new ActiveXObject("Microsoft.XMLHTTP");
}

if (req) {
req.open("GET", url, true);
req.onreadystatechange = callback;
req.send(null);
}

}
function callback() {
if (req.readyState == 4) {
if (req.status == 200) {
parseMessage();
} else {
alert("Not able to retrieve description" + req.statusText);
}
}
}

function parseMessage() {
var xmlDoc = req.responseXML;

}

#9


ajax返回的编码应该是UTF-8
response.setContentType("text/xml;utf-8");
response.setHeader("Cache-Control ", "no-cache");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();

#10


都测试过了,真的不行呢,不知道什么原因!

把代码贴出来:

StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("<?xml version='1.0' encoding='UTF-8'?>");
stringBuffer.append("root");
stringBuffer.append("<book>Java开发基础</book>");
stringBuffer.append("<book>Java开发基础</book>");
stringBuffer.append("<book>Java开发基础</book>");
stringBuffer.append("/root");

String xmlFile = stringBuffer.toString();
response.setHeader("Cache-Control ", "no-cache");
response.setContentType("text/xml;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
PrintWriter printWriter = response.getWriter();
printWriter.write(xmlFile);
printWriter.flush();
printWriter.close();

return null;


HTML部分:

if (xmlHttp == null)
{
// 创建 xmlHttp 对象
createXMLHttpRequest();
}

// 通过timestamp="+new Date().getTime();使得每次发送的URL不同,强制浏览器刷新
var url = "site.ajax.linkage.do?method=responseCompRequest&timestamp=" + new Date().getTime();

xmlHttp.open("post", url, true);
xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
xmlHttp.onreadystatechange = function(){deptListCallback(compID);};
xmlHttp.send(null);

function deptListCallback(id)
{
if (xmlHttp.readyState == 4)
{
if(xmlHttp.status == 200)
{
processServerResponseForDeptMessage();
}
}
}

function processServerResponseForDeptMessage()
{
var xmlRead = xmlHttp.responseXML();
alert("xmlRead" + xmlRead);
}


然后,IE7.0显示 object does't support this property or method

#11


但是,这段代码:

function processServerResponseForDeptMessage()
{
    var xmlRead = xmlHttp.responseXML();
    alert("xmlRead" + xmlRead);
}



换为 

var xmlRead = xmlHttp.responseText;
alert("xmlRead" + xmlRead);

的时候,上面 stringBuffer的内容就打印出来.

#12


呵呵,不好意思,上面

var xmlRead = xmlHttp.responseXML();

弄错了,多了后面的括号,

然后就是把括号去掉后,xmlRead 打印出来为空
改为 var xmlRead = xmlHttp.responseText;

xmlRead 打印出上面 stringBuffer的内容.

#13


问题解决了吗?? 同样情况,急~~

#14


引用 8 楼 fancy161 的回复:
你返回的xml没有什么问题···那就是你页面调用ajax的问题了~参考下面的例子改改看
Java code
var req;
function Change_Select() {
    var url = "";
    if (window.XMLHttpRequest) {
        req = new XMLHttpRequest();
    } else if (windo……


我也遇到过同样的问题,可以得到responseText,而responseXML为空。看到了8楼的回答,大受启发,检查了调用ajax的语句,发现了一句
if (ajaxReq.overrideMimeType) {
            ajaxReq.overrideMimeType('text/xml');
        }
于是注释掉,再运行,就OK了!
谢谢8楼的意见,也希望对大家都有用啦