4

JSF 2.0 を使い始めようとしています。基本的なナビゲーションの例を試していますが、正しく機能していません。

ファイル構造は次のとおりです。

ここに画像の説明を入力

web.xml でマッピングを構成しました。

<!-- Change to "Production" when you are ready to deploy -->
<context-param>
    <param-name>javax.faces.PROJECT_STAGE</param-name>
    <param-value>Development</param-value>
</context-param>

<!-- Welcome page -->
<welcome-file-list>
    <welcome-file>index.xhtml</welcome-file>
</welcome-file-list>

<!-- JSF mapping -->
<servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

インデックス ページには 2 つのボタンがあり、クリックすると別のページに移動します。

faces-config.xml ファイルは、いくつかのナビゲーション ケースを定義します。

<!-- Configuration of navigation rules -->  
<navigation-rule>
    <from-view-id>/index.xhtml</from-view-id> 
    <navigation-case>
        <from-outcome>success</from-outcome>
        <to-view-id>/pages/success.xhtml</to-view-id>
    </navigation-case>
     <navigation-case>
        <from-outcome>error</from-outcome>
        <to-view-id>/pages/error.xhtml</to-view-id>
    </navigation-case>
</navigation-rule>

たとえば、次のボタンをクリックすると成功ページ (/pages/success.xhtml) に移動します。

<p:commandButton id="addUser" value="Add" action="#{userMB.addUser}" ajax="false"/>

これをデバッグしましたが、addUser の戻り値は間違いなく「成功」です。

コンテンツが変更されていることがわかるため、ページは success.xhtml に切り替わりますが、ブラウザーの URL は index.xhtml を指しています....

起動時: URL はlocalhost:8080/PROJECT/で、index.xhtml はありません。これはおそらく、ウェルカム ファイルとして構成したためです。上のボタンを押すと、URL はlocalhost:8080/PROJECT/index.xhtmlになります。

マッピングまたは相対パスで何かを台無しにしたと思います。唯一のマッピングは *.xhtml を使用する必要があるというアドバイスを見つけましたが、ページの複数のサブフォルダーに対処する理由と方法がよくわかりませんでした。

どんな助けでも大歓迎です、ありがとう

4

2 に答える 2

14

ページは success.xhtml に切り替わります。コンテンツが変更されていることがわかりますが、ブラウザーの URL は index.xhtml を指しています。

これは正常な動作です。HTMLは<form action>を指しているため/index.xhtml、フォームは正確にその URL に送信されますが、舞台裏では、応答は のコンテンツを表示しています/pages/success.xhtml

URL を変更する場合は、リダイレクトを実行する必要があります。問題のに追加することでそれを行うことができ<redirect/>ます<navigation-case>

<navigation-case>
    <from-outcome>success</from-outcome>
    <to-view-id>/pages/success.xhtml</to-view-id>
    <redirect/>
</navigation-case>

以下も参照してください。


具体的な問題とは関係ありませんが、ナビゲーションケースを使用するのは非常にJSF 1.xです。新しい JSF 2.0 暗黙的ナビゲーション機能の利用を検討してください。これにより、冗長な XML 地獄から解放されます。

public String addUser() {
    if (...) {
        return "/pages/success.xhtml?faces-redirect=true";
    } else {
        return "/pages/error.xhtml?faces-redirect=true";
    }
}

ただし、「成功」または「エラー」ページに移動する代わりに、顔メッセージを追加してから、戻るvoidか、またはその代わりにまったく同じページを再表示することをお勧めします。これは、実際の Web フォームの仕組みでもあります。nullもちろん、「Hello World」を実行している場合を除きます。

于 2012-10-05T12:19:04.100 に答える
-1

ナビゲーションルールでこれを試してください

<navigation-rule>
<from-view-id>/index.jsf</from-view-id> 
<navigation-case>
    <from-outcome>success</from-outcome>
    <to-view-id>/pages/success.jsf</to-view-id>
</navigation-case>
 <navigation-case>
    <from-outcome>error</from-outcome>
    <to-view-id>/pages/error.jsf</to-view-id>
</navigation-case>

于 2012-10-05T11:59:49.917 に答える