看起来很简单,但不起作用)
加载.jsf页面时,会显示DB中的值 dao impl chunk:
public List<Product> getProducts() {
return getHibernateTemplate().find("from Product");
}
托管bean块:
public List<Product> getProducts() {
return this.getProductManager().getProducts();
}
我打算,f:ajax
仅通过点击来完成此工作:
<h:form>
<h:commandLink value="show" action="nothing">
<f:ajax render="pr"/>
</h:commandLink>
<h:dataTable var="product" id="pr" value="#{showProducts.products}">
<h:column>#{product.name}</h:column>
</h:dataTable>
</h:form>
当数据加载时,数据在页面上可见。 使用Firebug,我可以看到,点击会刷新数据,因此ajax可以正常工作。
我是否需要h:dataTable
元素的其他属性才能在单击时显示表格内容?
谢谢。
答案 0 :(得分:1)
您需要在初始请求时隐藏数据表,并让commandlink切换一个布尔值,其中数据表的rendered
属性取决于该值。
Facelets的:
<h:form>
<h:commandLink value="show" action="#{showProducts.toggleShow}">
<f:ajax render="products"/>
</h:commandLink>
<h:panelGroup id="products">
<h:dataTable var="product" value="#{showProducts.products}" rendered="#{!showProducts.show}">
<h:column>#{product.name}</h:column>
</h:dataTable>
</h:panelGroup>
</h:form>
豆:
private boolean show;
public void toggleShow() {
show = !show; // Or just show = true;
}
public boolean isShow() {
return show;
}
也就是说,在getter中运行昂贵的业务/数据库逻辑并不是最好的做法。在bean的生命中,可以不止一次调用getter。而是在bean的构造函数或@PostConstruct
方法中执行此工作。
private List<Product> products;
@PostConstruct
public void init() {
products = this.getProductManager().getProducts();
}
public List<Product> getProducts() {
return products;
}
或者如果它实际上需要延迟加载,那么应该这样做:
private List<Product> products;
public List<Product> getProducts() {
if (products == null) {
products = this.getProductManager().getProducts();
}
return products;
}