gpt4 book ai didi

jsf - 我应该如何以及何时从数据库中为 JSF dataTable 加载模型

转载 作者:行者123 更新时间:2023-11-30 22:06:55 26 4
gpt4 key购买 nike

我有一个数据表如下:

<h:dataTable value="#{bean.items}" var="item">

我想用从服务方法获得的数据库中的集合填充它,以便在初始 (GET) 请求期间打开页面时立即显示它。我应该什么时候调用服务方法?为什么?

  1. 在页面加载之前调用它。但是如何呢?
  2. 在页面加载期间调用它。怎么样?
  3. 在 getter 方法中调用它。但它被多次调用。
  4. 还有别的吗?

最佳答案

在 bean 的 @PostConstruct 中执行方法。

@ManagedBean
@RequestScoped
public class Bean {

private List<Item> items;

@EJB
private ItemService itemService;

@PostConstruct
public void init() {
items = itemService.list();
}

public List<Item> getItems() {
return items;
}

}

并让 value引用属性(不是方法!)。

<h:dataTable value="#{bean.items}" var="item">

@PostConstruct您的优势是它在 构建 依赖项注入(inject)之后执行。因此,如果您使用 EJB 来执行数据库交互任务,@PostConstruct绝对是正确的地方,因为注入(inject)的依赖项在普通构造函数中尚不可用。此外,当使用使用代理的 bean 管理框架时,例如 CDI @Named ,构造函数可能会或可能不会按照您期望的方式被调用。在检查类、生成代理和/或创建代理期间可能会多次调用它。

至少不要在getter 中执行DB 交互工作,除非它是延迟加载并且您真的不能做任何其他事情。也就是说,它会在每一轮迭代中被调用。在每一轮迭代期间调用服务方法显然效率低下,并且可能会在呈现和回发期间产生“奇怪”的副作用,例如来自数据库的旧值似乎仍然存在于模型中,而不是新提交的值。

如果依赖GET请求参数,那么使用<f:viewParam><f:viewAction>反而。另见 Creating master-detail pages for entities, how to link them and which bean scope to choose .

如果你想在同一 View (例如 CRUD 表/对话框)的回发中保留模型(items 属性),那么将 bean 设为 @ViewScoped ,否则当同一模型在其他地方同时编辑时,模型将不会与 View 同步。另见 Creating master-detail table and dialog, how to reuse same dialog for create and edit .

如果您使用 JPA 的 @Version模型上的特征,然后你可以捕获OptimisticLockException处理它并显示一条消息,如“数据已被其他人编辑,如果所需的更改符合预期,请刷新/查看”。另见 Letting the presentation layer (JSF) handle business exceptions from service layer (EJB) .

另见:

关于jsf - 我应该如何以及何时从数据库中为 JSF dataTable 加载模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41403411/

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