jsf-2 - 从操作方法结果调用页面时未调用 JSF 2 Prerenderview 监听器

标签 jsf-2 facelets managed-bean

我正在使用 f:metadata 元素中的预渲染 View 事件从另一个页面调用页面。

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

但是,如果我使用属于调用页面的托管 bean 的操作方法的结果导航到页面,则不会调用预渲染 View 中指定的监听器(就像通过链接调用一样)。它确实导航到第二页,只是没有监听器调用。

我真的更喜欢从 action 方法调用,因为我用它来做一些工作并在 session 映射中放置一个变量以供被调用页面使用。我不确定如何使用链接实现同样的目标。该对象可能相当大... kb 不是 Mb 但仍然不是我想放入请求中的东西。

我尝试将调用页面请求的托管 bean 设置为范围和 View 范围。

如果从托管 bean 结果调用预渲染 View ,是否不可能触发它?正如我所说,我是通过链接让它工作的。

<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}">

最佳答案

ui:composition 标记修剪它之外的所有内容,因此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>

This example详情。

关于jsf-2 - 从操作方法结果调用页面时未调用 JSF 2 Prerenderview 监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12592405/

相关文章:

javascript - JSF 2.0 Javascript 和 CSS 表格

java - 单击树节点时如何打开新的 div

jsf - 复合组件内输入字段的验证器永远不会被触发

jsf - selectOneMenu 中的 null bean

jsf-2 - 使用 jsf session 作用域托管 bean 来表示静态分层数据

xpages - session 范围的托管 bean 在 xpages 应用程序中似乎不是 session 范围的

jsf - 自定义 FacesServlet <url-pattern> 去掉 .xhtml 扩展名

java - PDF 文件打不开

java - 在 Facelets 页面中显示异常堆栈跟踪

javascript - JSF 在 onClick 事件之前执行 Ajax