JSF dataTable查询

时间:2009-01-10 15:32:41

标签: jsf

有些人可以帮助我使用以下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

2 个答案:

答案 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中评估“值”表达式的频率。