从操作方法结果调用页面时不调用JSF 2 Prerenderview侦听器

Bil*_*mus 3 facelets jsf-2 managed-bean

我在f:metadata元素中使用prerender视图事件调用另一个页面.

如果我使用<h:link>它导航到页面工作并调用侦听器方法.

但是,如果我使用属于调用页面的托管bean的操作方法的结果导航到页面,则不会调用prerenderview中指定的侦听器(如果通过链接调用它).它会导航到第二页,只是没有监听器调用.

我真的更喜欢从action方法调用,因为我使用它来做一些工作并在会话映射中放置一个变量来使用.我不确定如何使用链接实现相同的功能.对象可能相当大...... kb不是Mb,但仍然不是我想要放在请求中的东西.

我已经尝试使调用页面请求的托管bean作用域并查看作用域.

如果从托管bean结果调用它,是不是可以获取prerenderview?正如我所说,我从一个链接开始工作.

<body>
    <ui:define name="metadata">
        <f:view>
            <f:metadata>
                <f:event type="preRenderView" listener="#{businessBean.init}" />
            </f:metadata>
        </f:view>
    </ui:define>
    <ui:composition template="#{navigationprops.soulard_2col_uprefs_template}">
Run Code Online (Sandbox Code Playgroud)

lu4*_*242 6

ui:组合标签修剪它之外的所有内容,因此facelets编译器没有机会读取代码.相反,您应该使用ui:decorate,但请记住f:metadata标签仅适用于顶级页面,而不适用于模板客户端.例如:

<ui:composition 
xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<f:metadata>
    <f:viewParam name="hotid" 
       value="#{hotelBooking.hotelId}" 
       converter="javax.faces.Long"/>
    <f:event type="preRenderView" listener="#{hotelBooking.selectHotel}"/>
</f:metadata>
<ui:decorate template="template.xhtml">
   <ui:define name="content">
   <!-- ... -->
   </ui:define>
</ui:decorate>
</ui:composition>
Run Code Online (Sandbox Code Playgroud)

请参阅此示例以获取详细信