以下のように、パス毎にJSPコンフィグレーションを切り替えたい場合。
jsp-configがurl-patternを認識するためには、リクエストURLの拡張子は .jsp でなければなりません(たぶん)。よって、JSFやStrutsなどのservlet-mappingでは、
などとしなければなりません。なぜなら、
と、servlet-mappingのurl-patternを拡張子で指定してしまうと、リクエストURLの拡張子は .jsp ではなくなるので、jsp-configは認識してくれないようです。
私の環境はTomcat5.5ですが、GlassFishでも同様の現象が起きます。たぶん仕様なんでしょう。けしてTomcatが悪いわけでも、バグがあるわけでもないようです。(ただしTomcat5.0にはバグがあるそうです。以下参照。)
気づいてみれば、なるほどそうかと思うけど、こんなことにハマるのはオレだけだろうか・・。同じところでハマッてこのページを見てくれる人がいたら、なんだかうれしいです。
JSF導入時、URLに余計な仮想パスをつけるのはいやだったので、以下のように設定。
jsp-config の url-patternが「*.jsp」の場合に限り、生半可、問題なく動作する。これが落とし穴。見事に転落していくことに・・・
この状態から、jsp-configのurl-patternを「/pass/*」に変更したところ、とたんに動かなくなる。jsp-configを使ってHTMLをレイアウトしようとしていたので、ここは動いてもらわなくては困る。締め切りが近づいていたので焦る。
ググったところ、Tomcat5.0のjasperコンパイラのバグが、この現象と同じ動きをするそうだ。
しかし自分の環境はTomcat5.5、既にこのバグは修正されているはず。でも「いちおう最新のjasper使ってみよう」と思ったのが、運のつき。
jasperの最新版をコンパイルするために、SVNクライアントをインストールしてチェックアウト。いつまでもチェックアウトが終わらず、よくみたら、Tomcat全バージョン全ブランチをチェックアウトしてたっ。
あまりにも急激にファイルが増えてPCがハングする。全部削除してデフラグ、この作業、3時間。
とりあえずTomcat5.5の最新だけをチェックアウトして、ビルド。
ビルドエラーの原因を探り再ビルド。リンク切れのライブラリを探して再ビルド・・・ようやくビルドしたjasperを、Tomcatにインストール!
・・何もかわらない。
今度は、Tomcat6.0をビルド、ビルド・・・ようやくビルドした最新のjasper。ずいぶん5.5とはファイル名も構成も変わっていたが、不安を胸にTomcat5.5にインストール。
ClassNotFoundException: org.apache.juli.log~ juliってなんじゃ?探す、探す。インストールして参照は解決。
が、結局、意味不明の内部エラーで、全く動かず。
jsp-configをあきらめて他のレイアウトフレームワークを使おうかと悩みつつも、Jasperコンパイラのソースコードを読み始める。ソースコードを弄っていろいろ実験。それでようやく、冒頭の、単純なことに気づいたのでした。
ここまでの作業、丸2日。動く前に考えろってなぁ~。
2日のロスとこの体力の消耗は、イタいっす。