Ajax进度条

共需要3个文件,ProgressBarServlet.java,web.xml,progressBar.html;
林,如果没看太明白,我会多写点注释...

---ProgressBarServlet.java

package dawei;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ProgressBarServlet extends HttpServlet {

 private int counter=1;
 
 public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {

  String task=request.getParameter("task");
  String res="";
  
  if(task.equals("create")){
   res="<key>1</key>";
   counter=1;
  }else{
   String percent="";
   switch(counter){
    case 1:percent="10";break;
    case 2:percent="23";break;
    case 3:percent="35";break;
    case 4:percent="51";break;
    case 5:percent="64";break;
    case 6:percent="73";break;
    case 7:percent="89";break;
    case 8:percent="100";break;
   }
   counter++;
   res="<percent>"+percent+"</percent>";
  }
  PrintWriter out=response.getWriter();
  response.setContentType("text/xml");
  response.setHeader("Cache-Control","no-cache");
  
  out.println("<response>");
  out.println(res);
  out.println("</response>");
  out.close();
 }

}

 

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
 xmlns="http://java.sun.com/xml/ns/j2ee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

 <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>ProgressBarServlet</servlet-name>
    <servlet-class>dawei.ProgressBarServlet</servlet-class>
 </servlet>

 <servlet-mapping>
    <servlet-name>ProgressBarServlet</servlet-name>
    <url-pattern>/ProgressBarServlet</url-pattern>
 </servlet-mapping>

 

---progressBar.html


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>Ajax Progress Bar</title>
  </head>
  <script type="text/javascript">
   var xmlHttp; //XMLHttpRequest对象
   var bar_color="gray"; //颜色"gray"
   var clear="&nbsp;&nbsp;&nbsp;"; //占位符
   
   //创建XMLHttpRequest对象
   //在IE中,XMLHttpRequest对象是以ActiveX组件形式存在的
   //在其他浏览器中,默认被集成
   function createXMLHttpRequest(){
    if(window.ActiveXObject){
     xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
    }else if(window.XMLHttpRequest){
     xmlHttp=new XMLHttpRequest();
    }
   }
   
   //当点击"Launch"按钮时执行
   function go(){
    //创建XMLHttpRequest对象
    createXMLHttpRequest();
    
    //检查进度条状态
    checkDiv();
    
    //请求url
    //timeStamp参数确保url的唯一性,避免浏览器缓存结果
    var url="ProgressBarServlet?task=create&timeStamp="+new Date().getTime();
    
    //获得并设置button属性
    var button=document.getElementById("go");
    button.disabled=true;
    
    //打开连接
    xmlHttp.open("GET",url,true);
    //当XMLHttpRequest对象状态改变时,调用"goCallback()"方法
    xmlHttp.onreadystatechange=goCallback;
    //发送请求
    xmlHttp.send(null);
   }
   
   //启动
   //接收服务器的响应
   //当XMLHttpRequest的状态为4(请求状态,完成)和200(服务器状态)
   function goCallback(){
    if(xmlHttp.readyState==4){
     if(xmlHttp.status==200){
      //延时2000毫秒执行"pollServer()"方法
      setTimeout("pollServer()",2000);
     }
    }
   }
   
   //由goCallback()启动,循环向服务器发送请求
   //创建XMLHttpRequest对象
   function pollServer(){
    createXMLHttpRequest();
    
    var url="ProgressBarServlet?task=poll&timeStamp="+new Date().getTime();
    
    xmlHttp.onreadystatechange=pollCallback;
    xmlHttp.open("GET",url,true);
    xmlHttp.send(null);
   }
   
   function pollCallback(){
    if(xmlHttp.readyState==4){
     if(xmlHttp.status==200){
      //读取以xml方式读取服务器的响应
      
      //获得所有名为"percent"的节点的第一个节点的文本节点的值
      var percent_complete=xmlHttp.responseXML.getElementsByTagName("percent")[0].firstChild.nodeValue;
      
      //获得percent值的第一个字符
      var index=processResult(percent_complete);
      
      //
      for(var i=1;i<=index;i++){
       //得到指定元素(block[i])
       var elem=document.getElementById("block"+i);
       //设置元素值为占位符
       elem.innerHTML=clear;
       //设置元素背景颜色为bar_color(灰色)
       elem.style.backgroundColor=bar_color;
       
       //得到指定元素的下一个元素
       var next_cell=i+1;
       if(next_cell>index&&next_cell<=9){
        //在指定元素的下一个元素位置上显示当前进度
        document.getElementById("block"+next_cell).innerHTML=percent_complete+"%";
       }
      }
      //循环调用pollServer(),直到i=8;
      if(index<9){
       setTimeout("pollServer()",2000);
      }else{
       //进度条进行完毕,显示"complete"
       document.getElementById("complete").innerHTML="Complete!";
       //恢复button为可用
       document.getElementById("go").disabled=false;
      }
     }
    }
   }
   
   //检查进度条状态
   function checkDiv(){
    var progressBar=document.getElementById("progressBar");
    if(progressBar.style.visibility=="visible"){
     clearBar();
     document.getElementById("complete").innerHTML="";
    }else{
     progressBar.style.visibility="visible";
    }
   }
   
   //清空进度条,设置进度条颜色为白色
   function clearBar(){
    for(var i=1;i<10;i++){
     var elem=document.getElementById("block"+i);
     elem.innerHTML=clear;
     elem.style.backgroundColor="white";
    }
   }
   
   //解析传入的值,获得其首字符
   
   //substring(int start,int end)
 //返回一个字符串,由 start 和 end 参数指定的两点之间的字符组成.
 //如果未指定 end 参数,则子字符串的结尾就是该字符串的结尾.
 //如果 start 的值等于 end 的值,则该方法返回一个空字符串.
 //如果 start 的值大于 end 的值,则在函数执行前两个参数将自动互换,且原始值不变.
 
   function processResult(percent_complete){
    var ind;
    if(percent_complete.length==1){
     ind=1;
    }else if(percent_complete.length==2){
     //substring(s,e);
     ind=percent_complete.substring(0,1);
    }else{
     ind=9;
    }
    return ind;
   }
  </script>
  <body>
    <H1>Ajax 进度条</H1>
    执行:
     <INPUT type="button" value="Launch" id="go" οnclick="go();"/><P/>
    <table align="center">
     <TBODY>
      <TR>
       <TD>
        <DIV id="progressBar" style="padding: 2px;border: solid black 2px;visibility: hidden">
         <SPAN id="block1">&nbsp;&nbsp;&nbsp;</SPAN>
         <SPAN id="block2">&nbsp;&nbsp;&nbsp;</SPAN>
         <SPAN id="block3">&nbsp;&nbsp;&nbsp;</SPAN>
         <SPAN id="block4">&nbsp;&nbsp;&nbsp;</SPAN>
         <SPAN id="block5">&nbsp;&nbsp;&nbsp;</SPAN>
         <SPAN id="block6">&nbsp;&nbsp;&nbsp;</SPAN>
         <SPAN id="block7">&nbsp;&nbsp;&nbsp;</SPAN>
         <SPAN id="block8">&nbsp;&nbsp;&nbsp;</SPAN>
         <SPAN id="block9">&nbsp;&nbsp;&nbsp;</SPAN>
        </DIV>
       </TD>
      </TR>
      <TR>
       <TD align="center" id="complete"></TD>
      </TR>
     </TBODY>
    </table>
  </body>
</html>

---web.xml
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值