MessageオブジェクトをTapestryで表示する(その4)
次に、MessageComponentを使用する、TestPageページを作ってみましょう。
TestPageのHTMLはこんな感じになりました。
TestPage.html
<html> <head><title>TestPage</title></head> <body> <span jwcid="messageLoop"> <span jwcid="messageComponent"/> </span> </body> </html>
コンポーネント化をしたために、非常にシンプルです。
TestPage.pageはこんな感じになりました。
TestPage.page
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE page-specification PUBLIC "-//Apache Software Foundation//Tapestry Specification 3.0//EN" "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd"> <page-specification class="bbs.view.TestPage"> <property-specification name="tempMessage" type="bbs.data.Message" persistent="no"/> <!-- ループ --> <component id="messageLoop" type="Foreach"> <binding name="source" expression="allMessages"/> <binding name="value" expression="tempMessage"/> </component> <!-- MessageComponent --> <component id="messageComponent" type="MessageComponent"> <binding name="message" expression="tempMessage"/> </component> </page-specification>
messageLoopはForeachコンポーネントを使用しています。
WebObjectsで言う所のWORepetitionです。
sourceにはMessageのリストを、valueには一時的なMessageオブジェクトを保管するためのtempMessage変数にバインドします。
このtempMessageは、またまたTapestryにお任せして自分で実装するのはやめる事にします。
tempMessageは外部からバインドされるわけでは無いので、
そして、先ほどのMessageComponentを早速使っています。
MessageComponentにはmessage属性のバインドが必須なので、忘れずにtempMessageがバインドします。
最後に、TestPage.javaです。
TestPage.java
package bbs.view; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.log4j.Level; import org.apache.tapestry.html.BasePage; import org.objectstyle.cayenne.access.DataContext; import org.objectstyle.cayenne.conf.Configuration; import org.objectstyle.cayenne.query.SelectQuery; import bbs.data.Message; /** * テストページ * * @author toolkit * @version $Revision$ */ public abstract class TestPage extends BasePage { private static final Log log = LogFactory.getLog(TestPage.class); public abstract Message getTempMessage(); public abstract void setTempMessage(Message message); /** * すべてのメッセージオブジェクトを投稿日時順にリストにして返します。 */ public List getAllMessages() { SelectQuery query = new SelectQuery("Message"); query.setLoggingLevel(Level.WARN); query.addOrdering("submitDate", false); DataContext context = Configuration.getSharedConfiguration().getDomain().createDataContext(); List allDatas = context.performQuery(query); return allDatas; } }
tempMessageのgetter、setterの抽象メソッドを定義します。
実際に動かしてみたのが以下です。(クリックで拡大)
このようにして、コンポーネント化する事に成功しました。
これからこのコンポーネントをアチコチで使い回す事になります。
*1:この理解はあっているのか結構怪しい・・・