我不使用MyFaces,因此不会详细介绍它。但是为了值钱,在莫哈拉(Mojarra)也需要使用吸气剂
<ui:repeat>。但是,堆栈更清楚地说明了正在发生的事情。这里是
Thread#dumpStack()直到
FacesServlet#service():
java.lang.Exception: Stack trace at java.lang.Thread.dumpStack(Thread.java:1249) at mypackage.Bean.getList(Bean.java:21) at sun.reflect.GeneratedMethodAccessor51.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at javax.el.BeanELResolver.getValue(BeanELResolver.java:302) at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176) at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203) at com.sun.el.parser.AstValue.getValue(AstValue.java:116) at com.sun.el.parser.AstValue.getValue(AstValue.java:163) at com.sun.el.ValueexpressionImpl.getValue(ValueexpressionImpl.java:219) at com.sun.faces.facelets.el.TagValueexpression.getValue(TagValueexpression.java:109) at com.sun.faces.facelets.component.UIRepeat.getValue(UIRepeat.java:272) at com.sun.faces.facelets.component.UIRepeat.getDataModel(UIRepeat.java:248) at com.sun.faces.facelets.component.UIRepeat.setIndex(UIRepeat.java:442) at com.sun.faces.facelets.component.UIRepeat.doVisitChildren(UIRepeat.java:661) at com.sun.faces.facelets.component.UIRepeat.visitTree(UIRepeat.java:619) at javax.faces.component.UIComponent.visitTree(UIComponent.java:1600) at javax.faces.component.UIComponent.visitTree(UIComponent.java:1600) at com.sun.faces.application.view.StateManagementStrategyImpl.restoreView(StateManagementStrategyImpl.java:240) at com.sun.faces.application.StateManagerImpl.restoreView(StateManagerImpl.java:188) at com.sun.faces.application.view.ViewHandlingStrategy.restoreView(ViewHandlingStrategy.java:123) at com.sun.faces.application.view.FaceletViewHandlingStrategy.restoreView(FaceletViewHandlingStrategy.java:452) at com.sun.faces.application.view.MultiViewHandler.restoreView(MultiViewHandler.java:148) at javax.faces.application.ViewHandlerWrapper.restoreView(ViewHandlerWrapper.java:303) at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:189) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:113) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:409) // Remnant omitted for brevity.
因此,在状态管理需要访问整个组件树的还原视图阶段中会发生这种情况。该
UIRepeat反过来需要设置的行索引时,其子到会参观。
根据
UIRepeat#doVisitChildren()来源,行索引设置为
-1。最终目标是仅访问树中的子级,而不是遍历模型值或渲染任何东西。它只需要
DataModel为了能够设置行索引。数据模型的值是您看到正在调用getter的列表。如果一切正常,则在还原视图阶段仅应调用一次此getter。但是,如果在例如渲染响应阶段也调用了它,那么您可能会为此担心,因为它完全是不必要的。



