DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> JavaScript入門知識 >> AJAX入門 >> AJAX詳解 >> 利用AJAX技術實現網頁無刷新進度條顯示
利用AJAX技術實現網頁無刷新進度條顯示
編輯:AJAX詳解     

在網頁中實現頁面無刷新的進度條顯示不是一件很麻煩的事情,但如果這個進度條要能准確反映當前事務或者復雜邏輯的執行進度,那麼卻並不是一件容易的事情,目前AJAX技術流行,所以本文作者試想通過AJax來實現網頁准確進度條,以銄讀者。
 首先應該想一個問題,復雜事務或者事務邏輯如果不按線程方式運行,運行在Java運行中根本無法跳過復雜事務去處理進度顯示,所以我們這邊很自然的想到復雜事務或者業務邏輯用多線程實現。
 再想另一個問題,事務處理應該需要網頁上的一系列參數信息的,那麼如何獲取這些參數呢,這個似乎容易想到,傳一個HttpServletRequest過去就可以了。
 為了進度條公用,所有的復雜事務處理都應該實現同一個接口或者抽象類,我這裡用了一個接口,如下:
public interface IprogressBar {
  public void execute(HttpServletRequest req,String pbid);//執行復雜事務
}
用一個實現多線程的抽象類,如下:
public abstract class AbstractProgressBar extends TimerTask implements IprogressBar {
 private HttpServletRequest request;
 private String pbid;
  public AbstractProgressBar(){
 }
 //子類必須重載這個函數
 public abstract void execute(HttpServletRequest req, String pbid);
 public void run() {
  execute(request,pbid);
 }
 public void setRequest(HttpServletRequest req){
  this.request=req;
 }
 public void setPbid(String pbid){
  this.pbid=pbid;
 }
}
設計到具體項目不便給出代碼,這裡我另外寫了一個測試類,也就是執行復雜事務處理的類,如下:
public class TestPB extends AbstractProgressBar{
 public void execute(HttpServletRequest req, String pbid) { 
  String sql="insert into temp_table(idx)values(?)";
  int pid=Integer.parseInt(pbid);
  ProgressBar pb=new ProgressBar(pid,300,0,1);
  //模擬大事務
  for(int i=0;i<300;i++){
   DbUtils.executeUpdate(sql,new Object[]{new Integer(i)});
  //控制進度
pb.stepIt();
  }
 }
}
接著利用AJax技術來實現網頁的無刷新進度條實現,代碼如下:
<%@ page contentType="text/Html;charset=UTF-8"%>


<title>無刷新頁面進度條測試</title>
<STYLE TYPE="text/CSS">
<!--
BODY {OVERFLOW:scroll;OVERFLOW-X:hidden}
.DEK {POSITION:absolute;VISIBILITY:hidden;Z-INDEX:200;}
//-->
</STYLE>
<script type="text/Javascript">
var XMLHttp;
var pbid;//進度條ID
function createXMLHttpRequest(){
if (window.ActiveXObject) {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if (window.XMLHttpRequest) {
xmlHttp = new XMLHttpRequest();
}
}
function checkDiv() {
var progress_bar = document.getElementById("progressBar");
if (progress_bar.style.visibility != "visible") {
progress_bar.style.visibility = "visible";
}else
{
progress_bar.style.visibility = "hidden";
}
}
function go() {
createXMLHttpRequest();
checkDiv();
var url = "../servlet/ProgressBarServlet?task=create&impcls=blogcn.pb.imp.TestPB";//其中blogcn.pb.imp.TestPB是復雜事務的實現類
var button = document.getElementById("go");
button.disabled = true;
XMLHttp.open("GET", url, true);
xmlHttp.setRequestHeader("Content-Type", "text/XML;charset=gb2312");
XMLHttp.onreadystatechange = goCallback;
XMLHttp.send(null);
}
function goCallback(){
if (XMLHttp.readyState==4)
{
 if (XMLHttp.status==200) {
 pbid=xmlHttp.responseXML.getElementsByTagName("pbid")[0].firstChild.data;
  setTimeout("pollServer()", 2000);
 }
}
}
function pollServer() {
createXMLHttpRequest();
var url = "../servlet/ProgressBarServlet?task=poll&pbid="+pbid;
XMLHttp.open("GET", url, true);
XMLHttp.onreadystatechange = pollCallback;
XMLHttp.send(null);
}
function pollCallback(){
if (XMLHttp.readyState == 4) {
if (XMLHttp.status == 200) {
 var percent_complete =
 xmlHttp.responseXML
 .getElementsByTagName("percent")[0].firstChild.data;
 if (percent_complete < 100) {
     PB1.pos=percent_complete;
        PB1.Update();   
  setTimeout("pollServer()", 2000);
 } else {
     PB1.pos=100;
        PB1.Update();
  document.getElementById("go").disabled = false;
 }
 }
 }
}

          <input type="button" value="執行大事務" id="go" onclick="go();"/>
    <DIV id="progressBar">
       <script language="Javascript">
     var PB1=new TProgressBar("myPB1",220,180,375,20);
     PB1.Create();
     PirateCount=100;
     PID=PirateCount-2;
     PB1.Reposition();
     PB1.max=PID;

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved