我有一个数据表如下:
<h:dataTable value="#{bean.items}" var="item">
我想用从服务方法获得的数据库中的集合填充它,以便在初始(GET)请求期间打开页面时立即显示它。我什么时候应该打电话给服务方法?为什么?
答案 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
。