preRenderView-Event在动作之前触发(commandbutton)

时间:2012-03-19 14:34:32

标签: jsf-2

我的preRenderView-Event有点麻烦。我的页面也使用命令按钮来提交数据,但不幸的是,在调用按钮操作之前总是调用preRenderView-Event。

preRenderView-Event负责从服务加载数据。由于页面很简单,并且不需要存储任何数据,所以我不需要任何Session或ViewScoped-Beans。

据我所知,事件是在Render-Response-Phase中调用的,按钮中的动作应该稍早发生。

<h:body>
    <f:metadata>
        <f:viewParam name="id" value="#{bean.id}" converter="converter.SetOfLongConverter"/>
        <f:event type="preRenderView" listener="#{bean.initializeData}" />
    </f:metadata>

    <ui:composition template="/META-INF/templates/myTemplate.xhtml">
        <ui:param name="title" value="#{bean.title}"/>
        <ui:define name="content">
            <h:outputText value="#{bean.description}" />
            <h:form>
                    <h:panelGrid columns="2">
                        <h:outputLabel value="Model" for="model" />
                        <h:inputText id="model" value="#{bean.model}" />
                        <h:outputLabel value="Manufacturer" for="manufacturer" />
                        <h:inputText id="manufacturer"
                            value="#{bean.manufacturer}" />
                        <h:outputLabel value="Year" for="year" />
                        <h:inputText id="year" value="#{bean.year}" />
                    </h:panelGrid>
                    <h:commandButton value="Create" type="submit"  action="#{bean.create}" rendered="#{bean.createMode}"/>
                    <h:commandButton value="Save" type="submit" action="#{bean.save}" rendered="#{!bean.createMode}" />
                </h:form>       
        </ui:define>
    </ui:composition>
</h:body>

我添加了一些Console-Messages以验证调用bean中的方法的时间以及当我有preRenderView事件时它永远不会发生。

有什么建议我在这里做错了吗?

1 个答案:

答案 0 :(得分:1)

<f:metadata>必须进入<ui:define>的{​​{1}}。

另见<f:metadata> tag documentation(强调我的):

  

声明此视图的元数据构面。这必须是<ui:composition>的孩子。 此标记必须位于给定viewId的顶级XHTML文件中,或者位于模板客户端中,但不能位于模板中。实现必须确保facet的直接子节点是UIPanel,甚至如果小平面只有一个孩子。实现必须将UIPanel的id设置为<f:view>符号常量的值。

原因很简单,因为元数据应该是视图特定的,而不是模板特定的。


更新:事实证明根本没有调用action方法。您在命令按钮上有一个UIViewRoot.METADATA_FACET_NAME属性,根据症状看起来依赖于基于请求的变量而不是基于视图的变量。将托管bean放在视图范围中应解决此问题。另请参阅commandButton/commandLink/ajax action/listener method not invoked or input value not updated