32

私が理解していることから、Faces リクエスト ライフサイクルの Flash スコープ内に配置されたオブジェクトは、次の Faces リクエスト ライフサイクルで使用可能になり、その後クリアされます。

次の 2 つのページがあるとします。

page01.xhtml :

<h:form>
    <h:commandButton  action="#{page01Bean.action}" />
</h:form>

Page01Bean :

@ManagedBean
@RequestScoped
public class Page01Bean {

        public void action(){
            FacesContext.getCurrentInstance().getExternalContext().getFlash().put("fooKey", "fooValue");
        }

}

page02.xhtml :

<h:outputText value="#{flash.fooKey}"/> 

のボタンpage01.xhtmlがクリックされると、faces リクエスト ライフサイクル (ライフサイクル A など) が開始され、呼び出されたキーの下のフラッシュに値が設定されます。fooKey

次に、別のブラウザー タブを開いて参照し page02.xhtmlます。別の顔リクエスト ライフサイクル (ライフサイクル B など) がこのページのレンダリングを開始します。ライフサイクル B は以前のライフサイクルのフラッシュ スコープ (つまり、ライフサイクル A) にアクセスしfooValuepage02.xhtml. ただし、何も表示されません。

この例のフラッシュ スコープについて誤解していることを訂正してください。本当にありがとう

4

2 に答える 2

38

つまり、フラッシュ スコープに格納された変数はリダイレクト後も存続し、後で破棄されます。これは、Post-Redirect-Get パターンを実装するときに非常に便利です。

リダイレクトによって別のページに移動し、読み込み時に属性にアクセスしようとすると、そこに表示されます。その要求が完了すると、フラッシュ内の値は破棄されます。例えば:

あなたは page1.xhtml にいて、このようなメソッドで新しいページにリダイレクトする commandLink があります (注: 暗黙のナビゲーションを使用します)。

public String navigateToPageB() {
    FacesContext.getCurrentInstance().getExternalContext().getFlash().put("param1", "Hello World!");
    return "pageB?faces-redirect=true";
}

pageB.xhtml がレンダリングされると、次のような EL 式によってこれらの値にアクセスできます。

<h:outputLabel value="#{flash['param1']}" />

「Hello World!」が表示されます。以前に navigateToPageB に保存した文字列。

質問に関しては、エクスプローラーで新しいタブを開くと、前のタブでアクセスしていたのと同じコンテキストにアクセスしていないため、変数はそこで使用できません。

于 2012-06-25T17:40:43.007 に答える