在網頁中實現頁面無刷新的進度條顯示不是一件很麻煩的事情,但如果這個進度條要能準確反映當前事務或者復雜邏輯的執行進度,那麼卻並不是一件容易的事情,目前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"%>