タグ描画時のスクリプト - execプロセッサ

ループごとに少しだけ準備処理をするなど、タグを描画するタイミングでスクリプトを実行したい場合があるでしょう。その場合にはexecプロセッサを使います。 execプロセッサには JavaScriptファイルのパスを指定する src属性と、スクリプトを ${} 表記でそのまま記述する script 属性があります。

簡単な例

ごく簡単なサンプルで実際に使ってみましょう。m:execプロセッサでループ変数が偶数か奇数かを判定し、変数 evenodd に格納します。 さらにm:writeプロセッサを使ってループ変数の値と判定結果を出力します。

<html>
<body>
    <div id="loop">
        <div id="evenodd"><span id="value">dummy</span></div>
    </div>
</body>
</html>
<?xml version="1.0" encoding="UTF-8"?>
<m:mayaa xmlns:m="http://mayaa.seasar.org">

    <m:for m:id="loop" init="${ var i = 1 }"
            test="${ i &lt; 6 }" after="${ i += 1 }" />

    <m:exec m:id="evenodd" replace="false"
        script="${ var evenodd = (i % 2 == 0) ? 'even' : 'odd'; }" />

    <m:write m:id="value" value="${ i + ': ' + evenodd }" />

</m:mayaa>

変数 evenoddexec プロセッサと同じ階層でのみ有効です。id="value" の span タグは exec プロセッサのボディ内にある (内側の階層にある) と見なせますので、evenodd 変数を参照することができます。(※:1.1.0-beta5 以前では、exec プロセッサのボディ内でのみ有効でした) ブラウザで http://localhost:8080/mayaa/exec.html にアクセスしてみましょう。

実行結果
<html>
<body>
    <div id="evenodd">1: odd</div>
    <div id="evenodd">2: even</div>
    <div id="evenodd">3: odd</div>
    <div id="evenodd">4: even</div>
    <div id="evenodd">5: odd</div>
</body>
</html>

実行結果には、正しく evenodd 変数の内容が出力されました。

このサンプルだけで見ると意味がないように見えるかもしれませんが、たとえば配列の要素や計算結果を変数で定義しなおして、設定ファイルの見通しを良くするような使い方に効果を発揮します。

実用場面を考えてみましょう。request に入っているオブジェクトの深い位置へアクセスするには、object.getProperty().getChildren()[1].getValue() のように長い文でアクセスをすることになってしまいます。JavaScript の機能を使って短縮しても object.property.children[1].value でやはり分かりづらいです。

このようなときに var child = object.property.children[1] と変数宣言すれば、child.valuechild.name のように分かりやすくプロパティを参照できます。