Top
3-2. 描画前後のスクリプト


Documentation

3-2. 描画前後のスクリプト

描画前にスクリプトを実行する

描画のための準備処理をしたい場合、beforeRender タグを使うことで、ページの描画処理を開始する前に任意のスクリプトを実行できます。beforeRender タグのボディにスクリプトをそのまま書いてください。基本的に beforeRender は、request 内の値を別変数に入れ直すときなどに使います。

次の例では beforeRender で定義した変数を write プロセッサで出力します。

before_render.html
<html>
<body>
    <span id="past">dummy past time</span>
</body>
</html>
before_render.mayaa
<?xml version="1.0" encoding="UTF-8"?>
<m:mayaa xmlns:m="http://mayaa.seasar.org">
    <m:beforeRender>
        var cal = java.util.Calendar.getInstance();
        cal.set(java.util.Calendar.YEAR, 2000);
        var date = cal.getTime();
    </m:beforeRender>

    <m:write m:id="past" value="${ date }" />
</m:mayaa>

ブラウザで http://localhost:8080/mayaa/before_render.html にアクセスしてみましょう。

実行結果 (改行などは実際の実行結果と異なります)
<html>
<body>
    Thu Oct 20 21:02:03 JST 2000
</body>
</html>

実行結果は、beforeRender で準備した変数 date の値が表示されています。変数 date には、現在時刻の年を 2000 にしたものがに入ります。

また不等号など XML として意味のある文字を使う場合は、beforeRender のボディを CDATA 宣言するとエスケープする必要がなくなります。

<m:beforeRender><![CDATA[
    var sum = 0;
    for (var i = 0; i < 10; i++) {
        sum += i;
    }
]]></m:beforeRender>

<m:write m:id="result" value="${ sum }" />

描画後にスクリプトを実行する

ページの描画処理が終了した後に任意のスクリプトを実行できます。afterRender タグを使い、ボディにスクリプトをそのまま書いてください。beforeRender と同じく、CDATA 宣言すると不等号などをエスケープする必要がなくなります。

たとえば描画処理が終わった後にログを出力する場合、次のように書くことで実現できます。

<m:afterRender>
    Packages.org.example.Logger.log("rendered.");
</m:afterRender>

描画処理の後に何かをするという場面は多くないでしょうから、afterRender を使う場面は少ないでしょう。描画のための一時リソースを開放する処理など、特殊な処理が必要な場合に afterRender を使ってください。

コンポーネントやレイアウトを使う場合の実行順

コンポーネントやレイアウト、さらには default.mayaa でも beforeRenderafterRender を使うことができます。これらを組み合わせて使うには、どういう順番で実行されるかを意識する必要があります。

全体の設定である default.mayaa に書いた beforeRender は、他のすべての beforeRender よりも先に実行されます。そして default.mayaaafterRender は他のすべての afterRender よりも後に実行されます。

次にリクエストされたページの beforeRender が実行され、レイアウトを使っていればその次にレイアウトページの beforeRender が実行されます。全体の描画が終わったあと、レイアウトページの afterRender、リクエストされたページの afterRender が実行されます。

コンポーネントの beforeRender はそのコンポーネントを処理する直前に処理されます。その後にコンポーネントが描画されて afterRender が処理された後、コンポーネントを使うページの描画に戻ります。ひとつのコンポーネントページに複数のコンポーネントを定義している場合、そのひとつひとつに同じ beforeRenderafterRender が定義されていると考えてください。

■実行順イメージ

実行順のイメージを図 3-2-1 に示します。これはメインのページからコンポーネントをひとつとレイアウトを使っている単純な例です。流れを矢印で示し、何らかの処理が行われる部分を順番に数字で示しています。

図 3-2-1: beforeRender と afterRender の実行順

レイアウトの上でコンポーネントを使う場合やコンポーネントの上でコンポーネントを使う場合も、リクエストされたページの上でコンポーネントを使う場合と同様です。コンポーネントを描画する直前に beforeRender が実行され、コンポーネントの描画が終わった後で afterRender が実行されます。

Copyright (c) 2004-2009 the Seasar Foundation and others. all rights reserved.