JSF preRenderView调用次数太多了

Dis*_*tum 5 java facelets jsf-2

我的页面/ bean的preRenderView事件在第一页加载时被触发两次,然后2 + n每次回发被触发,其中n是已经发生的回发数(包括当前的回发数).

在这里阅读了一些其他帖子后,我搬到了<f:event type="preRenderView" listener="myBean.preRenderView"/>外面,<f:metadata/>这减少了preRenderView一个电话的数量.也就是说,在整页加载和1 + n每次回发的时间上调用一次.我甚至试图将<f:event/>标签移到外面<f:view/>,但它没有效果.

我不确定这是否相关:页面使用模板:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:fb="http://www.facebook.com/2008/fbml">
    <f:view contentType="text/html">
        <ui:insert name="metadata"/>
        <h:head>
            <!-- Some stuff here -->
            <ui:insert name="content"/>
            <!-- More stuff here -->
        </h:head>
        <h:body>
        </h:body>
    </f:view>
</html>
Run Code Online (Sandbox Code Playgroud)

以及页面的相关位:

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets">
    <h:head>
        <title></title>
    </h:head>
    <h:body>
        <ui:composition template="/WEB-INF/templates/myLayout.xhtml">
            <ui:define name="windowTitle">My Page</ui:define>
            <ui:define name="metadata">
                <f:event type="preRenderView" listener="#{myBean.preRenderView}"/>
            </ui:define>
            <ui:define name="content">
                <!-- Some content here -->
                <h:panelGroup id="reRenderable" layout="block">
                    <!-- More content here -->
                    <h:form prependId="false">
                        <h:outputLabel for="mySelector" value="Item:"/>
                        <h:selectOneMenu id="mySelector"
                                         value="#{myBean.item}"
                                         converter="#{myConverter}"
                                         validator="#{itemActiveValidator.validate}">
                            <f:selectItems value="#{myBean.myItems}"/>
                            <f:ajax render=":reRenderable"/>
                        </h:selectOneMenu>
                    </h:form>
                    <!-- More content here -->
                </h:panelGroup>
                <!-- More content here -->
            </ui:define>
        </ui:composition>
    </h:body>
</html>
Run Code Online (Sandbox Code Playgroud)

Dis*_*tum 5

它看起来像是另一个Mojarra bug:JAVASERVERFACES-2162

我按如下方式应用了解决方法,它有效:

<ui:define name="metadata">
    <f:metadata>
        <f:viewParam name="dummy"/>
        <f:event type="preRenderView" listener="#{myRecordsBean.preRenderView}"/>
    </f:metadata>
</ui:define>
Run Code Online (Sandbox Code Playgroud)

剩下要做的就是推dummy送到模板,以保持使用它的页面免受此污染.

  • 这是一个令人讨厌的错误:(如果您或其他任何人对此感到困扰,请投票支持该错误. (3认同)
  • 你是对的,虽然老实说我几乎在我使用的每一块软件中遇到明显的错误(Hibernate,Firefox,你的名字):( (3认同)