目次
ビュー技術の mayaa
のメモ…こやつはテンプレートからロジックを完全分離するための Seasar2
系だけど Seasar2
に依存しないテンプレートエンジンです。まやーは沖縄語で猫を意味する。Java
では他に Tapestory
とか Wicket
なんてのがあるらしいけど勉強不足ゆえ知らない。
リンク
Documentation - JavaServer Templates "Mayaa"
とりあえずココを読んで覚えた。4-1. Mayaa core
プロセッサ リファレンス : Documentation - JavaServer Templates "Mayaa"
リファレンス。ひと通り目を通した。
m:write
要素を指定したテキストで置換する
<m:write m:id="xxx" value="HTML Contents" />
id="xxx"
の要素が value
の値に書き換えられる。
書き換えられた要素自体は消えてなくなる。
要素の中身だけを書き換えたい場合は、 replace="false"
を指定する。
<m:write m:id="xxx" value="${ 1 + 2 }" replace="false" />
m:inject
HTML
上に直接 mayaa
を記述する
<span m:inject="m:write" value="hoge hoge" />
直接記述と .mayaa
の両方を混在させることも可能。
ただ html
からロジックを分離するためのテンプレートでこれを使うのは微妙。
m:if
条件付き実行
<m:if id="xxx" test="${false}">
<m:write value="xxx" />
</m:if>
test
の結果が true
なら中身を実行する。
上の場合、対応するHTML要素は出力されない。
excapeXml="false"
XMLエスケープの解除
<m:write m:id="xxx" value="<tag>" escapeXml="false" />
escapeXml="false"
とすることでエスケープが実行されなくなる。
m:for
繰り返し
<span id="loop">
<span id="mesasge">dummy message</span>
</span>
<m:for id="loop"
init="${ var i = 0 }"
test="${ i < 5 }"
after="${ i++ }" />
<m:write id="mesasge" value="${items[i]} " escapeXml="false" />
var
で変数宣言できる。
m:foreach
繰り返し
<m:forEach m:id="loop" items="${dtoItems}" var="dto"/>
とまぁこんな感じ。items
のところを ${ ~ }
で囲まないとダメ…というかこれに気づかなくてハマった…
JSTL core
のタグを使う
<m:mayaa xmlns:m="http://mayaa.seasar.org"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<c:out m:id="xxx" value="xxx" m:replace="false"/>
</m:mayaa>
上は m:write
と同様に機能する。
m:write
のときは replace="false"
としていたが
この場合は省略できないため m:replace="false"
と記述する。
m:doRender, m:insert
HTML
部品
コンポーネントを HTML
にインクルードする。
doRender
と insert
プロセッサにより割り当てを行う。
- 2-5. HTML 部品 (静的) : Documentation - JavaServer Templates "Mayaa"
- 2-6. HTML 部品 (動的) : Documentation - JavaServer Templates "Mayaa"
- Seasar Conference 2006 Autumn のプレゼンテーション
を参照
レイアウト共有
コンポーネントとは逆に、HTML
をレイアウトというコンポーネントにインクルードする。
default.mayaa
すべてのページの共通設定を記述する特別な mayaa
そのページの設定と対象要素の id
がかぶった場合は default.mayaa
はその部分について無視される。
m:beforeRender
描画前のスクリプト実行
<m:beforeRender>
<![CDATA[
function p(obj) {
java.lang.System.out.println("" + obj);
}
]]>
</m:beforeRender>
不等号などのエスケープしたくない場合は CDATA
宣言で囲む。
<m:beforeRender>
var f = {
h: Packages.org.seasar.struts.taglib.S2Functions.h,
u: Packages.org.seasar.struts.taglib.S2Functions.u,
url: Packages.org.seasar.struts.taglib.S2Functions.url,
};
</m:beforeRender>
<m:beforeRender>
var foo = "foo";
foo += "bar";
</m:beforeRender>
<m:echo m:id="name">${ f.h(foo) }</m:echo>
※EL式のファンクションはMayaaではRhino呼び出しで代用 - ooharakの日記
SAStruts
で使える f:h
みたいな EL
関数は Mayaa
ではそのままの記述では使えなくて、default.mayaa
の m:beforeRender
などで関数へのショートカットっぽいものを用意しておくことで似たようなことができる。ただし コロン じゃなくて ドット で繋ぐから間違えないように…うん、間違えてハマったんだ…
m:afterRender
描画後のスクリプト実行
<m:afterRender>
Packages.org.example.Logger.log("rendered.");
</m:afterRender>
*****Render
がどのような順番で実行されるかは 3-2. 描画前後のスクリプト : Documentation - JavaServer Templates "Mayaa" を読む。
m:exec
プロセッサ
3-3. タグ描画時のスクリプト : Documentation - JavaServer Templates "Mayaa"
描画前にロジック実行できる。
m:echo
で属性のみを置き換える
<m:echo m:id="xxx">
<m:attribute name="置き換え対象の属性名" value="置き換える値" />
</m:echo>
m:attribute
で属性を追加・置換する(元のテンプレートに属性が存在する場合は置き換え)
参考:3-4. 属性のみを置き換える : Documentation - JavaServer Templates "Mayaa"
m:element
でHTML要素を出力・置換
<m:element m:id="xxx" name="img">
<m:attribute name="src" value="${f.url('/xxx.png')}" />
<m:attribute name="hoge" value="hage" />
</m:element>
m:element
の name
属性に指定したHTML要素を出力する。
m:with
プロセッサ
複数のプロセッサをまとめる
<m:with m:id="xxx">
<m:write value="foo" />
<m:write value="bar" />
</m:with>
m:null
対象を出力しない。
<m:null m:xpath="//div[@class='dummy']" />
m:templateSuffix
テンプレートの切り替え
3-10. テンプレート切り替え : Documentation - JavaServer Templates "Mayaa"