我需要一种方法,只要我的组件被渲染,即它在第一次和每次更新时创建。当父视图中存在“viewParam”时,会忽略“preRenderComponent”
这样做的一种方式是对事件“preRenderComponent”使用f:metadata和f:event。它工作得很好,除非我在持有组件的视图中也有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;
}
}
组件视图(组分.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;
}
}
这段代码的预期输出是:字符串“它的工作!”打印在索引页面中。 实际输出是:什么都没有,因为空字符串被h:outputText打印为“”。
在日志文件“* ** PRE RENDERING COMPONENT ...”中未打印,它从未执行过。
如果我删除的index.xhtml以下行,一切工作正常:
<f:viewParam name="vparam" value="#{index.vparam}" />
为什么在组件父页面做的“viewParam”的存在使得JSF忽视:在“F事件”零件?
在此先感谢您的任何答案。
非常感谢您的回答!由于我现在不打算升级到JSF 2.2,因此我使用f:metadata之外的f:event,现在工作正常;) –
不客气。 – BalusC