まったく同じフックを達成するために得ることができる最も近いものは
<f:view beforePhase="#{bean.beforePhase}" afterPhase="#{bean.afterPhase}">
と
public void beforePhase(PhaseEvent event) {
if (event.getPhaseId == PhaseId. RENDER_RESPONSE) {
// ...
}
}
public void afterPhase(PhaseEvent event) {
if (event.getPhaseId == PhaseId. RENDER_RESPONSE) {
// ...
}
}
これpreRender
は簡単な方法で実現できます。これをビューのどこにでも配置できます。
<f:event type="preRenderView" listener="#{bean.preRenderView}" />
と
public void preRenderView(ComponentSystemEvent event) {
// ...
}
(引数はオプションです。使用しない場合は省略できます)
のようなものはありませんpostRenderView
が、カスタムイベントを簡単に作成できます。例えば
@NamedEvent(shortName="postRenderView")
public class PostRenderViewEvent extends ComponentSystemEvent {
public PostRenderViewEvent(UIComponent component) {
super(component);
}
}
と
public class PostRenderViewListener implements PhaseListener {
@Override
public PhaseId getPhaseId() {
return PhaseId.RENDER_RESPONSE;
}
@Override
public void beforePhase(PhaseEvent event) {
// NOOP.
}
@Override
public void afterPhase(PhaseEvent event) {
FacesContext context = FacesContext.getCurrentInstance();
context.getApplication().publishEvent(context, PostRenderViewEvent.class, context.getViewRoot());
}
}
faces-config.xml
として登録する
<lifecycle>
<phase-listener>com.example.PostRenderViewListener</phase-listener>
</lifecycle>
その後、最終的に使用することができます
<f:event type="postRenderView" listener="#{bean.postRenderView}" />
と
public void postRenderView(ComponentSystemEvent event) {
// ...
}