gpt4 book ai didi

jsf - 在 Request Scoped Bean 中将项目添加到列表

转载 作者:行者123 更新时间:2023-12-04 06:02:57 25 4
gpt4 key购买 nike

我有一个支持 bean,如下所示:

@Named
@RequestScoped
public class ClientNewBackingBean {

@Inject
private ClientFacade facade;
private Client client;

Client类有一个 List<Child> childrenList属性等等。我能够创建一个新的 Client设置 childrenList 时与 new ArrayList() .

在 View 中,我有一个输入文本字段和一个 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,并且 View 仅显示一个 John Doe 子级(我相信是因为它在请求范围内)。除了将 bean 范围更改为 Session 之外,还有其他方法可以解决这个问题吗?

最佳答案

如果您使用标准的 JSF bean 管理注释 @ManagedBean,您可以通过 @ViewScoped 将 bean 放在 View 范围内来解决它。 .

@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,它就会存在,而不管使用的物理 View 文件如何。

@Named
@ViewAccessScoped
public class ClientNewBackingBean implements Serializable {

@Inject
private ClientFacade facade;

// ...

另见:

关于jsf - 在 Request Scoped Bean 中将项目添加到列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14158885/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com