【发布时间】:2013-06-25 07:43:15
【问题描述】:
我需要一个方法来在我的组件被渲染时执行,即当它第一次被创建和每次更新时。
一种方法是使用 f:metadata 和 f:event 事件“preRenderComponent”。它工作得很好,除非我在持有该组件的视图中也有一个带有 f:viewParam 的 f:metadata。如果我在父视图中有 f:viewParam,则组件中的 f:event 将被忽略。
如何解决这个问题,为什么会这样?
这里有一些重现问题的代码:
视图(index.xhtml):
<h:body>
<f:metadata>
<f:viewParam name="vparam" value="#{index.vparam}" />
</f:metadata>
<comp:component />
</h:body>
managedBean (Index.java)
@ManagedBean(name="index")
public class Index implements Serializable {
private String vparam;
public void setVparam(String vparam) {
this.vparam = vparam;
}
public String getVparam() {
return vparam;
}
}
组件视图(component.xhtml):
<h:body>
<composite:interface componentType="component" />
<composite:implementation>
<f:metadata>
<f:event type="preRenderComponent" listener="#{cc.generateString}" />
</f:metadata>
<h:outputText value="#{cc.string}" />
</composite:implementation>
</h:body>
组件的java类(Component.java):
@FacesComponent(value="component")
public class Component extends UINamingContainer implements Serializable {
private String string;
public void generateString(){
System.out.println("*** PRE RENDERING COMPONENT...");
System.out.flush();
string = "It worked!";
}
public String getString(){
return string;
}
}
此代码的预期输出是:字符串“It works!”打印在索引页中。 实际输出是:什么都没有,因为空字符串被 h:outputText 打印为 ""。
在日志文件中,“*** PRE RENDERING COMPONENT...”没有打印出来,它永远不会被执行。
如果我从 index.xhtml 中删除以下行,一切正常:
<f:viewParam name="vparam" value="#{index.vparam}" />
为什么组件的父页面中存在“viewParam”使得JSF忽略了组件中的“f:event”?
提前感谢您的任何回答。
【问题讨论】:
标签: jsf metadata composite-component