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のテーブルボーダーを付けています。見栄えが良くないので、次からは外します。
この通り、親メッセージでループして、その親メッセージのもつ子メッセージがリスト表示されているのがお分かりかと思います。


次は、メッセージの削除機能を実装します。

*1:そうしないとjava.lang.InstantiationExceptionが飛んでくる