我对h:datatable和ui:repeat有问题。
我有下一个对象结构:
- 产品
- 子产品类型1
- 子产品类型2
- 子产品类型3
在数据表中,我需要显示产品的信息和其中一个子产品的信息,如:
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:repeat可以很好地工作,但不能对数据表上的每一列使用ui:repeat将其放置在外部。
像这样(不工作):
<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>
知道怎么解决吗?
提前谢谢。
谨致问候。
停止在getter方法中执行业务逻辑。Getter方法应该只返回已经准备好的数据。
改为在(post)构造函数或操作(listener)方法中执行业务逻辑。
另请参阅:
- JSF为何多次调用getter