0

このコードは完全に単純化されていますが、私の問題を再現しています。

BackingBean.java

public String reload(){
    System.out.println(FacesContext.getCurrentInstance()
            .getViewRoot().getLocale());
    return "test";
}

public void setLocale(){
    System.out.println("locale changed!");
    FacesContext.getCurrentInstance()
            .getViewRoot().setLocale(Locale.FRANCE);
}

test.xhtml

<h:form>
    <h:commandLink action="#{backingBean.reload}" value="reload page"/>
</h:form>
<h:form>
   <h:commandLink action="#{backingBean.setLocale}" value="change locale"/>
</h:form>

出力:

en
locale changed!
fr_FR
en

ロケールを変更してからメソッドを2回呼び出すとreload、ロケールはデフォルトにリセットされますenlocaleリセットの理由は何ですか?また、他のページに転送する場合にのみ発生します。reloadメソッドをに変更してもvoid、ロケールはfrそのままです。

public void reload(){
    System.out.println(FacesContext.getCurrentInstance()
            .getViewRoot().getLocale());
}

出力:

en
locale changed!
fr_FR
fr_FR

ただし、2回転送すると、ロケールはに戻されますen

4

1 に答える 1

5

ビュー ロケールはセッション スコープに記憶されません。これはビュー スコープで記憶されます (ビュー自体がビュー スコープ全体を表します!)。

セッション スコープでロケールを覚えておく必要がある場合は、セッション スコープのマネージド Bean を作成し、それ<f:view locale>をマスター テンプレートのプロパティとして参照する必要があります。

<f:view locale="#{localeManager.locale}">

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

于 2013-01-22T17:29:42.450 に答える