<script language="javascript" type="text/javascript">
   window.setTimeout("refresh();",3000);
   var req;
   function refresh(){
    var actionType=document.all.actionType.value;
    var currentPageNo=document.all.currentPageNo.value;
    
    var url="channelList.do?actionType="+actionType+"&currentPageNo="+currentPageNo;
    if(window.XMLHttpRequest){
     req=new XMLHttpRequest();
     req.onreadystatechange = callback;
     try {
        req.open("POST", url, true);
     } catch (e) {
     }
     req.send(null);
    }else if(window.ActiveXObject){
     req=new ActiveXObject("MIcrosoft.XMLHttp");
     if (req) {
        req.onreadystatechange = callback;
        req.open("POST", url, true);
        req.send();
     }
    }
    window.setTimeout("refresh();",3000);
   }
   function callback(){
    if(req.readyState==4){
     if(req.status==200){
      parseMessage();
     }
     else{
      //alert("not able to retrive decription:"+req.statusText);
     }
    }
    
   }
   function parseMessage(){
    var htmlStr="<table width=\"950\" align=\"center\" class=\"table_c\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">";
    htmlStr=htmlStr+"<tr class=\"h_tr\">";
htmlStr=htmlStr+"<td class=\"border_all\">&nbsp;</td>";
htmlStr=htmlStr+"</tr>";
    <%
  List channels=(List)request.getAttribute("searchResult");
  if(channels.size()>0){
    Iterator it=channels.iterator();
    while(it.hasNext()){
      ResChannel channel=(ResChannel)it.next();
      String htmlTemp="<tr>";
      htmlTemp=htmlTemp+"<td class=\\\"border_lbr\\\"><input type=\\\"checkbox\\\" name=\\\"selectItems\\\" value=\\\""+channel.getChannel()+"\\\"/></td>";
  htmlTemp=htmlTemp+"</tr>";
%>
htmlStr=htmlStr+"<%=htmlTemp%>";
//alert(htmlStr);
<%
    }
  }
    %>
    htmlStr=htmlStr+"</table>";
    document.all.contents.innerHTML=htmlStr;
   }
  
  </script>上面的刷新处理中,channels的值都正常的,但生成的htmlStr串却不会更新,请问这个是怎么回事?

