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)请求期间打开页面时立即显示它。我应该什么时候调用服务方法?为什么
在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
来处理它,并显示一条消息,如“数据已由其他人编辑,如果所需更改符合预期,请刷新/查看”。另见
另见:
<h:dataTable value="#{bean.items}" var="item">