2012-03-25 70 views
21

我在將JSF應用程序轉換爲可書寫頁面方面取得了很多進展,但我想知道我是否正確地做到了這一點。一個問題是,是否有f:metadata標籤的最佳實踐位置?使用<ui:composition>模板時,我應該在哪裏聲明<f:metadata>?

我典型的Facelets客戶端頁面看起來是這樣的:

<ui:composition template="./pattern.xhtml"> 

     <ui:define name="content"> 

      <f:metadata> 
       <f:viewParam name="userId" value="#{bean.userId}" /> 
       <f:viewParam name="startRecord" value="#{bean.startRecord}" /> 
       <f:viewParam name="pageSize" value="#{bean.pageSize}" /> 
       <f:viewParam name="sort" value="#{bean.sort}" /> 
      </f:metadata> 

      <h1>Data Table</h1> 

etc 

所以F:元數據和兒童F:viewParam標籤在我的頁面的主體遇到的。我的pattern.xhtml模板也有一個部分(名爲「標題」),可以將這些標籤放在標題部分。他們應該放在那裏嗎?它是否有所作爲,還是我設置了一些我還沒有看到的副作用?

回答

39

從技術上講,只要它在頂層視圖中(即在模板客戶端,因此不在主模板中使用模板時),在視圖中聲明<f:metadata>的位置並不重要。構建視圖時,元數據基本上不是JSF組件樹的一部分,而是視圖根目錄(您可以通過ViewDeclarationLanguage#getViewMetadata()以每個視圖爲基礎獲取)。

大部分自我記錄將會把<f:metadata>放在視圖的頂部,這樣您就可以乍一看地看到任何元數據,而無需滾動到視圖源代碼的一半或底部。

使用普通頁面時,只需將它放在<h:head>之前即可。

<!DOCTYPE html> 
<html lang="en" 
    xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
> 
    <f:metadata> 
     <f:viewParam name="userId" value="#{bean.userId}" /> 
     <f:viewParam name="startRecord" value="#{bean.startRecord}" /> 
     <f:viewParam name="pageSize" value="#{bean.pageSize}" /> 
     <f:viewParam name="sort" value="#{bean.sort}" /> 
    </f:metadata> 

    <h:head> 
     ... 
    </h:head> 

    <h:body> 
     ... 
    </h:body> 
</html> 

當使用模板,推薦的方法,如在the <f:metadata> tag documentation所述,將聲明在主模板單獨<ui:insert name="metadata">並讓客戶在<ui:define name="metadata">定義<f:metadata>

<ui:composition template="/WEB-INF/pattern.xhtml" 
    xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
> 
    <ui:define name="metadata"> 
     <f:metadata> 
      <f:viewParam name="userId" value="#{bean.userId}" /> 
      <f:viewParam name="startRecord" value="#{bean.startRecord}" /> 
      <f:viewParam name="pageSize" value="#{bean.pageSize}" /> 
      <f:viewParam name="sort" value="#{bean.sort}" /> 
     </f:metadata> 
    </ui:define> 

    <ui:define name="content"> 
     <h1>Data Table</h1> 
     ... 
    </ui:define> 
</ui:composition> 
+0

我必須說,看起來比我一直在做的事情要乾淨一些。不知何故,我沒有想到爲了元數據目的創建一個** ui:insert **,但我現在就可以。 – AlanObject 2012-03-25 03:27:31

+0

這是否意味着'f:metadata'不能放在例如一個頁面模板中以使它可重用?那麼如果我們想在每個視圖呈現之前執行一些操作,那麼該怎麼做呢? – 2014-01-20 14:25:24

+1

@Xtreme:只需使用''。它實際上不需要放在''內。另請參閱http://stackoverflow.com/questions/7343220/jsf-does-it-matter-whether-place-fevent-inside-fmetadata-or-not/7343242#7343242 – BalusC 2014-01-20 14:26:43

相關問題