Вам нужно скрыть таблицу данных при первоначальном запросе и позволить командной ссылке переключать логическое значение, в котором атрибут 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>
Bean:
private boolean show;
public void toggleShow() {
show = !show; // Or just show = true;
}
public boolean isShow() {
return show;
}
Тем не менее, не рекомендуется использовать дорогостоящую бизнес-логику / базу данных внутри геттера. Получатель может быть вызван более одного раза в жизни бина. Скорее выполняйте эту работу в конструкторе компонента или в методе @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;
}