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

2016-02-19 22:25 4 1 收藏

下面,图老师小编带您去了解一下利用AJAX技术实现网页无刷新进度条显示,生活就是不断的发现新事物,get新技能~

【 tulaoshi.com - Web开发 】

  在网页中实现页面无刷新的进度条显示不是一件很麻烦的事情,但如果这个进度条要能准确反映当前事务或者复杂逻辑的执行进度,那么却并不是一件容易的事情,目前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;i300;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;
   }
   }
   }
  }

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)

            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;

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)

来源:http://www.tulaoshi.com/n/20160219/1628326.html

延伸阅读
标签: ASP
       在后台处理数据时,前台页面同时计数显示Proess Bar   使用了layer来显示   用法:   1。引用   <script language="javascript" src="http://img.jcwcn.com/attachment/portal"></script>   2。在提交Button或<A>或<span> 加扩展属...
位图进度条 作者:徐云飞 下载本文示例源代码 图一 例子效果 玩过破天的朋友知道,游戏更新时进度是用位图表示的,我觉的挺漂亮的,于是自己动手做了一个类来实现那种效果。 这个类的名字叫CBmpProgCtrl,继承于CStatic,使用方法如下。 1、首...
标签: Web开发
一个投票功能模块少不了查看投票结果,用进度条显示各个投票结果可以起到一目了然的效果。以下是我的方法,请大家不吝赐教: 1:做一张图片用于做进度条,只需要很小的一个图片就可以了,如高20px,宽1px。 2:在要显示进度条的单元格中插入image控件,其imageUrl设置为已做好的图片的位置。 3:用一个dataReader对象dr保存取出...
本文实例绘制了炫酷的下载进度条,分享给大家供大家参考,具体内容如下 一、实现思路 1、要实现绘图,通常需要自定义一个UIView的子类,重写父类的- (void)drawRect:(CGRect)rect方法,在该方法中实现绘图操作 2、若想显示下载进度,只需要实例化自定义子类的对象(若是storyboard中控件,只需修改控件的class属性为自定义子类的类名即可...
标签: Web开发
其实我本来的计划是做网页设计师的,可是没有人认为我设计的好,哥到现在还没有工作,发泄一下,不多说了。 效果图 需要用到的图片: 背景图片: 进度显示图片: 网页结构: 代码如下: div div/div divdiv/div/div /div css代码: 代码 代码如下: #center{ margin:50px auto; width:400px; } #loading{ wid...

经验教程

691

收藏

88
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部