我有一个支持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重新创建视图只显示一个李四的孩子(由于它是请求范围,我相信)。 有另一种方式来解决这个问题,除了改变bean的范围,会话?
如果你是使用标准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框架
如果使用的是JSF 2,您应该使用ViewScoped
豆。