Лучшее место, где вы можете сделать это, в реализации 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"/>