ひがやすを技術ブログ

電通国際情報サービスのプログラマ

Tapestry入門記(6) Radio, Asset

Tapestry in ActionのHangmanってどうしてあんなに難しいんでしょうね。
最初の例なのに。
今回は、Seasarのバナーも出たことなので、Radioの選択に
あわせて、イメージを青シーサー、赤シーサーに
切り替えられるようにします。
最初は、RadioSeasar.htmlです。


<form jwcid="@Form" listener="ognl:listeners.refresh">
<span jwcid="group">
<input type="radio" jwcid="red"/>Red Seasar
<input type="radio" jwcid="blue"/>Blue Seasar
</span>
<input type="submit" value="refresh" /><br />
<img jwcid="selectedImage" src="../images/blueseasar.gif" />
</form>
Radioコンポーネントを使うためには、Formコンポーネントも一緒
に使う必要があります。formタグだけではだめなようです。
Tapestryに怒られました。心より恥じる。
Radioコンポーネントを使うためには、Radioコンポーネントのタグを
RadioGroupコンポーネントのタグで囲う必要があります。
jwcidがgroupのものがそうです。
今度は、RadioSeasar.pageです。

<component id="group" type="RadioGroup">
<binding name="selected" expression="selected" />
</component>
<component id="red" type="Radio">
<binding name="value" expression="@hello.RadioSeasar@RED"/>
</component>
<component id="blue" type="Radio">
<binding name="value" expression="@hello.RadioSeasar@BLUE"/>
</component>
<component id="selectedImage" type="Image">
<binding name="image" expression="selectedImage"/>
</component>

<context-asset name="redseasar" path="images/redseasar.gif" />
<context-asset name="blueseasar" path="images/blueseasar.gif" />

groupコンポーネントがRadioGroupです。
このコンポーネントのselectedで指定した値と、
Radioコンポーネントvalueが一致している場合、選択状態
(checked="checked")になります。
OGNLでstaticフィールドを参照するには、
@hello.RadioSeasar@REDのようにします。
後、注目すべきは、context-assetタグです。
イメージなどのリソースに名前をつけて管理できるようにします。
リソースの物理的な位置が変わってもソースに影響が出ないようにする
ためでしょう。
最後は、RadioSeasar.javaです。

package hello;

import org.apache.tapestry.IAsset;
import org.apache.tapestry.IRequestCycle;
import org.apache.tapestry.html.BasePage;

public class RadioSeasar extends BasePage {

public static final int RED = 0;
public static final int BLUE = 1;

private int selected_ = BLUE;

public int getSelected() {
return selected_;
}

public void setSelected(int selected) {
selected_ = selected;
}

public void refresh(IRequestCycle cycle) {
}

public IAsset getSelectedImage() {
if (selected_ == RED) {
return getAsset("redseasar");
} else {
return getAsset("blueseasar");
}
}
}

groupコンポーネントの定義で、selectedにognl:selectedが
指定されていたことを思い出してください。
最初、getSelected()はBLUEを返すので、画面が最初に
表示されるときには、青シーサーが選択状態になります。
次にselectedImageコンポーネントのimageパラメータに
ognl:selectedImageが指定されていたことを思い出してください。
getSelectedImage()で選択状態に応じて
IPage#getAsset("Asset名")でIAssetを返すことにより
イメージを表示させることができます。