Java 弄清楚当我不&x27;I don’我不指望他们被叫来
我使用的是Java 弄清楚当我不&x27;I don’我不指望他们被叫来,java,jsf,jsf-2,Java,Jsf,Jsf 2,我使用的是jsf2,我发现有些行为很难解释或理解 我有几个独立的h:forms 其中一个看起来像这样: <h:form> <h:commandButton value="#{text.General_Wipe_Now}" action="#{bean.doThate}" > <f:ajax execute="@form" render="@form" /> </h:commandButton> <h:s
jsf2
,我发现有些行为很难解释或理解
我有几个独立的h:form
s
其中一个看起来像这样:
<h:form>
<h:commandButton value="#{text.General_Wipe_Now}" action="#{bean.doThate}" >
<f:ajax execute="@form" render="@form" />
</h:commandButton>
<h:selectBooleanCheckbox value="#{bean.ignoreErrors}">Ignore Errors</h:selectBooleanCheckbox>
</h:form>
更新2
正在制作一个SSCCE,一旦我有了它就会更新
更新3
问题似乎出现在
值属性中。
这是一个SSCCE代码,举例说明了问题:
<h:body>
<ui:repeat var="str" value="#{admin.SList}">
STRING: #{str}
</ui:repeat>
<h:form>
<h:commandButton value="pressie" action="#{admin.doThat}">
<f:ajax execute="@form"/>
</h:commandButton>
</h:form>
</h:body>
为什么要运行列表?它不是多余的吗?我不使用MyFaces,所以我不讨论它的细节。但是,出于价值考虑,在Mojarra上,getter也被称为
。然而,对于正在发生的事情,堆栈更为清晰。下面是线程dumpStack()直到FacesServlet#service()
:
因此,当状态管理需要访问整个组件树时,它会在恢复视图阶段发生。当要访问其子级时,UIRepeat
依次需要设置行索引
根据
UIRepeat#doVisitChildren()
源,行索引设置为-1
。最终的目标是只访问树中的子对象,而不是迭代模型值或渲染任何内容。它只需要DataModel
就可以设置行索引。datamodel的值是您看到正在为其调用getter的列表。若一切正常,则在恢复视图阶段只应调用此getter一次。但是,如果它也是在渲染响应阶段调用的,那么您可能会担心这一点,因为它完全没有必要。stacktrace应该为您提供足够的提示,说明JSF调用它的原因。类/方法名称通常是相当自描述的。你能更详细地说明你不明白的部分吗?此外,提供视图(至少从
到
)和模型(最终显示/指向有问题的getter的整个bean)的最小但完整的示例将有助于更好地理解您的问题。到目前为止,这个问题过于宽泛,无法得到合理的回答。现在还不清楚你在说什么。谢谢@Balusc,我没有详细介绍,因为这是一个复杂的应用程序,我不想在细节中失去重点。我主要想专注于如何亲自检查,而不是将所有代码放在这里。我会把这条线索放进去。也许你可以通过指出提示来提供帮助。只需在你的游乐场项目中创建一个SSCCE?@BalusC你的权利,我将尝试创建一个正在运行的SSCCE。我在stacktrace中看到一个org.apache.myfaces.view.facelets.tag.ui.DebugPhaseListener
。我不使用MyFaces,但这表明您已将项目状态设置为Development
,它只是基于整个组件树预收集一些调试信息,以防以后操作失败。尝试生产,看看是否仍然发生。
<h:body>
<ui:repeat var="str" value="#{admin.SList}">
STRING: #{str}
</ui:repeat>
<h:form>
<h:commandButton value="pressie" action="#{admin.doThat}">
<f:ajax execute="@form"/>
</h:commandButton>
</h:form>
</h:body>
@PostConstruct
public void init()
{
slist.add("Testing");
slist.add("This");
slist.add("Thing");
}
private List<String> slist = new ArrayList<String>();
public List<String> getSList(){
logger.trace("Getting LIST");
return slist;
}
public void doThat(){
logger.trace("DoThat Was Run");
}
2011-08-16 16:55:55,853 TRACE [http-80-2] (AdminBean.java:80) - Getting LIST
2011-08-16 16:55:55,865 TRACE [http-80-2] (AdminBean.java:85) - DoThat Was Run
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.