4

ユーザー名とパスワードの入力とコマンドボタンを含む単純な login.xhtml facelet があります。コマンド ボタンにはaction="welcome"、welcome.xhtml フェイスレットを表示する結果が含まれているだけです。

私はJSFに非常に慣れていません。JSF ライフサイクルを読んで、ボタンをクリックすると、アプリケーション ライフサイクルが呼び出されてナビゲーションが処理され、welcome.xhtml がレンダリング (??) されます。welcome.xhtml が新しい facelet ライフサイクルを開始するかどうか、まだ混乱しています。

PS: URL がwelcome.xhtml に変更されていないことに気付きました。jsf ライフサイクルはリクエストにバインドされていますか?

4

1 に答える 1

3

はい、JSF ライフサイクルはリクエスト バウンドです。はい、結果はデフォルトで同じリクエストでレンダリングされます。

あなたを混乱させるキーは、HTTP サーブレット要求に関して「転送」対「リダイレクト」である可能性があります。

デフォルトでは、JSF はリクエストをターゲット ページに転送します。サーブレット API をよく知っている場合は、それが内部で次のことを行っていることを理解できます。

request.getRequestDispatcher("welcome.xhtml").forward(request, response);

このようにして、ターゲット ページは同じ要求オブジェクトにアクセスできます。ターゲット ページが、フォームが送信された (login.xhtml実際の) ページと異なる場合、ブラウザーのアドレス バーに変更が反映されません。

<redirect/>ただし、ナビゲーション ケースに を追加するかExternalContext#redirect()、Bean のアクション メソッドを呼び出すかfaces-redirect=true、ボタンのアクションにパラメータを追加することで JSF 2.0 の適切な方法で、リクエストをターゲット ページにリダイレクトするように JSF を構成できます。

<h:commandButton value="login" action="welcome?faces-redirect=true" />

いずれにせよ、サーブレット API 用語では次のことを行います。

response.sendRedirect("welcome.xhtml");

これは基本的に、指定された場所に対して真新しい GET リクエストを発行するようにクライアントに指示します。このようにして、最初のリクエストのリクエストスコープおよびビュースコープの Bean は破棄され、再作成されることに注意してください。

于 2010-07-27T16:46:29.673 に答える