首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

为什么小弟我的 XMLHttpReq.readyState 总是返回1

2012-01-02 
为什么我的 XMLHttpReq.readyState 总是返回1不知道为什么XMLHttpReq.readyState 总是等于1我想实现这样一

为什么我的 XMLHttpReq.readyState 总是返回1
不知道为什么XMLHttpReq.readyState 总是等于1 
我想实现这样一个功能:
进入页面时,页面先加载一个javascript函数,自动调用一个struts 里面的action连接数据库 拿到数据库里面的值
并把值返回页面填充到下拉列表中.
下面是我的相关代码,不知道那里出错了,我也有一个不解的地方,我在返回那个页面以后那个页面还是重新加载,还是在去调用javascript函数,是不是死循环了?
希望大家帮我看一下!应该怎么解决?谢谢
 <script type="text/javascript"> 
  
  var XMLHttpReq;
  var targetSeId;
  function createXMLHttpRequest(){  
  if(window.XMLHttpRequest) {//Mozilla 
  XMLHttpReq=new XMLHttpRequest();  
  }else if(window.ActiveXObject){//IE 浏览器 
  try { 
  XMLHttpReq=new ActiveXObject("Msxml2.XMLHTTP "); 
   
  } catch (e){ 
  try{ 
  XMLHttpReq=new ActiveXObject("Micrsost.XMLHTTP ");
  }catch(e){} 
  } 
  }  
  if(!XMLHttpReq){
  alert("无法创建 XMLHttpRequest 对象!");
  } 
  }
  function loadfirst(){  
  alert("开始加载...");
  var url="http://localhost:8080/IsfotMycar1/loadBrand.do";  
  createXMLHttpRequest();  
  if(XMLHttpReq){
  XMLHttpReq.open("GET",url,true);
  alert("open");
  XMLHttpReq.onreadystatechange=loadcallback();
  XMLHttpReq.send(null);
  }
  }  
  function loadcallback(){
  alert("回调..");
  alert(XMLHttpReq.readyState);
  if(XMLHttpReq.readyState==4){
  if(XMLHttpReq.status==200){
  parseMessage2();
  }else{
  alert("返回不正常"+XMLHttpReq.statusText);
  }
  }
  }
  function parseMessage2(){
  var xmlDoc=XMLHttpReq.responseXML.documentElement;  
  var xSel=xmlDoc.getElementsByTagName('select');  
  var select_root=document.getElementById('select1');
  select_root.options.length=1;
  for(var i=0;i<xSel.length;i++){
  var xValue=xSel[i].childNodes[0].firstChild.nodeValue;  
  var xText=xSel[i].childNodes[1].firstChild.nodeValue;  
  select_root.options[i+1]=new Option(xText,xValue);
  }
  }
 </script>

<body onload="loadfirst()">
  <form action="/inquireScar.do" method="post">
  请选择品牌:<select id="select1" >
  <option value="">请选择--</option>
  </select>
</form>
</body>


=============================================================================
action 类:

public class LoadBrandAction extends Action {
/*
* Generated Methods
*/

/** 
* Method execute
* @param mapping
* @param form
* @param request
* @param response
* @return ActionForward
*/
private SecCarService secCarServiceImpl;
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
response.setContentType("text/xml");
response.setHeader("Cache-Control", "no-cache");
List list=secCarServiceImpl.getAllCar();
System.out.println("list的值:"+list);
if(list!=null){
StringBuffer xml=new StringBuffer("<selects>");


for(Object s : list){
System.out.println("品牌:"+((SecCarSell)s).getSecCarBrand());
xml.append("<select><value>"+((SecCarSell)s).getSecCarBrand()+"</value><text>"+((SecCarSell)s).getSecCarBrand()+"</text></select>");
}
xml.append("</selects>");
try {
response.setContentType("text/xml;charset=gb2312");
response.getWriter().write(xml.toString());
System.out.println("成功返回!");
} catch (IOException e) {
e.printStackTrace();
}
}
return mapping.findForward("secfind");//跳到显示下拉列表页面
}
public void setSecCarServiceImpl(SecCarService secCarServiceImpl) {
this.secCarServiceImpl = secCarServiceImpl;
}
}

[解决办法]
lz提到了返回值,可以把返回值得的几种状态给lz说一下:

readyState有五种可能的值:
0 (未初始化): (XMLHttpRequest)对象已经创建,但还没有调用open()方法。
1 (载入):已经调用open() 方法,但尚未发送请求。
2 (载入完成): 请求已经发送完成。
3 (交互):可以接收到部分响应数据。
4 (完成):已经接收到了全部数据,并且连接已经关闭。

readyState 状态 状态说明
 
(0)未初始化
 此阶段确认XMLHttpRequest对象是否创建,并为调用open()方法进行未初始化作好准备。值为0表示对象已经存在,否则浏览器会报错--对象不存在。
 
(1)载入
 此阶段对XMLHttpRequest对象进行初始化,即调用open()方法,根据参数(method,url,true)完成对象状态的设置。并调用send()方法开始向服务端发送请求。值为1表示正在向服务端发送请求。
 
(2)载入完成
 此阶段接收服务器端的响应数据。但获得的还只是服务端响应的原始数据,并不能直接在客户端使用。值为2表示已经接收完全部响应数据。并为下一阶段对数据解析作好准备。
 
(3)交互
 此阶段解析接收到的服务器端响应数据。即根据服务器端响应头部返回的MIME类型把数据转换成能通过responseBody、responseText或responseXML属性存取的格式,为在客户端调用作好准备。状态3表示正在解析数据。
 
(4)完成
 此阶段确认全部数据都已经解析为客户端可用的格式,解析已经完成。值为4表示数据解析完毕,可以通过XMLHttpRequest对象的相应属性取得数据。
 
概而括之,整个XMLHttpRequest对象的生命周期应该包含如下阶段:

创建-初始化请求-发送请求-接收数据-解析数据-完成


[解决办法]
还有,你action类里return null 就可以了。不需要后面的那个,要不然可能造成死循环了

热点排行