用ajax现在要向后台每隔一段时间传递一次数据,以测试当前页面有没有被关闭;惹关闭则不再传送数据;用ajax实现代码如下:
<script type="text/javascript">
setInterval("send_request(param)",10000);
var http_request;
if(window.XMLHttpRequest){//如果是Mozilla
http_request=new XMLHttpRequest();
if(http_request.overrideMImeType){//设置Mime类别
http_request.overrideMimeType("text/xml");
}
}
else if(window.ActiveXObject){//ie浏览器
try {
    http_request = new ActiveXObject("Msxml2.XMLHTTP");
   } catch (e) {
    try {
     http_request = new ActiveXObject("Microsoft.XMLHTTP");
    } catch (e) {}
   }
}
 
  var param="00分10秒";
  function send_request(param){
 // createXMLHttpRequest();  
 http_request.open("post","../trainServlet",true);
  http_request.setRequestHeader("Content-type","application/x-www-form-urlencoded");
  http_request.onreadystatechange = processRequest;
  http_request.send(param);
 }
 function processRequest(){
 if(http_request.readyState==4){
   if(http_request.status==200  || http_request.status==0){
     document.getElementById("cs").innerHTML=http_request.responseText();
   } if(http_request.status==500 ){
   // document.getElementById("cs").innerHTML=http_request.responseText();
   var res=http_request.responseText();
   window.alert(res);
   }
   else{
   alert("所请求的页面有异常"+http_request.status);
   }
 }
 }</script>但是每次都报500的错误,还有那个cs是一个隐藏的文本框,<input type="hidden" name="cs" id="cs" value="00分10秒">只是为了传递数据到后台,但是为什么每次都报错那?不知道是哪里出的错,谁能帮帮我? 

