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使って、です。