在一个项目中,需要在后台把某个目录下的文件信息写入数据库(初始化文件)。当文件数量太多时,等待时间较长。因此需用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;
}
最后的效果图如下: