2012-03-25 5 views
21

私はJSFアプリケーションをブックマーク可能なページに変換する際に多くの進歩を遂げましたが、私が正しい方法でそれをやっているのかどうか疑問に思っています。 1つの質問は、f:メタデータタグのベストプラクティスの場所があることです。<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

+0

'f:metadata'は、例えば再利用可能にするためにページテンプレートに置くことはできませんか?レンダリングされる前に、すべてのビューに対して実行したいアクションがある場合はどうしたらいいですか? –

+1

@Xtreme:「」を使用してください。実際には ''の中に置く必要はありません。 http://stackoverflow.com/questions/7343220/jsf-does-it-matter-whether-place-fevent-inside-fmetadata-or-not/7343242#7343242 – BalusC

関連する問題