[Java]テンプレートエンジン `Mayaa`

ビュー技術の mayaa のメモ…こやつはテンプレートからロジックを完全分離するための Seasar2 系だけど Seasar2 に依存しないテンプレートエンジンです。まやーは沖縄語で猫を意味する。Java では他に Tapestory とか Wicket なんてのがあるらしいけど勉強不足ゆえ知らない。

リンク

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 &lt; 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 にインクルードする。 doRenderinsert プロセッサにより割り当てを行う。

を参照

レイアウト共有

コンポーネントとは逆に、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.mayaam: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:elementname 属性に指定した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"

Share