添加项请求范围豆到列表(Add items to List in Request Scoped Be

2019-07-17 20:49发布

我有一个支持bean如下:

@Named
@RequestScoped
public class ClientNewBackingBean {

    @Inject
    private ClientFacade facade;
    private Client client;

Client类有一个List<Child> childrenList属性,等等。 我能够创建一个新的Client设置时childrenListnew 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重新创建视图只显示一个李四的孩子(由于它是请求范围,我相信)。 有另一种方式来解决这个问题,除了改变bean的范围,会话?

Answer 1:

如果你是使用标准JSF的bean管理注解@ManagedBean ,你可能会通过刚才通过将豆在视图范围内解决它@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";
    }

}

您也可以使用CDI扩展的MyFaces CODI透明地将弥合JSF @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;

    // ...

也可以看看:

  • 如何选择合适的豆范围是什么?
  • 推荐JSF 2.0 CRUD框架


Answer 2:

如果使用的是JSF 2,您应该使用ViewScoped豆。



文章来源: Add items to List in Request Scoped Bean
标签: jsf scope cdi