jsp和ajax实现java类中的方法执行的进度条-例子

在一个项目中,需要在后台把某个目录下的文件信息写入数据库(初始化文件)。当文件数量太多时,等待时间较长。因此需用ajax技术做一个显示处理进度的进度条。
 
进度条显示页面before_initiallize.jsp:

  <script type="text/javascript">
        var xmlHttp;
        //var key;
        var startSeconds = new Date().getSeconds();//
        //ajax第一步:创建XMLHttpRequest
        function createXMLHttpRequest(){
            if (window.ActiveXObject){
                xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
            }
            else if (window.XMLHttpRequest){
                xmlHttp = new XMLHttpRequest();               
            }
        }
  //首先执行的函数:准备ajax交互
        function go(){
            createXMLHttpRequest();
            clearBar();
            var url = "actObjInfoAction.do?method=initiallize&task=create";//要用不同的参数来控制后台的处理
            //var button = document.getElementByIdx("go");
            //button.disabled = true;
            xmlHttp.open("GET", url, true);
            xmlHttp.onreadystatechange = goCallback;//当状态改变时调用的函数:goCallBack
            xmlHttp.send(null);
        }
  //向服务端发送create参数后,被指定用来处理onreadystatechange事件的函数
        function goCallback(){
            if (xmlHttp.readyState == 4) {
                if (xmlHttp.status == 200) {
                    //setTimeout("pollServer()", 0);//为pollServer函数设置延时:2000毫秒
     pollServer();
                }
            }
        }
        //与服务端交互:
        function pollServer() {
            createXMLHttpRequest();
            var url = "actObjInfoAction.do?method=initiallize&task=poll";//要用不同的参数来控制后台的处理
            xmlHttp.open("GET", url, true);
            xmlHttp.onreadystatechange = pollCallback;
            xmlHttp.send(null);
        }
        //与服务端交互开始后,被指定用来处理onreadystatechange事件的函数
        function pollCallback() {
            if (xmlHttp.readyState == 4) {
                if (xmlHttp.status == 200) {
                    var percent_complete = xmlHttp.responseXML.getElementsByTagName_r("percent")[0].firstChild.data;

                    var progress = document.getElementByIdx("progress");
                    var progressPersent = document.getElementByIdx("progressPersent");
     progress.width = percent_complete + "%";
     progressPersent.innerHTML = percent_complete + "%";
                    if (percent_complete < 100) {
                        //setTimeout("pollServer()", 0);//2000
      pollServer();
                    } else {
                     var endSeconds = new Date().getSeconds();//
                     var during = endSeconds - startSeconds;
                        document.getElementByIdx("complete").innerHTML = "初始化完成!花费 ";
                        document.getElementByIdx("complete").innerHTML += during;
                        document.getElementByIdx("complete").innerHTML += " 秒";
                        
                        //document.getElementByIdx("go").disabled = false;
                    }
                }
            }
        }
  //一开始显示文字提示:
 function clearBar() {
   var progress_bar = document.getElementByIdx("progressBar");
   var progressPersent = document.getElementByIdx("progressPersent");
   var complete = document.getElementByIdx("complete");
   progress_bar.style.visibility = "visible"
   progressPersent.innerHTML = " ";
   complete.innerHTML = "正在初始化,请稍等...";
 }
    </script>

 </head>
 <LINK href="include/css/windows.css" type=text/css rel=stylesheet>
 <link href="include/css/futuretable.css" type="text/css" rel="stylesheet">

 <body class="contentbodymargin" onLoad="go()">
  <div id="contentborder">
   <div id="progressBar" style="padding:0px;border:solid black 0px; visibility:hidden">
    <table width="300" border="0" cellspacing="0" cellpadding="0" align="center">
     <tr>
      <td align="center" id="progressPersent"></td>
     </tr>
     <tr>
      <td>
       <table width="100%" border="1" cellspacing="0" cellpadding="0" bordercolor="#000000">
        <tr>
         <td>
          <table width="0%" border="0" cellspacing="0" cellpadding="0" id="progress">
           <tr bgcolor="#0099FF"><td></td></tr>
          </table>
         </td>
        </tr>
       </table>
      </td>
     </tr>
     <tr>
      <td align="center" id="complete">
       完成
      </td>
     </tr>
    </table>
   </div>
<!--input id = "go" name="run" type="button" value="run" onClick="go();"-->
  </div>
  
 </body>

 后台处理java文件:

 public ActionForward initiallize(ActionMapping mapping,
   ActionForm actionForm, HttpServletRequest request,
   HttpServletResponse response) {
  ActObjManager aom = (ActObjManager) getBean("actObjManager");
  String rootPath = request.getRealPath("dirfiles");
  File baseDir = new File(rootPath);
  List files = FileOperate.getSubFiles(baseDir);// 得到目录中包括的所有文件(不包括空目录)
  
  // ajax进度条相关:
  String task = request.getParameter("task");
  String res = "0";
  int totalFileNum = files.size();// 需初始化的总共文件数,可用来做前期的准备工作

  if (task.equals("create"))//这个if块内只执行一次
  {
   res = "1";
   counter = 1;//不清楚这个语句的作用。但这里写成0的话页面会报JS错误
   
   // 首先删除actobj中所有记录:
   List actobjs = aom.getActObjs();
   for (int i = 0; i < actobjs.size(); i++) {
    ActObj actobj = (ActObj) actobjs.get(i);
    aom.delActObj(actobj.getObjid());
   }
  }
  else//主要的处理写在这个else块内。注意:不要循环,因为这个块会被多次调用
  {
   String percent = "";
   //开始初始化文件:
   if ( counter < totalFileNum )//开始初始化文件。防止下标越界
    initiallizeFile(request,response,files,counter-1);//初始化文件的函数。因为counter是从1开始,所以这里要-1
   
   percent = String.valueOf((int) (counter * 100) / totalFileNum);
   counter++;
   res = "" + percent + "";
  }
  try {
   PrintWriter out = response.getWriter();
   response.setContentType("text/xml");
   response.setHeader("Cache-Control", "no-cache");
   out.println("");
   out.println(res);
   out.println("");
   out.close();
  } catch (Exception e) {
   e.printStackTrace();
  }
  return null;

 }

最后的效果图如下:

jsp+ajax进度条一例

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值