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

时间:2011-04-23 17:50:36

标签: jsf datatable loading getter

我有一个数据表如下:

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

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

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

1 个答案:

答案 0 :(得分:14)

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

至少在getter中执行执行数据库交互作业,除非它是延迟加载而你真的不能做任何事情。即,它将在每轮迭代期间被调用。在每轮迭代期间调用服务方法效率很低,并且在演示和回发期间可能会出现“怪异”的副作用,例如来自DB的旧值似乎仍然在模型中而不是新提交的值。

如果您依赖GET请求参数,请改用<f:viewParam><f:viewAction>。如果要在同一视图上的回发中保留模型(items属性)(例如CRUD表/对话框),则创建bean @ViewScoped

另见: