ResPageを作る

返信ページには入力フォームと親メッセージが表示されているものとします。
これらはすでにコンポーネントとして作っていますので、新たに用意するものは特にありません。

ResPage.html

<html>
	<head><title>ResPage</title></head>
	<body>
		<div align="center">
			<span jwcid="messageComponent"/>
		</div>
		<hr/>
		<span jwcid="submitComponent"/>
	</body>
</html>

ページの上に引用元のメッセージが表示され(messageComponent)、下の方に入力フォーム(submitComponent)を表示します。

ResPage.jwc

<?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.ResPage">
    <property-specification name="parentMessage" type="bbs.data.Message" persistent="no"/>
	<property-specification name="resMessage" type="bbs.data.Message" persistent="no"/>
	
	<component id="messageComponent" type="MessageComponent">
		<binding name="message" expression="parentMessage"/>
	</component>

	<component id="submitComponent" type="SubmitComponent">
		<binding name="submitMessage" expression="resMessage"/>
	</component>
</page-specification>

このファイルも、とくに変わった所はありません。
MessageComponentにはparentMessageをバインドし、SubmitComponentにはresMessageをバインドすると言うものです。
ただ、これはあとで困った事になります・・・SubmitComponentにはを定義していないので、バインドできないんです・・・
まぁ、あとで対処するとして、ともかくこうしておきます。

ResPage.java

package bbs.view;

import org.apache.tapestry.html.BasePage;

import bbs.data.Message;

/**
 * 返信ページ
 * 
 * @author toolkit
 * @version $Revision$
 */
public abstract class ResPage extends BasePage {
	public abstract Message getParentMessage();
	public abstract void setParentMessage(Message parentMessage);
	public abstract Message getResMessage();
	public abstract void setResMessage(Message resMessage);
}

こうしておいて、MessageComponent内のresActionで

MessageComponent.java(抜粋)

	public void resAction(IRequestCycle rc) {
		ResPage nextPage = (ResPage) rc.getPage("ResPage");
		Message parent = getMessage();
		
		Message res = new Message();
		res.setDataContext(parent.getDataContext()); //DataContextを同じものにする
		res.setSubject("Re:" + parent.getSubject()); //parentのタイトルのアタマに「Re:」を付ける
		parent.addToChildren(res); //resをparentの子供に付け加える
		
		nextPage.setResMessage(res);
		nextPage.setParentMessage(parent);
		rc.activate(nextPage);
	}