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

时间:2012-09-25 23:11:26

标签: jsf-2 facelets managed-bean

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

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

但是,如果我使用属于调用页面的托管bean的action方法的结果导航到页面,则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}">

2 个答案:

答案 0 :(得分: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>

有关详细信息,请参阅This example

答案 1 :(得分:0)

我尝试了另一个答案,这是我唯一能做的工作......它通过以编程方式调用redirect来模仿action方法中的链接。

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);
    }
}

现在事实证明我在prerender视图上改变了主意,但这已经完成并且有效,所以我稍后会重构。但是如果有人想要看到可以从支持bean以编程方式调用另一个页面的工作代码,那么就是这样。 FWIW,&#34; ARTICLE_EDITOR&#34;是一个从context-root开始持有url的变量。