EL式 (Expression Language) がなかなか便利なので、カスタムタグでも使えると良いなあと思って試してみたら、できた。
結論から言うと、JSTL1.0 と JSTL1.1 では、EL式の挙動が異なる。そのため、それぞれの環境に合わせて、タグのクラスを用意する必要がある。これ、見事にハマりました。
<dt:format date="${row.date}" />
このようにEL式を指定した場合、JSTL1.0では${row.date}という文字列のままカスタムタグに渡されるのに対し、JSTL1.1では式言語を評価した結果がカスタムタグに渡される。だから、両者を書き換えるならば、アクセッサメソッド(setter)の型から変える必要さえあるということになる。0.1違うだけなのに、スゴイ変化だ。そのフットワークの軽さはうらやましいぞ。
以下、それぞれのサンプルソースですよ。
■JSTL1.0
public class DateFormatTag extends TagSupport { // Stringで受ける private String date = null;
public setDate(String _date) { this.date = _date; }
public void release() { super.release(); this.date = null; }
public int doEndTag() throws JspException { // パラメータは、属性名・EL式・期待するクラス…の順 Date fmtDate = (Date) ExpressionEvaluatorManager.evaluate("date", date, Date.class, this, pageContext); // ここで fmtDate のフォーマット処理
return (EVAL_PAGE); } }
JSTL1.0 では、式言語がそのまま、「${row.data}」という表現でカスタムタグに渡る。そのためタグ側では、式言語を String 型で受け取り、ExpressionEvaluatorManager クラスを利用して、その式を評価しなければならない。ちと面倒くさい。
JSTL1.1では、そこが改善されて、式言語の評価結果がカスタムタグに渡る。なので、それぞれ期待する型、想定できない場合は Object 型で受け取ることになる。これを String で受けようとしていると、シリアライズの文字列がペロっと出て終わりなので、いけない。すいません、私はコレにハマりました。ううう。
■JSTL1.1
public class DateFormatTag extends TagSupport {
private Date date = null;
public setDate(Date _date) { this.date = _date; }
public void release() { super.release(); this.date = null; }
public int doEndTag() throws JspException { // ここで date のフォーマット処理
return (EVAL_PAGE); } }
ちなみに、EL式を使うので、TLD の rtexprvalue を true にするのをお忘れなく。お疲れさまでした。