【问题标题】:JSF 2 Prerenderview Listener Not Called When Page Called From Action Method Outcome从操作方法结果调用页面时未调用 JSF 2 Prerenderview 侦听器
【发布时间】:2012-09-25 23:11:26
【问题描述】:

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

【问题讨论】:

    标签: jsf-2 facelets managed-bean


    【解决方案1】:

    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

    【讨论】:

      【解决方案2】:

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

      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。

      【讨论】:

      • 您的具体问题只是由于使用 Facelets 的错误方式造成的。
      猜你喜欢
      • 2012-06-07
      • 2012-04-08
      • 1970-01-01
      • 2015-01-02
      • 2020-06-13
      • 1970-01-01
      • 2013-02-05
      • 1970-01-01
      • 2012-04-30
      相关资源
      最近更新 更多