7

ビュー スコープ Bean に保存された一部のデータを、別のビュー スコープ Bean で使用する必要があります。

@ManagedBean
@ViewScoped
public class Attivita implements Serializable {
    //
}

@ManagedBean
@ViewScoped
public class Nota implements Serializable {

    @ManagedProperty("#{attivita}")
    private Attivita attivita;

    // Getter and setter.
}

さて、おそらくそれに関する私の理論はまだかなり貧弱ですが、#{attivita}が注入されると、Attivitaコンストラクターが呼び出され、別のインスタンスが作成されることに気付きました。それは正しい行動ですか?新しいインスタンスを作成せずに、同じインスタンスを参照したい場合はどうなりますか?

4

2 に答える 2

14

これは、ポストバックで 1 つのビューから別のビューに移動している場合に発生します。ビュー スコープの Bean は、リクエストではなくビューに結び付けられます。したがって、新しいビューに移動すると、ビュー スコープ Bean の新しいインスタンスが取得されます。以前のビューに関連付けられている同じ Bean インスタンスは再利用されません。

attivitaBean は初期ビューで作成され、ポストバックで再利用されることを理解しています。nota移動先の新しいビューに Bean が関連付けられていることを理解しています。注入するattivitaと、まったく同じリクエストに別のインスタンスがあったとしても、単純に新しい個別のインスタンスが取得されます。これはすべて予想される (そして確かに少し直観的でない) 動作です。

これに対する標準の JSF ソリューションはありません。CDI はこれを解決し@ConversationScoped(Bean は、明示的に存続するように指示している限り存続します)、CDI 拡張機能 MyFaces CODI はさらに進んでいます@ViewAccessScoped(ナビゲートされたビューがそれを参照している限り、Bean は存続します)。

ただし、Bean をリクエストスコープの属性として保存することで、これを回避できます。

@ManagedBean
@ViewScoped
public class Attivita implements Serializable {

    public String submit() {
        FacesContext.getCurrentInstance().getExternalContext()
            .getRequestMap().put("attivita", this);
        return "nota";
    }

}

@ManagedBean
@ViewScoped
public class Nota implements Serializable {

    private Attivita attivita;

    @PostConstruct
    public void init() {
        attivita = (Attivita) FacesContext.getCurrentInstance().getExternalContext()
            .getRequestMap().get("attivita");
    }

}

これはかなりハックであることに注意してください。具体的な機能要件によっては、より良い解決策があるかもしれません。また、ビューでは目的の Bean インスタンスを asではなくasとしてnota参照する必要があることに注意してください。これは、前に説明した理由により、新しい別のインスタンスが得られるためです。Attivita#{nota.attivita}#{attivita}

于 2013-01-09T12:10:35.220 に答える
1

あなたのattivitaBeanは@ViewScopedそうであり、それはあなたのインスタンスがセッションで保持されることを保証しません. @SessionScoped豆が必要です。attivitaただし、何らかの理由で必要な場合は@ViewScoped、他の方法でパラメーターを渡すことができます。たとえば、それらの間で他の Beanを使用viewParamまたは使用します。@SessionScoped

ページ パラメータ

http://mkblog.exadel.com/2010/07/learning-jsf2-page-params-and-page-actions/

JSF 2 マネージド Bean スコープ

http://balusc.blogspot.com.es/2011/09/communication-in-jsf-20.html#ManagedBeanScopes

于 2013-01-09T10:39:09.580 に答える