- PR -

処理時間のかかる処理で「処理中です・・・」のような画面を表示させたい

1
投稿者投稿内容
ゆう
常連さん
会議室デビュー日: 2001/12/10
投稿数: 33
投稿日時: 2007-05-05 16:09
いつもお世話になっております。

JavaServletを使用したアプリケーションで、
処理時間のかかる処理を行うので、
「submit」ボタンを押下後「処理中です・・・」の様な画面を表示させ、
処理が完了後に結果画面に遷移するようなものを作成したいです。

Aspでは以下のようなページを見つけたのですが、
同様にJavaServletで参考になるページや、実際に作成した人がいましたら
ご教授ください。
http://www.res-system.com/item/84

山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2007-05-05 16:50
これとか参考になるでしょうか。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=7110&forum=12
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-05-07 14:24
引用:

ゆうさんの書き込み (2007-05-05 16:09) より:
JavaServletを使用したアプリケーションで、
処理時間のかかる処理を行うので、
「submit」ボタンを押下後「処理中です・・・」の様な画面を表示させ、
処理が完了後に結果画面に遷移するようなものを作成したいです。



大雑把な流れは

1.submitでServletをキック
2.Servletで実際に処理するThreadを立ち上げる
3.Threadはセッションに保持しておく
4.Servletは「処理中です…」のHTMLを返す
5.HTMLに定時でのリロードを仕込んでおく(5秒おきぐらい)
6.リロードでServletを呼び出す
7.リロード処理ServletではセッションからThreadを読み出して
 該当処理が完了したかを確認し、未完の場合は「処理中です…」のHTMLを返す
8.完了していた場合は結果のHTMLを返す

といった感じなのですが、実際には途中でブラウザが閉じられた場合などに
Threadを途中で殺すのか否か、多重起動を防ぐか否かといった考慮事項があります。
Threadの制御についてはマルチスレッド特有の問題がでてきますので
適切に同期処理を施す必要がありますので難易度は高めです。
sawat
大ベテラン
会議室デビュー日: 2006/08/02
投稿数: 112
投稿日時: 2007-05-08 09:44
引用:

nagiseさんの書き込み (2007-05-07 14:24) より:
Threadの制御についてはマルチスレッド特有の問題がでてきますので
適切に同期処理を施す必要がありますので難易度は高めです。


同期処理などを自前でやると難しいので、java5以上が使えるなら、java.util.concurrentパッケージのFutureTaskクラスや各種ExecutorServiceのsubmitメソッド(戻り値がFuture型)を使うといいですよ。
タスクを非同期に実行して、後で結果を取り出すことができます。

java.util.concurrentパッケージの解説については「Java並行処理プログラミング」がお勧めです。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-05-08 11:07
この前JavaScriptだけでやりましたが、
コード:
<%
	//送信されたときにテスト的に重い処理
	if (request.getParameter("submit") != null) {
		Thread.sleep(5000);
	}
%>
<html>
<head>
<script language="JavaScript">
function beforeSubmit(){
	var wait = document.createElement("div");
	
	with(wait.style){
		textAlign = "center";
		backgroundColor = "#fff";
		filter = "alpha(opacity=80)";
		position = "absolute";
		left = "0px";
		top = "0px";
		cursor = "wait";
		width = "100%";
		zIndex = 1000;
		height = Math.max(document.body.clientHeight,
			document.documentElement.clientHeight) + "px";
	}
				
	wait.innerHTML = [
		"<br/>",
		"<br/>",
		"<p>",
		"processing...",
		"</p>",
	].join("");

	document.body.appendChild(wait);
}
</script>
</head>
<body>
<form onsubmit="beforeSubmit()">
	<input type="submit" name="submit" value="test"/>
</form>
</body>
</html>


サブミット前に「処理中です。」みたいな内容をオーバーレイで表示する方法です。
Ajaxなどでありがちなインジケータ風画像を組み合わせると、それらしい雰囲気がでます。
1

スキルアップ/キャリアアップ(JOB@IT)