有些人可以帮助我使用以下JSF dataTable吗?这里我从数据库表获取数据,我使用了dataTable绑定,但我不知道为什么它在屏幕上显示行3次,但是如果我删除了绑定,那么它只显示一次。
<h:dataTable binding="#{threadController.dataTable}" var="category" value="#{threadController.queryCategories}" border="1" cellpadding="2" cellspacing="0">
<h:column>
<img src="../../images/directory.jpg" alt="Forum Icon" />
</h:column>
<h:column>
<h:form>
<h:commandLink value="#{category.cname}" action="#{threadController.categoryDateItem}" />
</h:form>
</h:column>
// defined globally
private HtmlDataTable dataTable;
private HtmlInputHidden dataItemId = new HtmlInputHidden();
public String categoryDateItem() {
category = (Category) dataTable.getRowData();
System.out.println("category action by select: "+category.getCname());
dataItemId.setValue(category.getId());
return "editItem"; // Navigation case.
}
@SuppressWarnings("unchecked")
public ArrayList<Category> getQueryCategories(){
return (ArrayList<Category>)HibernateUtil.getSession().createCriteria(Category.class).list();
}
输出:
myText myText myText
答案 0 :(得分:2)
将此组件绑定到bean的绑定表达式值=“#{threadController.queryCategories}”。因此,value属性足以使用dataTable标记检索数据。
答案 1 :(得分:0)
Binding =组件支持bean
值=数据模型支持bean
因此,您可以正确设置Value和Binding(至少,就我所见)。你的问题可能是因为你没有缓存你在getQueryCategories()中从数据库中返回的列表。
你真的不知道在渲染dataTable的过程中调用getQueryCategories()的频率是多少,所以做这样的事情是个好主意:
// Somewhere near the top of the handler class.. create a cache variable:
private ArrayList<Category> qCategories = null;
// now for getQueryCategories
public ArrayList<Category> getQueryCategories(){
if ( qCategories == null ) { // qCategories should be a member of the handler
qCategories = (ArrayList<Category>)HibernateUtil.getSession().createCriteria(Category.class).list();
}
return qCategories
}
这种缓存在JSF应用程序中非常有用,其处理程序甚至是请求作用域的会话,因为您再也无法知道JSF在dataTable中评估“值”表达式的频率。