在渲染时插入/添加JSF组件

时间:2012-02-20 03:25:58

标签: jsf java-ee

是否可以在渲染过程中添加子组件?如果不是在JSF 1.2环境中动态添加子组件的最佳实践?感谢

1 个答案:

答案 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"/>