解决方案 »

  1.   

    ...学会用框架来做这事情...例如jquery..
      

  2.   

    我觉得如果JS都没学好的话就是用jquery是不是太着急了一点呢?
    500错误你不会不知道是什么原因吧?
    如果知道的话你就应该知道从哪里开始找错误。
    既然报错了,那么这报错就是提示你应该从哪里开始找错,这个你怎么没发上来呢?
    只是猜测,我感觉你后台没有对应的成员变量导致传值失败。
    首先你得判断一下是否进入到后台action里,然后判断action整个过程是否报异常,然后再检查前台页面。如果参数不需要手动进行修改的话,我感觉还是不用input更恰当一些。当然这个没有什么规定。
      

  3.   

    后台传值为null,已经传进去,null值,我试了用jquery写,也是data传不过去、我就觉得是不是自己传参的方式不对,但是又不知道怎么写?我把前台页面代码发下,你们看下:<%@ page language="java" import="java.util.*,java.util.Date"
    pageEncoding="GBK"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme() + "://"
    + request.getServerName() + ":" + request.getServerPort()
    + path + "/";
    %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
    <HEAD> <TITLE>在线培训</TITLE>
    <META NAME="Generator" CONTENT="EditPlus">
    <META NAME="Author" CONTENT="">
    <META NAME="Keywords" CONTENT="">
    <META NAME="Description" CONTENT="">
    <style type="text/css">
    <!--
    body {
    margin-left: 0px;
    margin-top: 0px;
    margin-right: 0px;
    margin-bottom: 0px;
    background: #DEF8F8
    }
    -->
    </style>
    <script language="javascript" type="text/javascript"><!--
     function time(){
    var date = new Date();
    var hour = date.getHours();
            if(hour>=0 && hour<=9){
             hour="0"+hour;
           }
    var mins = date.getMinutes();
    if (mins >= 0 && mins <= 9) {
    mins = "0" + mins;
    }
    var sec = date.getSeconds();
    if (sec >= 0 && sec <= 9) {
    sec = "0" + sec;
    }
    document.getElementById("time").value = hour + ":" + mins + ":" + sec+ "";
    }

    done = 0;
    step = 4
    function anim(yp,yk)
    {
    if(document.layers) 
    document.layers["napis"].top=yp;
    else 
    document.all["napis"].style.top=yp;
    if(yp>yk) step = -4
    if(yp<60) step = 4
    setTimeout('anim('+(yp+step)+','+yk+')', 35);
    }
    //定义一个函数 调整层的位置
    function start()
    {
    if(done) 
    return done = 1;
    if(navigator.appName=="Netscape") {
    document.napis.left=innerWidth/2 - 145;
    anim(60,innerHeight - 60)
    }
    else {
    napis.style.left=11;
    anim(60,document.body.offsetHeight - 60)
    }
    setTimeout('start()',10);
    }
    //--><!-- Begin
    pageOpen = new Date();
     function bye() {
    pageClose = new Date();
    minutes = (pageClose.getMinutes() - pageOpen.getMinutes());
    seconds = (pageClose.getSeconds() - pageOpen.getSeconds());
    if(minutes<0)
    {minutes+=60;}if(seconds<0)
    {minutes--;seconds+=60;}
    if(seconds>=0 && seconds<=9){
     seconds="0"+seconds;
    }
    //一定要注意这minutes和senconds的顺序。要不容易出错
     if(minutes>=0 && minutes<=9){
     minutes="0"+minutes;
     }
    alert('本次培训时间' + minutes+"分"+seconds+"秒," + '祝您工作愉快!');
     
    document.getElementById("countTime").value = minutes +"分"+seconds+"秒" 
    //为什么定义后不自动关闭?
    if(minutes==1){
    self.close();
    } }  function closeWindow(){
     i=i-1;
     if(i>0){
     setTimeout("closeWindow();",1000);
     }else{
     this.window.opener=null;
     window.close();
     }
     }
     var i=5
     closeWindow(); // End 
    -->
    </script>
    <!--<script type="text/javascript">
    setInterval("send_request(param)",10000);
    var http_request;
    if(window.XMLHttpRequest){//如果是Mozilla
    http_request=new XMLHttpRequest();
    if(http_request.overrideMImeType){//设置Mime类别
    http_request.overrideMimeType("text/xml");
    }
    }
    else if(window.ActiveXObject){//ie浏览器
    try {
        http_request = new ActiveXObject("Msxml2.XMLHTTP");
       } catch (e) {
        try {
         http_request = new ActiveXObject("Microsoft.XMLHTTP");
        } catch (e) {}
       }
    }
     
      var param="00分10秒";
      function send_request(param){
     // createXMLHttpRequest();  
     http_request.open("post","../trainServlet",true);
      http_request.setRequestHeader("Content-type","application/x-www-form-urlencoded");
      http_request.onreadystatechange = processRequest;
      http_request.send(param);
     }
     function processRequest(){
     if(http_request.readyState==4){
       if(http_request.status==200  || http_request.status==0){
         document.getElementById("cs").innerHTML=http_request.responseText();
       } if(http_request.status==500 ){
       // document.getElementById("cs").innerHTML=http_request.responseText();
       var res=http_request.responseText();
       window.alert(res);
       }
       else{
       alert("所请求的页面有异常"+http_request.status);
       }
     }
     }</script>
    -->
    </HEAD>
    <BODY onload="time();test();"> <form method="post" action="../trainServlet" id="form1">
    <div id="napis" style="position: absolute; top: -50;">
    <p>
    </p>
    </div>
    <input type="hidden" name="cs" id="cs" value="00分10秒">
    <input type="hidden" name="countTime" id="countTime" value="0" />
    <div id="div1">
    <INPUT TYPE="submit" VALUE="结束培训" onclick="bye();">
    </div>
    <input type="text" id="time" name="time" value="" />
    预计本次培训时间:40分钟
    <input type="hidden" name="trainTime" value="40" />
    </form>
    </BODY>
    <iframe name="wf" id="wf" style="width: 90%; height: 800px; top: 30px;"></iframe>
    </HTML>
    <script type="text/javascript">
    function test() {
    //window.open("bmxy.doc");
    document.getElementById("wf").src = "bmxy.doc";
    document.getElementById("wf").style.display = ""
    }
        function startTime(){
        document.getElementById("startTime").value=new Date();
        }
    function custom_close() {
    if (confirm("您确定要关闭本页吗?")) {
    //window.opener=null;
    //window.open('','_self');
    window.close();
    } else {
    }
    }
    </script>
      

  4.   

    其实就是计算该用户在该页面停留的时间,但是考虑到用户会关闭浏览器或者其他原因浏览器关闭,这样就没法传时间了。想着用ajax每隔几秒传一次,这样就算用户关闭了页面,时间错几秒没什么关系、但是就是这个ajax传的时间值传不过去,检测提示是500错误,还有那点我没说清楚的?
      

  5.   

    问题解决了,是我在使用ajax的post方式进行提交时候,应该是以键值对的方式提交的,我却用了简单的参数提交:正确的方式应该是:
    /**************************
    var param="00分10秒";
      function send_request(param){
     // createXMLHttpRequest();  
     http_request.open("post","../trainServlet",true);
      http_request.setRequestHeader("Content-type","application/x-www-form-urlencoded");
      http_request.onreadystatechange = processRequest;
      http_request.send('countTime'+param);
    **************************
    countTime是我自己获取前台所用的参数,这样就可以了。之后又遇到post乱码的问题,不过已经解决、
    结论:ajax再用post方式进行提交时,会出现乱码;是因为ajax默认是采用utf-8的方式的;解决方法:首先在头部加入 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />;然后在后台编码时候注意不再是request.setCharacterEncoding("GBK");而是要将其改为:request.setCharacterEncoding("utf-8");