url-mappingにハマる

web.xmlのjsp-configのurl-pattern で、どハマリ状態に。servlet-mappingのurl-patternとの併用にはお気をつけくださいませ。

結論からご報告

以下のように、パス毎にJSPコンフィグレーションを切り替えたい場合。

 <jsp-config>
  <jsp-property-group>
    <url-pattern>/customer/*</url-pattern>
    <include-prelude>/jspf/customerHeader.jspf</include-prelude>
  </jsp-property-group>
  <jsp-property-group>
    <url-pattern>/product/*</url-pattern>
    <include-prelude>/jspf/productHeader.jspf</include-prelude>
  </jsp-property-group>
 </jsp-config>

jsp-configがurl-patternを認識するためには、リクエストURLの拡張子は .jsp でなければなりません(たぶん)。よって、JSFやStrutsなどのservlet-mappingでは、

 <servlet-mapping>
  <servlet-name>Faces Servlet</servlet-name>
  <url-pattern>/faces/*</url-pattern><!-- OK -->
 </servlet-mapping>

などとしなければなりません。なぜなら、

 <servlet-mapping>
  <servlet-name>Faces Servlet</servlet-name>
  <url-pattern>*.jsf</url-pattern> <!-- NG -->
 </servlet-mapping>

と、servlet-mappingのurl-patternを拡張子で指定してしまうと、リクエストURLの拡張子は .jsp ではなくなるので、jsp-configは認識してくれないようです。

私の環境はTomcat5.5ですが、GlassFishでも同様の現象が起きます。たぶん仕様なんでしょう。けしてTomcatが悪いわけでも、バグがあるわけでもないようです。(ただしTomcat5.0にはバグがあるそうです。以下参照。)

気づいてみれば、なるほどそうかと思うけど、こんなことにハマるのはオレだけだろうか・・。同じところでハマッてこのページを見てくれる人がいたら、なんだかうれしいです。

以下、ハマッた過程の、だる~い日記です

JSF導入時、URLに余計な仮想パスをつけるのはいやだったので、以下のように設定。

 <servlet-mapping>
   <servlet-name>Faces Servlet</servlet-name>
   <url-pattern>*.jsf</url-pattern>
 </servlet-mapping>
 <jsp-config>
   <jsp-property-group>
     <url-pattern>*.jsp</url-pattern>
     <include-prelude>/jspf/header.jspf</include-prelude>
   </jsp-property-group>
 </jsp-config>

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日のロスとこの体力の消耗は、イタいっす。


コメント
匿名さん
2009/01/21
*.jspが生半可動く理由ってなんでしょう?

コメントしてください

closed.