4

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

如果我使用它导航到页面<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}">
4

2 回答 2

8

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>

有关详细信息,请参阅此示例

于 2012-09-26T01:31:33.057 回答
0

我尝试了另一个答案,这是我唯一要做的事情......那就是通过以编程方式调用重定向来模仿动作方法中的链接。

public void editArticle(Article article) {
    FacesContext fcontext = FacesContext.getCurrentInstance();
    ExternalContext context = fcontext.getExternalContext();
    Map<String, Object> sessionMap = context.getSessionMap();
    sessionMap.put("articleId", article.getArticleId());
    String urlString = navBundle.getString("ARTICLE_EDITOR");
    String url = context.encodeActionURL(fcontext.getApplication().getViewHandler().getActionURL(fcontext, urlString));
    try {
        context.redirect(url);
    } catch (IOException ex) {
        ELSLogger.LOG(Level.SEVERE, this.getClass().getName(), "checkEligableToLogin", "Couldn't Redirect to: " + url);
    }
}

现在事实证明我改变了预渲染视图的想法,但这已经完成并且可以工作,所以我稍后会重构。但是,如果有人想查看将从支持 bean 以编程方式调用另一个页面的工作代码,这里就是。FWIW,“ARTICLE_EDITOR”是一个变量,包含一个从上下文根开始的 url。

于 2012-09-27T06:19:22.873 回答