TestPageを仕上げる
最後に、今まで作った二つのコンポーネントを使用するように、TestPageを変更したいと思います。
TestPage.html
<html> <head><title>TestPage</title></head> <body> <span jwcid="submitComponent"/> <hr/> <div align="center"> <span jwcid="messageListComponent"/> </div> </body> </html>
今までメッセージのリストのループを記述していた部分がなくなり、と記述するだけになりました。
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"> <component id="messageListComponent" type="MessageListComponent"> <binding name="parentMessageList" expression="allMessages"/> </component> <component id="submitComponent" type="SubmitComponent"/> </page-specification>
いままで嫌な感じで存在していたtempMessageというプロパティは必要なくなり、単純にMessageListComponentにallMessagesをバインドするだけになりました。
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.exp.Expression; import org.objectstyle.cayenne.exp.ExpressionFactory; import org.objectstyle.cayenne.query.SelectQuery; /** * テストページ * * @author toolkit * @version $Revision$ */ public class TestPage extends BasePage { private static final Log log = LogFactory.getLog(TestPage.class); /** * すべての親メッセージを投稿日時順にリストにして返します。 */ public List getAllMessages() { SelectQuery query = new SelectQuery("Message"); query.setLoggingLevel(Level.WARN); query.addOrdering("submitDate", false); Expression expression = ExpressionFactory.matchExp("parentId", null); query.setQualifier(expression); Visit visit = (Visit) getVisit(); DataContext context = visit.getDataContext(); List allDatas = context.performQuery(query); return allDatas; } }
abstractでアクセッサメソッドを定義していたtempMessageは削除し、クラス自体もabstractは廃止します。*1
結果的にgetAllMessagesメソッドが定義してあるだけになりました。
ここまで実装して、実際に動かしてみた例が以下のキャプチャです。(クリックで拡大)
分かりやすいようにMessageListComponentのテーブルボーダーを付けています。見栄えが良くないので、次からは外します。
この通り、親メッセージでループして、その親メッセージのもつ子メッセージがリスト表示されているのがお分かりかと思います。
次は、メッセージの削除機能を実装します。