hpg*_*ler 7 jsf facelets composition viewparams
也许有人可以启发我.
如果放
<f:metadata>
<f:viewParam name="test" value="#{test.value}"/>
</f:metadata>
Run Code Online (Sandbox Code Playgroud)
在模板内,设置者
setValue永远不会被调用,即调用preRender方法'call()'而不事先调用setter(参见下面的代码示例以供参考).
但是,如果将元数据块放在合成中,则会按预期调用它.
这是正常行为还是我做错了什么?
非常感谢任何见解.
Hanspeter
供参考,这里是非工作版本的完整代码示例:
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>
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
这里是工作版的完整代码示例:
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>
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
Bal*_*usC 14
这是规范.它在<f:metadata>标签文档中提到:
声明此视图的元数据构面.这一定是孩子的
<f:view>.此标记必须位于给定viewId的顶级XHTML文件中,或位于模板客户端中,但不能位于模板中.实施必须确保方面的直接子项是UIPanel,即使该方面只有一个子项.实现必须将UIPanel的id设置为UIViewRoot.METADATA_FACET_NAME符号常量的值.
原因很简单,因为元数据应该是特定于视图的,而不是模板特定的.为了实现反正你的要求,你不能/不想把<f:metadata>里面的<ui:define>每个模板客户端,那么你最好的选择是使用了一些常见的豆类@ManagedProperty.
| 归档时间: |
|
| 查看次数: |
5858 次 |
| 最近记录: |