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一次。但是,如果它也是在渲染响应阶段调用的,那么您可能会担心这一点,因为它完全没有必要。

我不使用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
,它只是基于整个组件树预收集一些调试信息,以防以后操作失败。尝试
Production
,看看它是否仍然发生。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.