新着記事

2004年07月26日

WebObjectsライブラリ Project Wonder サンプルズ#2 ERXLongResponseとERXLongResponseTask

今日のお題。


WebObjectsのライブラリ Project Wonder
ERXLongResponseについて。


WOLongResponsePageProject Wonderな実装。


WOLongResponsePageは、ページを定期的にリフレッシュ
しながら、処理を行うことのできるWebObjectsのクラスです。
これを使用すると、現在の処理状況などを表示したりできます。

・ページのコンポーネントに配置すると、そのページがLongResponseなページに早代わりするという代物です。
Project Wonderのバージョン2.0以降に含まれます。

WOLongResponsePageを使えば、別にこちらを使う必要がない。と、いう気がしないでもないです。



使い方としては、
・ページにERXLongResponseを配置して、
・ERXLongResponseTaskインターフェイスを実装し、
・ERXLongResponseのtaskバインドにバインドすれば良い。


このライブラリを使う方としては、ERXLongResponseTaskに時間のかかってしまう処理を実装する。


ERXLongResponseTaskはJavaインターフェイスなので、
独自に実装しても構わないのですが、
ERXLongResponseTask.DefaultImplementationというデフォルト実装が用意されているので、
これを継承した方が良いとは思う。



バインドについて


ERXLongResponseは、下のバインドを持つ。

task
refreshInterval

・taskにはERXLongResponseTaskインターフェイスの実装クラスをバインド、
・refreshIntervalには、ページのリフレッシュ時間を秒単位で設定する。


refreshIntervalは必須のバインドになっていないが、何もバインドされないと、0秒設定になってしまうので、実質必須。


SourceForge cvs 2004/06/29版ではバグがあって、
このバインドが効かない。(回避策はいくらでもあるけどね。)


サンプルコード(抜粋)



LongLongTask.java


このクラスで、時間のかかってしまう処理を実装しています。


/**
* ERXLongResponseのサンプル。
* 長いタスクをperformAction()で実装するクラス。
*/
public class LongLongTask extends
ERXLongResponseTask.DefaultImplementation {

public int max = 15;
public int count;

/**
* 本クラスを生成します。
*/
public LongLongTask(){
super();
}

/**
* キャンセル時に呼び出されます。
*/
protected WOComponent cancelPageForStatus(Object aStatus) {
return this.longResponse().pageWithName(
"CancelPage"
);
}
/**
* performAction()の処理中に例外が発生した時に呼び出されます。
*/
protected WOComponent pageForException(
Exception exception) {
return this.longResponse().pageWithName("ExceptionPage");
}
/**
* performAction()が終わった時に呼び出されます。
*/
protected WOComponent pageForResult(
Object aResult) {
return this.longResponse().pageWithName(
"ResultPage"
);
}

/**
* 長い処理を実行します。
* このメソッドは別スレッドで実行されます。
*/
public Object performAction() {
// cvs 2004/06/29版のバグ対策
// それ以降のバージョンであるか、自力ビルドしている場合は、
// この行を取り除くこと。
this.longResponse().setRefreshInterval(3);

while (count ++ < max) {
// ループ処理中に
// キャンセルされたかどうかのチェックを入れましょう。
if (this.isCancelled()) {
// キャンセルされていたら、
// 処理を中止します。
break;
}

try {
// 長い処理の代わり。
// 2秒待ちます。
synchronized (this) {
wait(2000);
}
} catch(InterruptedException e) {
// do nothing
}

}

return null;
}

}



ERXLongResponseSample.java


表示しているページのクラスです。

/**
* ERXLongResponseのサンプル。
* 処理時間のかかる処理を行います。
*/
public class ERXLongResponseSample
extends WOComponent {

/**
* 時間のかかる処理を実装したクラス。
*/
public LongLongTask task;

/**
* 本クラスを生成します。
*/
public ERXLongResponseSample(WOContext context) {
super(context);
this.task = new LongLongTask();
}

/**
* キャンセルボタンを押した時に呼び出されます。
*/
public WOComponent cancelBtnClicked() {
// キャンセルしたい時は,stop()メソッドを
// 呼び出せば良い。
this.task.stop();
return null;
}
}