解决方案 »

  1.   

    这代码让你传的,够可以的了。呵呵,你到数据库里面查查有没有多记录,currentPageNo值有没有变,是不是一直都是同一页的记录,所以你感觉是没变的
      

  2.   

    楼上说的情况可以排除我这个功能是监视内存中对象的值,对象的值都在变,并且上面的程序都可以接收到随变化的值(就是上面的channels----我用Debug知道的),但document.all.contents.innerHTML=htmlStr;写的内容却奇怪的不会改变,气死我了.
      

  3.   

    你htmlStr接受服务器反馈的地方在哪 
      

  4.   

    跟服务器反馈没关系,返回的信息(channels)都可以收到,就是document.all.contents.innerHTML=htmlStr;不出来.
      

  5.   


    取消页面缓存试试: 
    在jsp页面中加入 
    <meta   http-equiv="Pragma"   content="no-cache">   
    <meta   http-equiv="Cache-Control"   content="no-cache">   
    <meta   http-equiv="Expires"   content="0"> 在servlet中 
      response.setHeader("Cache-Control","no-cache"); 
      response.set   Header("Pragma","no-cache"); 
      response.setDateHeader("Expires",   0); 
      

  6.   

    你在ajax请求的url中加个随机数,用来清楚缓存,这样ajax每次都回去请求,否则有可能他只请求了一次就缓存在那里不请求了。
      

  7.   

    K_pax 所说的也没能解决kokobox 我曾试过用生成的当前时间作为URL的参数,但也不行.
      

  8.   

    JSP页面上的代码,综合大家提至的解决方法,试了都不通过,我也怀疑<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">这个W3C的头,可去掉也无济于事,然而Debug时,可以看到channels在迭代器迭代时值在变化.但依然看不到内容随之更新.
    我快被这个问题折腾死了.<%@page language="java" pageEncoding="GBK"%>
    <%@ page import="********不方便写明*******"%>
    <%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%>
    <%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>
    <%@ taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic"%>
    <%@ taglib uri="http://jakarta.apache.org/struts/tags-tiles" prefix="tiles"%>
    <%@ taglib uri="http://jakarta.apache.org/struts/tags-template" prefix="template"%>
    <%@ taglib uri="http://jakarta.apache.org/struts/tags-nested" prefix="nested"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html:html>
    <head>
    <title>Channel列表</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">

    <link rel="stylesheet" type="text/css" href="css/style.css" />
    <SCRIPT language=JavaScript src="js/common.js"></SCRIPT>
    </head>

      <script language="javascript" type="text/javascript">
       //window.setTimeout("refresh();",3000);
       var req;
       function refresh(){
        var actionType=document.all.actionType.value;
        var currentPageNo=document.all.currentPageNo.value;
        var curTime=(new Date()).getTime();
        //alert(curTime);
        
        var url="channelList.do?actionType="+actionType+"&currentPageNo="+currentPageNo+"&curTime="+curTime;
        //alert(url);
        if(window.XMLHttpRequest){
         req=new XMLHttpRequest();
         req.onreadystatechange = callback;
         try {
            req.open("GET", url, true);
         } catch (e) {
            //alert(e);
         }
         req.send(null);
        }else if(window.ActiveXObject){
         req=new ActiveXObject("MIcrosoft.XMLHttp");
         if (req) {
            req.onreadystatechange = callback;
            req.open("GET", url, true);
            req.send();
         }
        }
        window.setTimeout("refresh();",3000);
       }
       function callback(){
        if(req.readyState==4){
         if(req.status==200){
          parseMessage();
         }
         else{
         }
        }
        
       }
       function parseMessage(){  
        var htmlStr="<table width=\"950\" align=\"center\" class=\"table_c\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">";
        htmlStr=htmlStr+"<tr class=\"h_tr\">";
    htmlStr=htmlStr+"<td class=\"border_all\">&nbsp;</td>";
    htmlStr=htmlStr+"<td class=\"border_trb\">Channel</td>";
    htmlStr=htmlStr+"</tr>";
    var eDIV="";
        <%
      List channels=(List)request.getAttribute("searchResult");
      int i=0;
      if(channels.size()>0){
        Iterator it=channels.iterator();
        while(it.hasNext()){
          ResChannel channel=(ResChannel)it.next();
          String htmlTemp="<tr>";
          htmlTemp=htmlTemp+"<td class=\\\"border_lbr\\\"><input type=\\\"checkbox\\\" name=\\\"selectItems\\\" value=\\\""+channel.getChannel()+"\\\"/></td>";
          htmlTemp=htmlTemp+"<td class=\\\"border_rb\\\"><a href=\\\"channelList.do?channel="+channel.getChannel()+"&actionType=view\\\">"+channel.getChannel()+"</a></td>";
      
      htmlTemp=htmlTemp+"</tr>";
    %>
    eDIV = document.createElement("div");
    eDIV.setAttribute("id","myDiv<%=i%>");
    // add the text to the div with createTextNode
    eDIV.appendChild(document.createTextNode("<%=channel.getChannel()%>"));
    //htmlStr=htmlStr+"<tr>";
    //htmlStr=htmlStr+"<td class=\"border_lbr\"><input type=\"checkbox\" name=\"selectItems\" value=\"<%=channel.getChannel()%>\"/></td>";
    //htmlStr=htmlStr+"<td class=\"border_rb\"><a href=\"channelList.do?channel=<%=channel.getChannel()%>&actionType=view\"><%=channel.getChannel()%></a></td>";
    //htmlStr=htmlStr+"</tr>";
    htmlStr=htmlStr+"<%=htmlTemp%>";
    //alert(htmlStr);
    <%
        }
      }
        %>
        if(eDIV!="")
         document.all.mContainer.appendChild(eDIV);
        //document.getElementById("mContainer").appendChild(eDIV);
        htmlStr=htmlStr+"</table>";
        document.all.contents.innerHTML=htmlStr;
        //alert(document.all.contents.innerHTML);
       }
      
      </script>
    <body onLoad="refresh();">
    <%@ include file="menu.jsp"%><!--导航菜单-->
    <div id="content">
       <div id="content_title">Channel列表</div>
       <div id="handle" align="left"><html:button value="释放选中的资源" property="" onclick="submitForm('free')"/></div>
       <div id="totalRecords"></div>
       <div id="list"></div>
       <div id="content_list">
     <html:form  method="post" action="channelList">
     <html:hidden property="actionType" value="list"/>
     <div id="mContainer"></div>
     <div id="contents">
      <table width="950" align="center" class="table_c" border="0" cellspacing="0" cellpadding="0">
      <tr class="h_tr">
    <td class="border_all">&nbsp;</td>
    <td class="border_trb">Channel</td>
      </tr>
      <logic:iterate id="result" name="searchResult" type="ResChannel" scope="request">
      <tr>
    <td class="border_lbr"><html:multibox property="selectItems"  value="<%=result.getChannel()%>"/></td>
    <td class="border_rb"><a href="channelList.do?channel=<%=result.getChannel()%>&actionType=view"><%=result.getChannel()%></a></td>
      </tr>
      </logic:iterate>
    </table>
      </div>
      <div id="pager" align="center"><%@include file="pager.jsp" %><!--分页--></div>
      </html:form>
       </div>
       <div id="content_bottom">..</div>
    </div>
    </body>
    </html:html>
      

  9.   


    可能是你的request的值得没有变,因为当你一次request的时候,返回response,但是你是用ajax提交请求,所以可能你的request的值没有变,请求的作用域不同。 你把要返回的结果组装成xml后返回回来,用js解析xml再组装htmlStr然后innerHTML进去。
      

  10.   

    List   channels=(List)request.getAttribute("searchResult"); 这个都是在变的.我试一下组装成XML,我想用这个方法一定成功,当初就是不想在Action中组装XML.
      

  11.   

    你在类里面request.getAttribute("searchResult"); 打印出来的值得和页面上request.getAttribute("searchResult");打印出来的值是一样的吗?
    你打印看看。可能不是吧
      

  12.   

    Callback回来要重新加载数据。
      

  13.   

    kokobox  太神奇了,类里面和页面打印的request.getAttribute("searchResult")都是null,但在页面上设置debug点设在List       channels=(List)request.getAttribute("searchResult");上却有数据,真的是作用域问题?
      

  14.   

    是的,因为request到action返回response到ajax这是一个请求过程。所以你写个xml吧,把数据以xml形式返回给ajax,然后用js解析xml组装成你想要的htmlStr然后innerHTML进去。这样就没问题了。
      

  15.   

    function   parseMessage(){ 
            var   htmlStr=" <table   width=\"950\"   align=\"center\"   class=\"table_c\"   border=\"0\"   cellspacing=\"0\"   cellpadding=\"0\"> "; 
            htmlStr=htmlStr+" <tr   class=\"h_tr\"> "; 
    htmlStr=htmlStr+" <td   class=\"border_all\"> &nbsp; </td> "; 
    htmlStr=htmlStr+" </tr> "; 
            <% 
        List   channels=(List)request.getAttribute("searchResult"); 
        if(channels.size()> 0){ 
            Iterator   it=channels.iterator(); 
            while(it.hasNext()){ 
                ResChannel   channel=(ResChannel)it.next(); 
                String   htmlTemp=" <tr> "; 
                htmlTemp=htmlTemp+" <td   class=\\\"border_lbr\\\"> <input   type=\\\"checkbox\\\"   name=\\\"selectItems\\\"   value=\\\""+channel.getChannel()+"\\\"/> </td> "; 
        htmlTemp=htmlTemp+" </tr> "; 
    %> 
    htmlStr=htmlStr+" <%=htmlTemp%> "; 
    //alert(htmlStr); 

    完全错了
    ajax不是这样用的,在去看看书
      

  16.   

    谢谢大家.通过在JSP页面打印req.responseText发现内容是整个页面的HTML,原来我犯了个低级错误,我在Action响应完xml数据返回之后又forword掉了,所以永远得不到xml数据.