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は外部からバインドされるわけでは無いので、で定義します。*1

そして、先ほどの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:この理解はあっているのか結構怪しい・・・