Let's start Scheme

2012-04-19

JSP2.1と2.2の非互換ではまったこと

基本的には2.1→2.2でなんら問題は起きないはずなんだけど、起きた。しかも、解決方法みつからずの難問。

まずは以下のコードを見てほしい。
public class Foo implements Serializable {
  public FooEnum getEnum() {
    return new FooEnum();
  }
}
一見なんの変哲もないBeanである。実際何の変哲もない(勘のいい方はもう気づいたかも・・・)。
問題はこのBeanをJSPで使うと起きるのである。 以下がJSP。Fooのインスタンスfooをどっかから受け取っているという前提。
${foo.enum}
これ、JSP2.1ではOKで、JSP2.2ではNG。理由は'enum'は識別子として認識しないから。JSP2.2で書きたかったら以下のように直接メソッドを呼ぶ必要がある。
${foo.getEnum()}
問題はJSP2.1はメソッドの直接呼出しをサポートしていないということ。つまり、JSP2.1で合法にすると、JSP2.2では非合法になる。逆も同様。逃げ場なし。

どうしたか?直接Javaコードを書きなぐりましたよ・・・
開発環境をTomcat 6からTomcat 7にしたら発生した逃げ場のない不具合。そりゃTomcat 7だけサポートするなら別に問題ないんだけど、他のサーバー(JBossとか)がどのバージョンのJSPをサポートしているか分からないので、どれでも動くようにする必要があるんだよ・・・なんでJavaにはCみたいなマクロがないんだろう。バージョン違いの非互換をどうにかする方法がないなんて・・・

No comments:

Post a Comment