ひがやすを技術ブログ

電通国際情報サービスのプログラマ

Tapestry入門記(5) Visit

前回Visitオブジェクトに軽く触れたので今回のテーマは、
Visitについてです。
Visitはセッション単位に作成されるユーザ定義のオブジェクトです。
Servlet APIに依存せずにテストもしやすくするという
Tapestryの配慮なのでしょう。
今回は、定番であるカウンターを作ってみます。
Visitオブジェクトは、アプリケーション仕様 or web.xmlで定義します。
今回は、アプリケーション仕様で定義します。


<property name="org.apache.tapestry.visit-class">
hello.Visit
</property>
Javaのコードは次のようになります。

package hello;

import java.io.Serializable;

public class Visit implements Serializable {

private int count_;

public int countUp() {
return ++count_;
}
}

セッション(実際はEngine)に格納されるのでSerializableをimplementsする
必要があります。
Visitをページクラスから利用するには次のようにIPage#getVisit()を使います。

package hello;

import org.apache.tapestry.html.BasePage;

public class Counter extends BasePage {

public int countUp() {
Visit visit = (Visit) getVisit();
return visit.countUp();
}
}

getEngine().getVisit()だとEngineにVisitがキャッシュされてないと
nullが返ってきます。最初はまりました。心より恥じる。
さて、次はCounter.htmlです。

counter:<span jwcid="counter"/><br />
<a href="#" jwcid="refresh">refresh</a>
Counter.pageはつぎのようになります。

<component id="counter" type="Insert">
<binding name="value" expression="countUp()"/>
</component>
<component id="refresh" type="PageLink">
<static-binding name="page">Counter</static-binding>
</component>
counterコンポーネントのexpression属性に注目してください。
ページのメソッドを呼び出すときにはcountUp()のように()をつけます。
前にページのプロパティは、プリミティブ型ではなく、ラッパークラスを
使ったほうがいいみたいと書いたのですが、Insertコンポーネント
使う場合はプリミティブ型でも問題ないようです。
これで、カウンターは完成です。Tomcat5は終了時にセッションを
保存してくれるようで、ブラウザをつなぎっぱなしで、
Tomcatを再起動するとカウンターの値が維持されました。