8

おそらく誰かが私を啓発することができます。

入れたら

<f:metadata>
  <f:viewParam name="test" value="#{test.value}"/>
</f:metadata>

テンプレート内、セッター

setValue
が呼び出されることはありません。つまり、preRenderメソッド'call()'は、事前にsetterを呼び出さずに呼び出されます(以下のコード例を参照してください)。

ただし、メタデータブロックをコンポジション内に配置すると、期待どおりに呼び出されます。

これは正常な動作ですか、それとも私は何か間違ったことをしていますか?
洞察をありがとうございました。
ハンスペッター

参考までに、動作していないバージョンの完全なコード例を次に示します。

testtemplate.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:f="http://java.sun.com/jsf/core"
        xmlns:ui="http://java.sun.com/jsf/facelets">

     <f:metadata>
        <f:viewParam name="test" value="#{test.value}"/>
     </f:metadata>

     <f:event type="preRenderView" listener="#{test.call}" />

     <h:head>
        <title>Test Template</title>
     </h:head>

     <h:body>
        <ui:insert name="text" />
     </h:body>

</html>

testcomposition.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"
                 template="/templates/testtemplate.xhtml" 
                 xmlns:f="http://java.sun.com/jsf/core"
                 xmlns:h="http://java.sun.com/jsf/html">

     <ui:define name="text">
        some text
     </ui:define>

</ui:composition>

そしてここに、作業バージョンの完全なコード例があります。

testtemplate.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:f="http://java.sun.com/jsf/core"
        xmlns:ui="http://java.sun.com/jsf/facelets">

     <f:event type="preRenderView" listener="#{test.call}" />

     <h:head>
        <title>Test Template</title>
     </h:head>

     <h:body>
        <ui:insert name="text" />
     </h:body>

</html>

testcomposition.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"
                 template="/templates/testtemplate.xhtml" 
                 xmlns:f="http://java.sun.com/jsf/core"
                 xmlns:h="http://java.sun.com/jsf/html">

     <f:metadata>
        <f:viewParam name="test" value="#{test.value}"/>
     </f:metadata>

     <ui:define name="text">
        some text
     </ui:define>

</ui:composition>
4

1 に答える 1

15

これは仕様によるものです。<f:metadata>タグのドキュメントに記載されています:

このビューのメタデータファセットを宣言します。これはの子である必要があります<f:view>このタグは、指定されたviewIdのトップレベルのXHTMLファイル内、またはテンプレートクライアント内に存在する必要がありますが、テンプレート内には存在しない必要があります。実装では、ファセットの子が1つしかない場合でも、ファセットの直接の子がUIPanelであることを保証する必要があります。UIViewRoot.METADATA_FACET_NAME実装では、UIPanelのIDをシンボリック定数の値に設定する必要があります。

単純な理由は、メタデータがテンプレート固有ではなく、ビュー固有であると想定されているためです。<f:metadata>とにかく要件を達成するために、そして各テンプレートクライアントの内部に配置したくない/したくない<ui:define>場合、最善の策は、で一般的なBeanを使用すること@ManagedPropertyです。

参照:

于 2012-03-04T12:30:03.797 に答える