如果位于 template.xhtml 中,JSF f:viewParam 不调用 setter
Posted
技术标签:
【中文标题】如果位于 template.xhtml 中,JSF f:viewParam 不调用 setter【英文标题】:JSF f:viewParam not calling setter if located in template.xhtml 【发布时间】: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>
【问题讨论】:
【参考方案1】:这是按规范。 <f:metadata>
tag documentation中提到过:
为此视图声明元数据方面。这必须是
<f:view>
的子代。 此标记必须位于给定 viewId 的*** XHTML 文件中,或位于模板客户端中,但不能位于模板中。 实现必须确保 facet 的直接子级是 UIPanel,即使如果刻面只有一个孩子。实现必须将 UIPanel 的 id 设置为UIViewRoot.METADATA_FACET_NAME
符号常量的值。
原因很简单,因为元数据应该是特定于视图的,而不是特定于模板的。无论如何要满足您的要求,并且您不能/不想将<f:metadata>
放在每个模板客户端的<ui:define>
中,那么您最好的选择是使用一些带有@ManagedProperty
的通用bean。
另见:
When using <ui:composition> templating, where should I declare the <f:metadata>? ViewParam vs @ManagedProperty(value = "#param.id")【讨论】:
非常感谢 BalusC!这澄清了事情。问候 Hanspeter 这跟我的问题有关系吗?以上是关于如果位于 template.xhtml 中,JSF f:viewParam 不调用 setter的主要内容,如果未能解决你的问题,请参考以下文章