web.xmlのservlet-mappingの挙動
無限ループの原因は相変わらずよくわかってないけど、servlet-mappingの挙動はわかってきた。
たとえば、
<servlet-mapping> <servlet-name>FacesServlet</servlet-name> <url-pattern>/faces/*</url-pattern> </servlet-mapping>
とかいて、
http://localhost:8080/test/faces/test.jsp
とアクセスする。(webappのルートURLは/test)
このときにこのURLに対応するJSPファイルの格納場所は、
test-project/ (APのルートディレクトリ) └test.jsp
になる、という挙動になっている。
で、なんで「faces」が無視されるの?
素直に
test-project/ (APのルートディレクトリ) └faces/ └test.jsp
に対応すればわかりやすいと思うんだけど。
これはFacesServletの実装依存なのかな?それともweb.xmlでのservlet-mapping一般の挙動?
なんか納得いかないなぁ。
それに
<servlet-mapping> <servlet-name>FacesServlet</servlet-name> <url-pattern>/faces/test.jsp</url-pattern> </servlet-mapping>
ってピンポイントで書いたときに、
http://localhost:8080/test/faces/test.jsp
とアクセスすると、例の無限ループが始まるし。
ぜんぜん納得いかないー。
まず素のJSFでがんばってからS2JSFにすすもうと思ってるんだけど、なんか心がくじけそう。
追記:
web.xml <servlet-mapping> <servlet-name>FacesServlet</servlet-name> <url-pattern>*.jsp</url-pattern> </servlet-mapping> アクセスURL http://localhost:8080/test/test.jsp 結果 無限ループ
web.xml <context-param> <param-name>javax.faces.DEFAULT_SUFFIX</param-name> <param-value>.jsf</param-value> </context-param> <servlet-mapping> <servlet-name>FacesServlet</servlet-name> <url-pattern>*.jsf</url-pattern> </servlet-mapping> アクセスURL http://localhost:8080/test/test.jsf 結果 無限ループ
また、最初のweb.xml設定
<servlet-mapping> <servlet-name>FacesServlet</servlet-name> <url-pattern>/faces/*</url-pattern> </servlet-mapping>
で、faces-context.xmlに書く別ページのURLは
<navigation-rule> <navigation-case> <from-outcome>hoge</from-outcome> <to-view-id>/faces/hoge.jsp</to-view-id> <redirect/> </navigation-case> </navigation-rule> <navigation-rule> <navigation-case> <from-outcome>foo</from-outcome> <to-view-id>/faces/pages/foo.jsp</to-view-id> </navigation-case> </navigation-rule>
のようにかけば、以下のようなファイル配置で正常に遷移可能。
test-project/ (APのルートディレクトリ) ├hoge.jsp └pages/ └foo.jsp
次はちょっと複雑。
同じく最初のweb.xml設定で、
<jsp:forward page="/faces/pages/hoge.jsp" />
というindex.jspを作成して、
test-project/ (APのルートディレクトリ) ├index.jsp ├bar.jsp └pages/ ├hoge.jsp └foo.jsp
のようにディレクトリ配置して、
http://localhost:8080/test/
とアクセスすると、ブラウザのURL欄は
http://localhost:8080/test/
のまま、hoge.jspが表示される。
で、hoge.jspからfoo.jspとbarに遷移できるようにjsfタグを書いて、
対応するようにfaces-context.xmlを
<navigation-rule> <navigation-case> <from-outcome>foo</from-outcome> <to-view-id>/faces/pages/foo.jsp</to-view-id> <redirect/> </navigation-case> </navigation-rule> <navigation-rule> <navigation-case> <from-outcome>bar</from-outcome> <to-view-id>/faces/bar.jsp</to-view-id> </navigation-case> </navigation-rule>
と書いておく。
で、hoge.jspでfoo.jspに遷移すると、画面遷移は成功して、ブラウザのURL欄は
http://localhost:8080/test/faces/pages/foo.jsp
となり、、hoge.jspに戻って今度はbar.jspに遷移すると、画面遷移は成功して、ブラウザのURL欄は
http://localhost:8080/test/faces/faces/bar.jsp
となる。
facesがダブるんですよ。
なんかおかしいと思うんだけどなー。やはり納得いかん。
あ、JSF実装はmyfaces-1.1.0使って、です。