MessageWithChildrenComponentを実装する
このコンポーネントはHTMLから見るのが分かりやすいかもしれません。
MessageWithChildrenComponent.html
<table width="100%" border="1"> <tr> <td align="center"> <span jwcid="parentMessage"/> <span jwcid="childrenLoop"> <table> <tr> <td width="50"> <br/> </td> <td> <span jwcid="childMessage"/> </td> </tr> </table> </span> </td> </tr> </table>
まず、バインドされた親メッセージが一番上にMessageComponentを使って表示しています。
次に、親が持つ子メッセージのリストをループして、子メッセージ一つ一つをMessageComponentを使って表示しています。
MessageWithChildrenComponent.jwc
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE component-specification PUBLIC "-//Apache Software Foundation//Tapestry Specification 3.0//EN" "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd"> <component-specification class="bbs.view.MessageWithChildrenComponent" allow-body="no" allow-informal-parameters="no"> <parameter name="parentMessage" type="bbs.data.Message" direction="in" required="yes"/> <property-specification name="childMessage" type="bbs.data.Message" persistent="no"/> <component id="childrenLoop" type="Foreach"> <binding name="source" expression="parentMessage.children"/> <binding name="value" expression="childMessage"/> </component> <component id="parentMessage" type="MessageComponent"> <binding name="message" expression="parentMessage"/> </component> <component id="childMessage" type="MessageComponent"> <binding name="message" expression="childMessage"/> </component> </component-specification>
MessageWithChildrenComponent.java
package bbs.view; import org.apache.tapestry.BaseComponent; import bbs.data.Message; /** * 返信メッセージ付きコンポーネント * * @author toolkit * @version $Revision$ */ public abstract class MessageWithChildrenComponent extends BaseComponent { public abstract Message getParentMessage(); public abstract void setParentMessage(Message parentMessage); public abstract Message getChildMessage(); public abstract void setChildMessage(Message childMessage); }
JavaクラスもMessageListComponentと同様に、アクセッサをabstractで持たせるだけで十分です。