Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 我应该如何以及何时从h:dataTable的数据库加载模型_Jsf_Datatable_Loading_Getter - Fatal编程技术网

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方法中完成 @ManagedBean @RequestScoped

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

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

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

  • 在页面加载之前调用它。但是怎么做呢
  • 在页面加载期间调用它。怎么做
  • 在getter方法中调用它。但它被多次调用
  • 还有别的吗

  • 在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;
        }
    
    }
    
    @PostConstruct
    中,它的优点是在构建和依赖注入之后执行。因此,如果您使用EJB来执行DB交互任务,那么
    @PostConstruct
    肯定是正确的位置,因为注入的依赖项在普通构造函数中还不可用。此外,当使用使用代理的bean管理框架时,比如CDI
    @Named
    ,构造函数的调用方式可能与您期望的方式不同。在检查类、生成代理和/或创建代理期间,可能会多次调用它

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

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

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

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

    另见:

    在preRenderView或viewAction中如何?如果要根据get请求传入的参数筛选数据库查询,则PostConstruct可能会很尴尬。@Ryan:OP没有要求/需要基于请求/查看参数的操作。
    <h:dataTable value="#{bean.items}" var="item">