読者です 読者をやめる 読者になる 読者になる

Hedgehog Note

日々の開発メモです。

FacesServletのurl-patternに何を設定するか

タイトルの件について書いてみます。

JSFを使ってみようと思って、初心者の自分はここで少し混乱しました。知ってる人からすると当たり前なんでしょうけど、入門者には意外とわかりづらい。色々調べた結果をまとめました。間違いがあればご指摘ください。

何がわかりづらい?

試しに「JSF web.xml」や「FacesServlet url-pattern」等、ありがちなキーワードでGoogle先生に聞いてみます。するとどうでしょう。

  • <url-pattern>には*.facesを指定する
  • <url-pattern>には/faces/*を指定する
  • <url-pattern>には*.jsfを指定する
  • <url-pattern>には*.xhtmlを指定する

色々出てくるけど違いは何なんだ・・・。
接頭辞の/faces/*はともかく、他はただの好みの問題なのか?

と、少なくとも自分はそうなりました。
Servletの登録自体はどれも間違っていないことが事態をより深刻化させます。

原因

なぜこんなにやり方がいっぱいあるのか。
その疑問を解消してくれた記事がこちらです。

stackoverflow.com

どうやら古いやり方(JSF 1.x)と今のやり方(JSF 2.x)がごっちゃになっているということのようです。歴史を知らない新参には混沌とした状態ですね。

この記事と前述の設定を突き合わせると、

  • <url-pattern>には*.facesを指定する
  • <url-pattern>には/faces/*を指定する

JSF 1.x時代のもの。使えるけど今風ではないっぽい。
また、前者であればURLの.facesを.xhtmlに変えてアクセスすると生のFaceletsが見えてしまうのでその対策が必要です。後者もURLから/facesを抜くと直接Faceletsへアクセスできてしまうので注意。
※/faces/*の指定はJSFのサンプル等で今も使われている様子。

  • <url-pattern>には*.jsfを指定する

広く使われているらしい。
これも*.facesと同様にFaceletsへの直アクセス対策が必要です。ちなみに*.facesと*.jsfの違いはわかりませんでした。どこかで時代の節目があったのか、ただの派閥的な話なのか・・・。

  • <url-pattern>には*.xhtmlを指定する

JSF 2.x時代のもの。昔はFacesServletの仕組み上指定できなかったらしい。
この方法であれば生のFaceletsを見られることはない。

結論

*.xhtmlを指定するのが良さそうですね。

補足

*.facesや*.jsfを使用する場合にFaceletsへの直接アクセスを防ぐ方法は下記で紹介されています。

den2sn.hatenablog.com