2013-06-27 35 views
1

我需要一种方法,只要我的组件被渲染,即它在第一次和每次更新时创建。当父视图中存在“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事件”零件?

在此先感谢您的任何答案。

回答

2

按照the <f:metadata> documentation,视图可以有只有一个<f:metadata>这就需要在模板客户(这是被在HTTP请求打开顶层XHTML页面)去。

复合材料中的<f:metadata>被取代。它不属于那里。摆脱它。 <f:event>本身不需要被放置在<f:metadata>内。此作品为intented:因为第二<f:metadata>被完全忽略,包括它的所有子

<composite:implementation> 
    <f:event type="preRenderComponent" listener="#{cc.generateString}" /> 
    ... 
</composite:implementation> 

你的具体问题引起的。

没错,你看到了很多例子<f:metadata><f:viewParam><f:event type="preRenderView">,但<f:event>在这种特定的情况下,实际上是一个解决方法和公正放在同样的<f:metadata>内为<f:viewParam>的IT需要一起工作自纪录片的目的。在JSF 2.2中,正​​确的方法已经引入了<f:viewAction>的风格。另请参阅What can <f:metadata>, <f:viewParam> and <f:viewAction> be used for?

+0

非常感谢您的回答!由于我现在不打算升级到JSF 2.2,因此我使用f:metadata之外的f:event,现在工作正常;) –

+0

不客气。 – BalusC