我正在使用prime-faces 5和jsf,我已经基于Tester和Date创建了动态2D arraylist表,第一次使用date显示正确的值。但是下一次它会在单行显示不同的测试者名称。
上面显示第一行正确显示测试者名称,但第二行和第三行显示不同的值。但我想在每个行级别显示相同的测试人员名称。
MY XHTML:
<div align="left" class="width100">
<div class="DTHeader">
<h:form id="frmres">
<h:panelGrid columns="2"
style="padding-top:35px;padding-left:30px;">
<h:outputText class="lighttxt1" value="Schedule Date" />
<p:calendar id="button" value="#{schedulerbean.sch.scheDate}"
styleClass="cal schdate" label="Schedule Date" showOn="button"
pattern="dd/MM/yyyy HH:mm" showButtonPanel="true"
required="true">
</p:calendar>
<h:outputText value="TCU Goal" class="lighttxt1" />
<h:panelGrid columns="1" >
<p:inputText id="tcu" label="The Value given in TCU is"
style="border: 1px solid #A8A8A8 !important;background: transparent !important;"
styleClass="txtbig" value="#{schedulerbean.sch.tcu}"
keypadOnly="true" required="#{tcselectionbean.mancnt} != 0}" />
<h:outputText value="(Total Tcu:#{schedulerbean.tottalTCU})" class="lighttxt1" />
</h:panelGrid>
<h:outputText value="Select Squad" styleClass="txtblack14" />
<p:selectOneMenu value="#{schedulerbean.sch.squadparam}"
panelStyleClass="panel" styleClass="DTDD ddwidth1">
<f:selectItem itemLabel="All Tester" itemValue=""
styleClass="txtblack14" />
<f:selectItems value="#{schedulerbean.squadLst}" var="squadval"
itemLabel="#{squadval}" itemValue="#{squadval}"
styleClass="txtblack14" />
</p:selectOneMenu>
</h:panelGrid>
<h:panelGrid columns="1">
<p:commandButton
actionListener="#{schedulerbean.resourcePlanWithPossibleEnddate}"
value="Calculate" styleClass="blubtn"
update=":frmres:reservtable" />
<h:panelGroup id="reservtable">
<table class="bor bortd" style="margin-left:32px;">
<thead>
<tr>
<th>Tester Name / Dates</th>
<c:forEach var="resdate" items="#{schedulerbean.resDateList}">
<th>#{resdate}</th>
</c:forEach>
</tr>
</thead>
<c:forEach var="reserv" items="#{schedulerbean.resList}">
<tr>
<td>
<h:selectBooleanCheckbox value="#{schedulerbean.testerCheckboxmap[reserv.testerName]}"
styleClass="lighttxt1" />#{reserv.testerName}</td>
<c:forEach var="resdate1" items="#{schedulerbean.resDateList}">
<td class='c#{reserv.reserveType.get(resdate1)}'>
#{reserv.testerName} #{reserv.tcuMap.get(resdate1)}</td>
</c:forEach>
</tr>
</c:forEach>
</table>
</h:panelGroup></h:panelGrid>
<p:commandLink styleClass="bluelinknew"
action="#{schedulerbean.setSchedulestep('step3')}"
update=":schmenufrm" value="Next" style="float:right;"
onclick="javascript:changets('schedule');" />
</h:form>
</div>
</div>
我怎样才能实现这个目标?
答案 0 :(得分:0)
您滥用forEach
JSTL标记。该标记仅在构建组件树时有效,并且不会为回发和AJAX请求重新构建组件树。
bwright建议使用<p:dataTable>
是好的,但如果您不想呈现HTML表格,也可以使用<ui:repeat>
。
http://www.ninthavenue.com.au/jsf-c-foreach-vs-ui-repeat
了解JSF中JSTL标记最重要的是 他们不代表组件,永远不会成为其中的一部分 构建视图后的组件树。相反,它们是标签 实际上负责在第一个树中构建树 地点。一旦他们完成了工作,他们就会过期,不再停止 等等等。
...
视图何时构建?
现在您已了解标记处理程序仅在有效时才有效 树是建的,下一个逻辑问题应该是好的,什么时候是树 建?
简短的回答是为每个请求构建一个新视图 不是回发。在回发期间,视图将从中重建 保存状态。相当令人困惑,而且我知道并不是很明显,但那里 你有它。
...
删除或添加项目后,我的列表不会更改大小
当您构建视图时,您只有5个项目。如果你发回来 在此视图中添加或删除项目,您的视图仍然有5个 h:自从保存状态恢复后,其中的outputText组件。 在这个简单的例子中,你应该使用ui:repeat和你的树 总是包含一个h:ouputText组件,它被迭代 不同的$ {item}值。
如果依靠使用c:forEach动态包含不同的表单 你可能遇到困难的组件。总是试着想一想 生成的树看起来像什么,并记住它不会改变 回发。