是否可以在渲染过程中添加子组件?如果不是在JSF 1.2环境中动态添加子组件的最佳实践?感谢
答案 0 :(得分:1)
您可以在PhaseListener实现中更好的地方。
例如,下一个代码段会演示如何将新组件添加到视图根目录中:
public class ViewModifierPhaseListener implements
javax.faces.event.PhaseListener {
@Override
public void afterPhase(PhaseEvent event) {
}
// Just sampling add component on ViewRoot
@Override
public void beforePhase(PhaseEvent event) {
// Gets the target component from ViewRoot
UIViewRoot viewRoot = event.getFacesContext().getViewRoot();
UIComponent parent = viewRoot.findComponent("parentComponentId");
// UIComponents to create depend on JSF implementation,
// Try to use the available factories when suplied by the implementation
UIComponent child = Factory.getComponent("ComponentClassName");
// Customize the component, for instance it has to be disabled
child.getAttributes().put("disabled", true);
// Adds the fresh created component to the parent
parent.getChildren().add(child);
}
@Override
public PhaseId getPhaseId() {
return PhaseId.RENDER_RESPONSE;
}
}
请注意,getPhaseId会返回RENDER_RESPONSE阶段,因为在该阶段您可以完成组件树。
您的阶段侦听器定义必须在faces-config.xml的生命周期元素中设置,如下所示:
<lifecycle>
<phase-listener>your.package.ViewModifierPhaseListener</phase-listener>
</lifecycle>
或者,如果您使用facelets,则可以在要受侦听器影响的页面的模板中定义它。这有助于您区分何时执行PhaseListener。
<f:phaseListener type="your.package.ViewModifierPhaseListener"/>