2

私は次のようなバッキングBeanを持っています:

@Named
@RequestScoped
public class ClientNewBackingBean {

    @Inject
    private ClientFacade facade;
    private Client client;

このClientクラスにはList<Child> childrenList、とりわけ属性があります。Clientで設定するchildrenListと、新しいものを作成できますnew ArrayList()

ビューには、入力テキストフィールドとAdd Childボタンがあります。ボタンには、次のようにactionListener=#{clientNewBackingBean.addChild()}実装された属性があります。

public void addChild() {

    if(client.getChildrenList() == null) {
        client.getChildrenList(new ArrayList());
    }

    Child c = new Child("John Doe");

    client.getChildrenList().add(c);
}

ボタンがクリックされるたびAdd Childに、Beanが再作成され、ビューにはJohn Doeの子が1つだけ表示されます(Requestスコープであるため)。BeanスコープをSessionに変更する以外に、これを解決する別の方法はありますか?

4

2 に答える 2

9

標準のJSFBean管理アノテーションを使用している場合は@ManagedBean、Beanをビュースコープに配置するだけで解決できます@ViewScoped

@ManagedBean
@ViewScoped
public class ClientNewBackingBean implements Serializable {

    @EJB
    private ClientFacade facade;

    // ...

CDIに@ViewScopedは存在しませんが、最も近い代替手段は@ConversationScopedです。自分で開始および停止するだけです。

@Named
@ConversationScoped
public class ClientNewBackingBean implements Serializable {

    @Inject
    private Conversation conversation;

    // ...

    @PostConstruct
    public void init() {
        conversation.begin();
    }

    public String submitAndNavigate() {
        // ...

        conversation.end();
        return "someOtherPage?faces-redirect=true";
    }

}

また、JSFアノテーションを透過的にブリッジして次のものと適切に連携するCDI拡張機能MyFacesCODIを使用することもできます。@ViewScoped@Named

@Named
@ViewScoped
public class ClientNewBackingBean implements Serializable {

    @Inject
    private ClientFacade facade;

    // ...

CODIの代替手段は、使用@ViewAccessScopedされる物理ビューファイルに関係なく、後続の要求がまったく同じマネージドBeanを参照している限り存続するものを使用することです。

@Named
@ViewAccessScoped
public class ClientNewBackingBean implements Serializable {

    @Inject
    private ClientFacade facade;

    // ...

参照:

于 2013-01-04T14:27:07.770 に答える
0

JSF 2を使用している場合は、ViewScopedBeanを使用する必要があります。

于 2013-01-04T14:25:02.587 に答える