我遇到h:datatable和ui:repeat。
的问题我有下一个对象结构:
在数据表中,我需要显示产品的信息和其中一个子产品的信息,如:
Name Price StartDate EndDate
P1Name 25$ 01/01/13 01/07/13
P2Name 25$ 01/01/13 01/07/13
价格和日期来自SubproductType2价格属性。
所以,如果我有这个
<h:dataTable value="#{bundleBean.products}" var="myBundle" >
<ui:param name="currentSubProd" value="#sbaBean.getSubProdOfBundleFilterByCategory(myBundle.id, categoryType.internet)}" />
<h:column>
<f:facet name="header" >Name</f:facet>
#{myBundle.name}
</h:column>
<h:column>
<f:facet name="header" >Price</f:facet>
#{currentSubProd.price}
</h:column>
<h:column>
<f:facet name="header" >StartDate</f:facet>
#{currentSubProd.startDate}
</h:column>
<h:column>
<f:facet name="header" >EndDate</f:facet>
#{currentSubProd.endDate}
</h:column>
</h:dataTable>
它完美地工作但是每次在xhtml文件中调用#currentSubProd时它会调用bean方法,在这种情况下是3次。因此,如果我在方法中有一些查询,那么DB正在进行3次查询。
我意识到,使用ui:在列内重复它可以正常工作,但你不能把它和ui:使用ui重复在它之外:重复数据表中的每一列。
喜欢这个(不工作):
<ui:repeat name="currentSubProd" value="#sbaBean.getSubProdOfBundleFilterByCategory(myBundle.id, categoryType.internet)}" >
<h:column>
<f:facet name="header" >Name</f:facet>
#{myBundle.name}
</h:column>
<h:column>
<f:facet name="header" >Price</f:facet>
#{currentSubProd.price}
</h:column>
<h:column>
<f:facet name="header" >StartDate</f:facet>
#{currentSubProd.startDate}
</h:column>
<h:column>
<f:facet name="header" >EndDate</f:facet>
#{currentSubProd.endDate}
</h:column>
</ui:repeat>
</h:dataTable>
知道如何解决这个问题吗?
提前致谢。
问候。
答案 0 :(得分:2)
停止在getter方法中执行业务逻辑。 Getter方法应该只返回已经准备好的数据。
改为使用(post)构造函数或action(listener)方法中的业务逻辑。