Top
A-1. カスタムタグの注意点


Documentation

Appendix 1. カスタムタグの注意点

Mayaa で JSP カスタムタグを利用する場合、JSP カスタムタグの仕様と異なる点があります。

JSTL を使う場合に注意する点は、動的な値の扱い方の違い、スクリプト変数のスコープの違いの 2 点です。

動的な値の扱い方の違い

JSP との大きな違いは、動的な値の扱い方です。JSP カスタムタグの動的な値の扱い方は 3 種類あります。それぞれの場合について、JSP と Mayaa の違いを説明します。

■RT 版 (JSTL 1.0)

Mayaa が動的な値を処理します。

RT 版とは、動的な値に Scriptlet を使うものです。TLD で rtexprvaluetrue が設定されている属性に Scriptlet を使えます。たとえば次のような書き方をします。

<c:out value="<%= name %>" />

Mayaa では Scriptlet の位置に ${ .. } の形式でスクリプトを書きます。評価結果がカスタムタグに渡ることは JSP と同じです。

<c:out value="${ name }" />

Mayaa で RT 版を使う場合、動的な値は ${ .. } の形式でスクリプトを記述してください。

■JSP 1.2 EL 版 (JSTL 1.0)

カスタムタグが動的な値を処理します。

EL 版とは、動的な値にカスタムタグの式言語を使うものです。TLD ですべての属性に rtexprvaluefalse が設定されています。たとえば次のような書き方をします。

<c:out value="${ name }" />

JSP 1.2 EL 版では、文字列のままカスタムタグに渡され、カスタムタグの処理として式言語の評価が行われます。従って JSP 1.2 EL 版の動作は JSP と Mayaa に違いはありません。ただし、Mayaa のスクリプトと記述方法が同じなため混同しないよう注意してください。

Mayaa で JSP 1.2 EL 版を使う場合、${ .. } の中には JSP 1.2 仕様の EL を記述してください。

■JSP 2.0 EL 版 (JSTL 1.1)

Mayaa が動的な値を処理します。

JSP 2.0 EL 版は JSP 1.2 EL 版と違い、式言語の評価を JSP コンテナが行います。rtexprvaluetrue が設定されている属性に式言語を使えます。Mayaa は JSP コンテナとして振舞いますので、式言語の評価も Mayaa の役目になります。Mayaa で式言語にあたるのはスクリプトですから、${ .. } という記述を Mayaa がスクリプトとして評価します。従って Mayaa の場合、RT 版と JSP 2.0 EL 版で動的な値の扱い方は同じです。

Mayaa で JSP 2.0 EL 版を使う場合、${ .. } は Mayaa のスクリプトとして記述してください。

■Mayaa のスクリプトと式言語の違い

Mayaa のスクリプトは JavaScript (ECMA Script: 実装は Rhino (http://www.mozilla.org/rhino/)) です。文法は当然 Java と異なりますが、それ以外にも最終結果として Java のオブジェクトまたはプリミティブ値として返すときに期待する動作と異なる場合があります。

たとえば「スクリプトでオブジェクトを出力する」の例では、Mayaa 1.1.2 以前の場合、結果として「3」を期待したところ「3.0」が返ってきました。これは JSP カスタムタグが Object 型を受け取るように作られているために型を決定できず、最も精度の高い double で渡していることが原因です。Mayaa 1.1.3 にて Java ←→ JavaScript 間の変換時は元の型が維持されるよう修正しましたが、JavaScript 内で Object 型の引数に対して Number を渡す場合は、同様の問題が発生します。

この例の場合に限れば、文字列に変換した後で渡す fmt:numberFormat を使うなどの回避策があります。式言語の暗黙的な動作を期待しているカスタムタグの場合はこのような回避策を取る必要があるかもしれません。

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