Jsf 我应该如何以及何时从h:dataTable的数据库加载模型

Jsf 我应该如何以及何时从h:dataTable的数据库加载模型,jsf,datatable,loading,getter,Jsf,Datatable,Loading,Getter,我有一个数据表,如下所示: <h:dataTable value="#{bean.items}" var="item"> 我想用从服务方法获得的数据库中的集合填充它,以便在初始GET请求期间打开页面时立即显示它。我应该什么时候调用服务方法?为什么 在页面加载之前调用它。但是怎么做呢? 在页面加载期间调用它。怎样 在getter方法中调用它。但它被多次调用。 还有别的吗? 在bean的@PostConstruct方法中实现 在@PostConstruct中,它的优点是在构造和依赖注入

我有一个数据表,如下所示:

<h:dataTable value="#{bean.items}" var="item">
我想用从服务方法获得的数据库中的集合填充它,以便在初始GET请求期间打开页面时立即显示它。我应该什么时候调用服务方法?为什么

在页面加载之前调用它。但是怎么做呢? 在页面加载期间调用它。怎样 在getter方法中调用它。但它被多次调用。 还有别的吗? 在bean的@PostConstruct方法中实现

在@PostConstruct中,它的优点是在构造和依赖注入之后执行。因此,在使用EJB执行DB交互任务的情况下,@PostConstruct肯定是正确的位置,因为注入的依赖项在普通构造函数中还不可用。此外,当使用使用代理(如CDI@Named)的bean管理框架时,构造函数的调用方式可能与您期望的方式相同,也可能不同。在检查类、生成代理和/或创建代理期间,可能会多次调用它

至少不要在getter中执行DB交互工作,除非它是延迟加载,并且您真的不能做任何其他事情。也就是说,它将在每一轮迭代中被调用。在每一轮迭代中调用服务方法都是非常低效的,并且在表示和回发过程中可能会产生奇怪的副作用,例如来自DB的旧值似乎仍然停留在模型中,而不是新提交的值

如果依赖GET请求参数,则使用and。另见

如果要在同一视图(例如CRUD表/对话框)上的回发中保留模型的items属性,则将bean@ViewScope设置为已设置,否则当在其他位置同时编辑同一模型时,该模型将不会与视图同步。另见

如果您在模型上使用JPA的@Version功能,那么您可以捕获OptimisticLockException来处理它,并显示一条消息,如数据已被其他人编辑,请刷新/查看所需的更改是否符合预期。另见

另见:
在preRenderView或viewAction中如何?如果要根据get请求传入的参数筛选数据库查询,则PostConstruct可能会很尴尬。@Ryan:OP没有要求/需要基于请求/查看参数的操作。
@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;
    }

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