我使用JSF 2.0和primefaces 4.0
我的JSF代码:
<c:forEach items="#{materielbean.materielist}" var="list" >
<p:dataTable var="car" value="#{materielbean.listeitemsmaterielbyidmateriel(list.idmateriel)}" rowKey="#{car.iditemsmateriel}"
selection="#{fournisseurbean.selectedItemsMateriel}" selectionMode="multiple" style="width : 664px; ">
<f:facet name="header">
#{list.nommateriel}
</f:facet>
<p:column headerText="designation">
#{car.designation}
</p:column>
<p:column headerText="Unité">
#{car.unite}
</p:column>
</p:dataTable>
</c:forEach>
和使用过的函数
listeitemsmaterielbyidmateriel(list.idmateriel)
定义如下
public List listeitemsmaterielbyidmateriel(int i){
return itemmaterielDAO.DisplayItemsMaterielDAOselonmMateriel(i);
}
最后这是DAO代码
public List DisplayItemsMaterielDAOselonmMateriel(int idmateriel )
{
Query q = em.createQuery("select LIM from ItemsMateriel LIM inner join LIM.materiel where LIM.materiel.idmateriel= :idmateriel");
q.setParameter("idmateriel", idmateriel);
List l = new ArrayList();
l= q.getResultList();
return l ;
}
当我运行此代码时,我没有错误,但是selection="#fournisseurbean.selectedItemsMateriel}"
它只返回最终迭代的值(最终数据表),因为在每次迭代中列表都会崩溃旧的选定对象并放入新选择的对象,我该如何防止这种情况?
答案 0 :(得分:2)
将JSTL核心标记与JSF-和/或* Faces标记混合是危险的。基本上JSTL标记处理程序在视图构建期间执行,而JSF UIComponents在视图渲染时执行。在"JSTL in JSF2 Facelets… makes sense?"
看到非常好的答案您是否已尝试使用Facelets ui:repeat
组件解决问题?
答案 1 :(得分:1)
很抱歉很晚,但我发现解决方案比我想象的更容易: 首先创建一个新列表
List<ItemsMateriel> Tampon = new ArrayList<ItemsMateriel>();
第二步将setter修改为:
public void setSelectedItemsMateriel(List<ItemsMateriel> selectedItemsMateriel) {
Tampon.addAll(selectedItemsMateriel);
this.selectedItemsMateriel = selectedItemsMateriel;
}
最后使用新列表(Tampon),您将找到所有选定的对象