QQ咨询 官方微信

添加微信好友

官方小程序

百度小程序

微信小程序

头条小程序

关于我们

jquery教程

使用AJAX技术实现网页无刷新进度条显示

 admin  2013-08-28 10:07:00

    在网页中实现页面无刷新的进度条显示不是一件很麻烦的事情,但如果这个进度条要能准确反映当前事务或者复杂逻辑的执行进度,那么却并不是一件容易的事情,目前AJAX技术流行,所以本文作者试想通过AJAX来实现网页准确进度条,以銄读者。
    首先应该想一个问题,复杂事务或者事务逻辑如果不按线程方式运行,运行在JAVA运行中根本无法跳过复杂事务去处理进度显示,所以我们这边很自然的想到复杂事务或者业务逻辑用多线程实现。
    再想另一个问题,事务处理应该需要网页上的一系列参数信息的,那么如何获取这些参数呢,这个似乎容易想到,传一个HttpServletRequest过去就可以了。
为了进度条公用,所有的复杂事务处理都应该实现同一个接口或者抽象类,我这里用了一个接口,如下:

  1. public interface IprogressBar { 
  2.   public void execute(HttpServletRequest req,String pbid);//执行复杂事务 
  3. } 
  4. 用一个实现多线程的抽象类,如下: 
  5. public abstract class AbstractProgressBar extends TimerTask implements IprogressBar { 
  6.  private HttpServletRequest request; 
  7.  private String pbid; 
  8.   public AbstractProgressBar(){ 
  9.  } 
  10.  //子类必须重载这个函数 
  11.  public abstract void execute(HttpServletRequest req, String pbid);  
  12.  public void run() { 
  13.   execute(request,pbid);  
  14.  } 
  15.  public void setRequest(HttpServletRequest req){ 
  16.   
  17.  
  18.   this.request=req; 
  19.  } 
  20.  public void setPbid(String pbid){ 
  21.   this.pbid=pbid; 
  22.  } 
  23. } 
  24. 设计到具体项目不便给出代码,这里我另外写了一个测试类,也就是执行复杂事务处理的类,如下: 
  25. public class TestPB extends AbstractProgressBar{ 
  26.  public void execute(HttpServletRequest req, String pbid) {   
  27.   String sql="insert into temp_table(idx)values(?)"; 
  28.   int pid=Integer.parseInt(pbid); 
  29.   ProgressBar pb=new ProgressBar(pid,300,0,1); 
  30.   //模拟大事务 
  31.   for(int i=0;i<300;i++){ 
  32.    DbUtils.executeUpdate(sql,new Object[]{new Integer(i)}); 
  33.   //控制进度  
  34. pb.stepIt(); 
  35.   } 
  36.  } 
  37. } 
  38. 接着利用AJAX技术来实现网页的无刷新进度条实现,代码如下: 
  39. <%@ page contentType="text/html;charset=UTF-8"%> 
  40.   
  41.   
  42.   
  43.  
  44. <title>无刷新页面进度条测试</title> 
  45. <STYLE TYPE="text/css"> 
  46. <!-- 
  47. BODY {OVERFLOW:scroll;OVERFLOW-X:hidden} 
  48. .DEK {POSITION:absolute;VISIBILITY:hidden;Z-INDEX:200;} 
  49. //--> 
  50. </STYLE> 
  51. <script type="text/javascript"> 
  52. var xmlHttp; 
  53. var pbid;//进度条ID 
  54. function createXMLHttpRequest(){ 
  55. if (window.ActiveXObject) { 
  56. xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); 
  57. } 
  58. else if (window.XMLHttpRequest) { 
  59. xmlHttp = new XMLHttpRequest(); 
  60. } 
  61. } 
  62. function checkDiv() { 
  63. var progress_bar = document.getElementById("progressBar"); 
  64. if (progress_bar.style.visibility != "visible") { 
  65. progress_bar.style.visibility = "visible"; 
  66. }else 
  67. { 
  68. progress_bar.style.visibility = "hidden"; 
  69. } 
  70. } 
  71. function go() { 
  72. createXMLHttpRequest(); 
  73. checkDiv(); 
  74. var url = "../servlet/ProgressBarServlet?task=create&impcls=blogcn.pb.imp.TestPB";//其中blogcn.pb.imp.TestPB是复杂事务的实现类 
  75.   
  76.  
  77. var button = document.getElementById("go"); 
  78. button.disabled = true; 
  79. xmlHttp.open("GET", url, true); 
  80. xmlHttp.setRequestHeader("Content-Type", "text/xml;charset=gb2312"); 
  81. xmlHttp.onreadystatechange = goCallback; 
  82. xmlHttp.send(null); 
  83. } 
  84. function goCallback(){ 
  85. if (xmlHttp.readyState==4)  
  86. { 
  87.  if (xmlHttp.status==200) { 
  88.  pbid=xmlHttp.responseXML.getElementsByTagName("pbid")[0].firstChild.data; 
  89.   setTimeout("pollServer()", 2000); 
  90.  } 
  91. } 
  92. } 
  93. function pollServer() { 
  94. createXMLHttpRequest(); 
  95. var url = "../servlet/ProgressBarServlet?task=poll&pbid="+pbid; 
  96. xmlHttp.open("GET", url, true); 
  97. xmlHttp.onreadystatechange = pollCallback; 
  98. xmlHttp.send(null); 
  99. } 
  100. function pollCallback(){ 
  101. if (xmlHttp.readyState == 4) { 
  102. if (xmlHttp.status == 200) { 
  103.  var percent_complete = 
  104.  xmlHttp.responseXML 
  105.  .getElementsByTagName("percent")[0].firstChild.data;  
  106.  if (percent_complete < 100) { 
  107.      PB1.pos=percent_complete; 
  108.         PB1.Update();     
  109.   setTimeout("pollServer()", 2000); 
  110.  } else { 
  111.      PB1.pos=100; 
  112.         PB1.Update(); 
  113.   document.getElementById("go").disabled = false; 
  114. } 
  115.  } 
  116.  } 
  117. } 
  118.   
  119.   
  120.           <input type="button" value="执行大事务" id="go" onclick="go();"/> 
  121.     <DIV id="progressBar"> 
  122.        <script language="javascript"> 
  123.      var PB1=new TProgressBar("myPB1",220,180,375,20); 
  124.      PB1.Create(); 
  125.      PirateCount=100; 
  126.      PID=PirateCount-2; 
  127.      PB1.Reposition(); 
  128.      PB1.max=PID; 

 

¥ 打赏
×
如果您觉得文章帮助了您就打赏一下吧
非常感谢你的打赏,我们将继续分享更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫打赏

微信扫一扫打赏

本文《使用AJAX技术实现网页无刷新进度条显示》发布于石头博客文章,作者:admin,如若转载,请注明出处:https://www.pweb123.com/html/jquery/235.html,否则禁止转载,谢谢配合!

文章点评

我来说两句 已有0条评论
点击图片更换

添加微信好友

添加微信好友

微信小程序

百度小程序