ERXLongResponseSample.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META NAME="generator" CONTENT="WebObjects 5.2">
<TITLE>ERXLongResponseSample</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<WEBOBJECT NAME=ERXLongResponse1></WEBOBJECT><BR>
max : <WEBOBJECT NAME=String1></WEBOBJECT><BR>
current : <WEBOBJECT NAME=String2></WEBOBJECT>
<WEBOBJECT NAME=Form1>
<WEBOBJECT NAME=SubmitButton1></WEBOBJECT>
</WEBOBJECT><BR>
</BODY>
</HTML>


ERXLongResponseSample.wod

ERXLongResponse1: ERXLongResponse {
refreshInterval = "4";
task = task;
}

Form1: WOForm {
multipleSubmit = true;
}

String1: WOString {
value = task.max;
}

String2: WOString {
value = task.count;
}

SubmitButton1: WOSubmitButton {
action = cancelBtnClicked;
value = "キャンセル";
}






今日は以上。


今回使ったサンプルコード。
ERXLongResponse.tar.bz2



現在、仕事でトラブル発生中です。

明日休みの予定だったのになぁ。
posted by 小見 拓 at 03:40| Comment(0) | TrackBack(0) | Project Wonder | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。
この記事へのトラックバックURL
http://blog.seesaa.jp/tb/368950
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック
記事検索
 
カテゴリ
最近のコメント
QKCのインストール [3-4/18]
 ⇒ kova (05/23)
calendar.vimには日記をつける機能があったらしい。
 ⇒ とまと (03/07)
最近よく見るようになったvimスクリプトのコメントの書き方
 ⇒ 小見 拓 (02/13)
 ⇒ kana (02/11)
vimエディタ ヘルプのgrep
 ⇒ みかん (07/15)
指定したカラム位置にテキストを流し込む (vimエディタ)
 ⇒ こみ (03/20)
 ⇒ とおりすがり (03/19)
 ⇒ こみ (03/18)
 ⇒ takayama (03/18)
tempfile -- Generate temporary files (Mac OSX)
 ⇒ take3 (01/20)
 ⇒ こみ (01/19)
 ⇒ take3 (01/18)
 ⇒ こみ (01/17)
 ⇒ take3 (01/14)
WebObjectsのオープンソースプロジェクト Project Wonderってなんじゃろな。#2
 ⇒ (06/30)
 ⇒ Tetsuya Kuramochi (06/29)
 ⇒ Tetsuya Kuramochi (06/29)
WebObjectsのオープンソースプロジェクト Project Wonderってなんじゃろな。#1
 ⇒ (06/03)
 ⇒ Tetsuya Kuramochi (06/02)
最近のトラックバック
vimエディタで「文字コード、改行コードを変更して保存する。」
 ⇒ window.closed (04/25)
 ⇒ himesuke’s STEP-log (03/18)
 ⇒ PukiWiki/TrackBack 0.2 (05/07)
vimエディタの折りたたみ機能の話。その2 (foldmethod=syntax)
 ⇒ 俺の基地 (PukiWiki/TrackBack 0.3) (04/20)
ログファイルを監視して、特定のキーワードが見つかったら、何らかのコマンドを実行する。
 ⇒ Apple Fan (10/16)
ファイル保存ダイアログの初期ディレクトリについての話 (vimエディタ話)
 ⇒ ナレッジエース (07/23)
:e <C-x> (編集中のファイルと同じディレクトリにあるファイルを開く。)
 ⇒ ボクノス (02/07)
Opening many files using wildcards.
 ⇒ PukiWiki Plus! (PukiWiki/TrackBack 0.4) (10/28)
 ⇒ 川o・-・)<2nd life (07/18)
vimエディタで印刷自由自在 その8 -エディタからの直接の印刷の代わりに、2html.vimスクリプトを使用する-
 ⇒ Knoppix Temporary Directory (PukiWiki/TrackBack 0.3) (02/19)
検索でマッチした対象に対して、置換を行う。(vimエディタ話)
 ⇒ 123net :: 開発日記 (12/31)
ごみ箱にファイルを叩き込むスクリプト。(vimエディタ)
 ⇒ "OSX" .app's :Macのアプリを便利、感動、面白をベースにほぼ日刊で紹介。 (11/26)
パーセント、%、percent でのカーソル移動 (vimエディタ話)
 ⇒ プログラミング言語 (10/11)
過去ログ
Profile
小見 拓
mail@nanasi.jp
小見と申します。
神奈川でデベロッパーやってます。
名無しのVIM使い

RSS 1.0


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。