コンポーネントがレンダリングされるたびに、つまり、コンポーネントが初めて作成されたときと更新ごとに実行されるメソッドが必要です。
これを行う方法は、イベント「preRenderComponent」に f:metadata と f:event を使用することです。コンポーネントを保持しているビューに f:viewParam を持つ af:metadata も含まれていない限り、それは完全にうまく機能します。親ビューに af: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;
}
}
このコードの期待される出力は次のとおりです。インデックスページに掲載。空文字列は h:outputText によって "" として出力されるため、実際の出力は次のとおりです。
ログファイルでは、「* ** PRE RENDERING COMPONENT...」は出力されず、実行されません。
index.xhtml から次の行を削除すると、すべて正常に動作します。
<f:viewParam name="vparam" value="#{index.vparam}" />
コンポーネントの親ページに「viewParam」が存在すると、JSF がコンポーネントの「f:event」を無視するのはなぜですか?
ご回答ありがとうございます。