在我看来,我有一个selectOneMenu
,如下面的代码所示:
<h:panelGroup id="mysrvicenodesblock" layout="block">
<table id="mysrvicenodestab" border="0" width="100%">
<tr>
<td align="center" class="underline">node Id</td>
<td align="center" class="underline">node Name</td>
<td align="center" class="underline">Go to node</td>
<td align="center" class="underline">Action</td>
</tr>
<c:forEach items="${jbpmAPIUtil.myServiceNodeToComplete}" var="msntoc">
<tr>
<td align="center">${msntoc.getId()}</td>
<td align="center">${msntoc.getName()}</td>
<td align="center">
<h:selectOneMenu value="#{jbpmAPIUtil.procNdNameSelectedValue}" id="procnodes">
<f:selectItem itemLabel="" itemValue="" />
<f:selectItems value="#{jbpmAPIUtil.procnodes}" var="pn" itemLabel="# {pn.getName()}" itemValue="#{pn.getId()}" />
<f:ajax event="change" listener="#{jbpmAPIUtil.OnONeMenuProcNdSelChgeHndler}" />
</h:selectOneMenu>
</td>
<td align="center">
<h:commandLink value="Complete !">
<f:ajax event="click" listener="#{jbpmAPIUtil.Completemsn}">
</f:ajax> <f:param value="${msntoc.getWorkitemid()}" name="msntocwiid"/>
</h:commandLink>
</td>
</tr>
</c:forEach>
</table>
</h:panelGroup>
此组件包含在<h:panelGroup layout="block">
上,该p:poll
会定期刷新,使用主要面SEVERE: +id: j_id1
type: javax.faces.component.UIViewRoot@c0fee0
+id: javax_faces_location_HEAD
type: com.sun.faces.component.ComponentResourceContainer@5be0a8
+id: j_id2
type: javax.faces.component.UIOutput@1fa3bee
+id: j_id3
type: javax.faces.component.UIOutput@174b989
+id: j_id4
type: javax.faces.component.UIOutput@40f2f1
+id: j_idt2
type: <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html>
+id: j_idt3
type: <html xmlns="http://www.w3.org/1999/xhtml">
+id: j_idt4
type: javax.faces.component.UIOutput@dd874
+id: j_idt5
type:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<link rel="stylesheet" type="text/css" href="CSS/general.css"/>
<script src="JS/jquery-1.8.3.js"/>
<script src="JS/jquery-ui-1.10.0.custom.js"/>
<script src="JS/jquerygen.js"/>
<script src="JS/general.js"/>
<title>Xtensus Workflow App </title>
+id: j_idt6
type:
<body>
+id: j_idt7
type: javax.faces.component.html.HtmlForm@fdc98d
+id: j_idt8
type:
<div id="ctrldiv">
Id du noeud actuel (le curseur jbpm) :
+id: niid
type: javax.faces.component.html.HtmlOutputText@1bb55d3
+id: j_idt9
type: <br/>
Nom du noeud actuel (le curseur jbpm) :
+id: cnn
type: javax.faces.component.html.HtmlOutputText@1ff95a9
+id: j_idt10
type: <br/>
+id: j_idt11
type: javax.faces.component.html.HtmlCommandLink@baa6f7
+id: j_idt12
type:
<br/>
<br/>
<H3>#Noeuds en cours d'execution : </H3>
<div>
+id: mysrvicenodesblock
type: javax.faces.component.html.HtmlPanelGroup@27d9e5
+id: j_idt13
type:
<table id="mysrvicenodestab" border="0" width="100%">
<tr>
<td align="center" class="underline">node Id</td>
<td align="center" class="underline">node Name</td>
<td align="center" class="underline">Go to node</td>
<td align="center" class="underline">Action</td>
</tr>
+id: j_idt18
type:
<tr>
<td align="center">${msntoc.getId()}</td>
<td align="center">${msntoc.getName()}</td>
<td align="center">
+id: procnodes
type: javax.faces.component.html.HtmlSelectOneMenu@527386
+id: j_idt19
type: javax.faces.component.UISelectItem@11e7e46
+id: j_idt20
type: javax.faces.component.UISelectItems@f45673
+id: j_idt21
type:
</td>
<td align="center">
+id: j_idt22
type: javax.faces.component.html.HtmlCommandLink@157be76
+id: j_idt23
type: javax.faces.component.UIParameter@1996e15
+id: j_idt24
type:
</td>
</tr>
+id: j_idt25
type:
<tr>
<td align="center">${msntoc.getId()}</td>
<td align="center">${msntoc.getName()}</td>
<td align="center">
+id: procnodes
type: javax.faces.component.html.HtmlSelectOneMenu@a5adc
+id: j_idt27
type: javax.faces.component.UISelectItem@1d34eac
+id: j_idt28
type: javax.faces.component.UISelectItems@1d20651
+id: j_idt29
type:
</td>
<td align="center">
+id: j_idt30
type: javax.faces.component.html.HtmlCommandLink@19cee52
+id: j_idt31
type: javax.faces.component.UIParameter@1e27046
+id: j_idt32
type:
</td>
</tr>
+id: j_idt33
type:
<tr>
<td align="center">${msntoc.getId()}</td>
<td align="center">${msntoc.getName()}</td>
<td align="center">
+id: procnodes
type: javax.faces.component.html.HtmlSelectOneMenu@1391a2c
+id: j_idt35
type: javax.faces.component.UISelectItem@1e54eb7
+id: j_idt36
type: javax.faces.component.UISelectItems@1930089
+id: j_idt37
type:
</td>
<td align="center">
+id: j_idt38
type: javax.faces.component.html.HtmlCommandLink@860ba
+id: j_idt39
type: javax.faces.component.UIParameter@664ca
+id: j_idt40
type:
</td>
</tr>
+id: j_idt14
type:
</table>
+id: j_idt15
type:
</div>
</div>
+id: j_idt16
type: org.primefaces.component.poll.Poll@1c334de
+id: j_idt17
type:
</body>
</html>
Mar 8, 2013 5:08:49 AM com.sun.faces.application.view.FaceletViewHandlingStrategy handleRenderException
SEVERE: Error Rendering View[/index.xhtml]
java.lang.IllegalStateException: Component ID j_idt7:procnodes has already been found in the view.
at com.sun.faces.util.Util.checkIdUniqueness(Util.java:910)
at com.sun.faces.util.Util.checkIdUniqueness(Util.java:894)
at com.sun.faces.util.Util.checkIdUniqueness(Util.java:894)
at com.sun.faces.application.view.FaceletFullStateManagementStrategy.saveView(FaceletFullStateManagementStrategy.java:680)
at com.sun.faces.application.StateManagerImpl.saveView(StateManagerImpl.java:89)
at javax.faces.application.StateManager.getViewState(StateManager.java:553)
at com.sun.faces.context.PartialViewContextImpl.renderState(PartialViewContextImpl.java:416)
at com.sun.faces.context.PartialViewContextImpl.processPartial(PartialViewContextImpl.java:300)
at javax.faces.context.PartialViewContextWrapper.processPartial(PartialViewContextWrapper.java:183)
at javax.faces.component.UIViewRoot.encodeChildren(UIViewRoot.java:981)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1779)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:409)
at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:125)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1770)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
。
用于绑定此元素值的bean是会话范围的bean(我不知道这是否也称为“绑定”,此组件上没有“绑定”属性)。
我在很多帖子中都看到这个问题发生了,因为bean和视图有不同的范围,但我记得我已经多次出现这种情况而没有出现这个问题。
我希望确切知道哪个绑定导致了这个问题,还有其他解决方案可以避免这个问题发生。
这是此问题的完整堆栈,当我单击commandLink按钮时会发生这种情况,因此带有foreach循环内容的表将更改(一行将被删除,另外两行将添加到列表中)
{{1}}
答案 0 :(得分:5)
<c:forEach>
JSTL默认情况下不会增加其中组件的子ID。您可能需要使用EL表达式执行此操作,或者使用更适合迭代集合的JSF组件,例如UIRepeat
。
<ui:repeat value="#{jbpmAPIUtil.myServiceNodeToComplete}" var="msntoc">
替换forEach组件的以下组件将正确迭代由此内部组件生成的ID,这样就不会在页面上存在重复ID。
注意:只需仔细检查您是否在页面上使用<h:head>
而不是<head>
和<h:body>
而不是<body>
。在您的堆栈跟踪中,您可能会遇到与此相关的其他问题,这看起来很可疑。