2012-09-25 48 views
3

我使用f:metadata元素中的預渲染視圖事件調用另一個頁面。從行爲方法調用頁面時,不會調用JSF 2 Prerenderview監聽器結果

如果我使用<h:link>導航到頁面,它將工作並調用偵聽器方法。

但是,如果我使用來自屬於調用頁面的託管bean的操作方法的結果導航到該頁面,則prerenderview中指定的偵聽器不會被調用(就像它通過鏈接調用一樣)。它確實導航到第二頁,沒有監聽者的電話。

我真的更喜歡從動作方法調用,因爲我使用它來做一些工作,並在會話映射中放置一個變量,以便被調用的頁面使用。我不確定如何使用鏈接實現相同的功能。該對象可能相當大... 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}"> 

回答

5

ui:構件標記修剪它外面的所有內容,所以facelets編譯器沒有機會讀取代碼。相反,你應該使用ui:decorate,但記住f:元數據標籤只能在頂層頁面上使用,而不能在模板客戶端中使用。例如:

<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

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」是一個持有從context-root開始的url的變量。

+0

您的具體問題只是由使用Facelets的錯誤方式引起的。 – BalusC

+0

@BalusC請解釋一下。 – BillR

相關問題