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で持たせるだけで十分です。