【问题标题】:JSF f:viewParam not calling setter if located in template.xhtml如果位于 template.xhtml 中,JSF f:viewParam 不调用 setter
【发布时间】:2012-03-22 03:47:49
【问题描述】:

也许有人可以启发我。

如果放

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

在模板中,setter

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>

【问题讨论】:

    标签: jsf facelets composition viewparams


    【解决方案1】:

    这是按规范。 &lt;f:metadata&gt; tag documentation中提到过:

    为此视图声明元数据方面。这必须是&lt;f:view&gt; 的子代。 此标记必须位于给定 viewId 的顶级 XHTML 文件中,或位于模板客户端中,但不能位于模板中。 实现必须确保 facet 的直接子级是 UIPanel,即使如果刻面只有一个孩子。实现必须将 UIPanel 的 id 设置为 UIViewRoot.METADATA_FACET_NAME 符号常量的值。

    原因很简单,因为元数据应该是特定于视图的,而不是特定于模板的。无论如何要满足您的要求,并且您不能/不想将&lt;f:metadata&gt; 放在每个模板客户端的&lt;ui:define&gt; 中,那么您最好的选择是使用一些带有@ManagedProperty 的通用bean。

    另见:

    【讨论】:

    • 非常感谢 BalusC!这澄清了事情。问候 Hanspeter
    • 这跟我的问题有关系吗?
    猜你喜欢
    • 2012-05-22
    • 1970-01-01
    • 2018-12-30
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多