Вставить / добавить компонент JSF во время рендеринга - PullRequest
2 голосов
/ 20 февраля 2012

Можно ли добавить дочерний компонент во время рендеринга? Если нет, то что было бы наилучшим способом динамического добавления дочернего компонента в среду JSF 1.2? Спасибо

1 Ответ

1 голос
/ 07 августа 2012

Лучшее место, где вы можете сделать это, в реализации 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, потому что на этой фазе вы находитесьзавершите дерево компонентов.

Ваше определение прослушивателя фазы должно быть задано в элементе жизненного цикла face-config.xml следующим образом:

<lifecycle>
    <phase-listener>your.package.ViewModifierPhaseListener</phase-listener>
</lifecycle>

Или, если вы работаете с Facelets, вы можете определитьэто в шаблоне страниц вы хотите, чтобы ваш слушатель затронул вас.Это поможет вам определить, когда выполнять ваш PhaseListener.

<f:phaseListener type="your.package.ViewModifierPhaseListener"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...