Web ページでページを更新せずにプログレス バーの表示を実現することはそれほど面倒なことではありませんが、プログレス バーが現在のトランザクションや複雑なロジックの実行の進行状況を正確に反映できるのであれば、それは簡単な作業ではありません。 AJAX テクノロジ 人気があるため、この記事の著者は AJAX を使用して Web ページの正確なプログレス バーを実現し、読者を惹きつけることを試みています。
まず最初に考えるべき問題は、複雑なトランザクションやビジネス ロジックがスレッド化されて実行されていない場合、JAVA で実行する場合、複雑なトランザクションをスキップして進行状況表示を処理することができないということです。複雑なトランザクションやビジネス ロジックにマルチスレッドを使用することを検討してください。
別の質問について考えると、トランザクション処理には Web ページ上の一連のパラメータ情報が必要です。これらのパラメータを取得するには、HttpServletRequest を渡すだけでよいと考えられます。
プログレスバーを共有するには、すべての複雑なトランザクション処理で、次のように同じインターフェイスまたは抽象クラスを実装する必要があります。
パブリック インターフェイス IprogressBar {
public voidexecute(HttpServletRequest req,String pbid);//複雑なトランザクションを実行する
}
次のように、抽象クラスを使用してマルチスレッドを実装します。
パブリック抽象クラス AbstractProgressBar extends TimerTask 実装 IprogressBar {
プライベート HttpServletRequest リクエスト。
プライベート文字列 pbid;
public AbstractProgressBar(){
}
//サブクラスはこの関数をオーバーライドする必要があります
public abstract voidexecute(HttpServletRequest req, String pbid);
public void run() {
実行(リクエスト,pbid);
}
public void setRequest(HttpServletRequest req){
this.request=req;
}
public void setPbid(String pbid){
this.pbid=pbid;
}
}
特定のプロジェクトにコードを提供するのは不便です。ここでは、次のように、複雑なトランザクション処理を実行するクラスである別のテスト クラスを作成しました。
public class TestPB extends AbstractProgressBar{
public voidexecute(HttpServletRequest req, String pbid) {
文字列 sql="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 テクノロジを使用して、Web ページの非更新プログレス バーを実現します。コードは次のとおりです。
<%@ page contentType="text/html;charset=UTF-8"%>
<title>ページ更新なしのプログレスバーテスト</title>
<STYLE TYPE="テキスト/css">
<!--
BODY {OVERFLOW:スクロール;OVERFLOW-X:hidden}
.DEK {位置:絶対;可視性:非表示;Z-インデックス:200;}
//-->
</スタイル>
<script type="text/javascript">
var xmlHttp;
var pbid;//プログレスバーID
関数 createXMLHttpRequest(){
if (window.ActiveXObject) {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if (window.XMLHttpRequest) {
xmlHttp = 新しい XMLHttpRequest();
}
}
関数 checkDiv() {
var progress_bar = document.getElementById("progressBar");
if (progress_bar.style.visibility != "可視") {
progress_bar.style.visibility = "表示";
}それ以外
{
progress_bar.style.visibility = "非表示";
}
}
関数 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);
}
関数 goCallback(){
if (xmlHttp.readyState==4)
{
if (xmlHttp.status==200) {
pbid=xmlHttp.responseXML.getElementsByTagName("pbid")[0].firstChild.data;
setTimeout("pollServer()", 2000);
}
}
}
関数pollServer() {
createXMLHttpRequest();
var url = "../servlet/ProgressBarServlet?task=poll&pbid="+pbid;
xmlHttp.open("GET", url, true);
xmlHttp.onreadystatechange =pollCallback;
xmlHttp.send(null);
}
関数pollCallback(){
if (xmlHttp.readyState == 4) {
if (xmlHttp.status == 200) {
var パーセント_コンプリート =
xmlHttp.responseXML
.getElementsByTagName("パーセント")[0].firstChild.data;
if (percent_complete < 100) {
PB1.pos=パーセント_コンプリート;
PB1.Update();
setTimeout("pollServer()", 2000);
} それ以外 {
PB1.pos=100;
PB1.Update();
document.getElementById("go").disabled = false;
}
}
}
}
<input type="button" value="大規模なトランザクションを実行する" id="go" onclick="go();"/>
<DIV id="進捗バー">
<スクリプト言語="javascript">
var PB1=new TProgressBar("myPB1",220,180,375,20);
PB1.Create();
海賊数=100;
PID=海賊数-2;
PB1.Reposition();
PB1.max=PID;