方法
public void beforePhase(PhaseEvent event)
public void afterPhase(PhaseEvent event)
在与相关联的方法之后调用
<p:commandButton value="Login" action="#{checkUser.login}" ajax="false" />
在我尝试实现注销功能时,现在必须按两次按钮才能离开页面。
有没有办法在上面提到的“阶段监听器”方法之前调用“命令按钮”方法?
答案 0 :(得分:1)
您需要在登录和注销后发送重定向,以便让客户端触发新的HTTP请求。
E.g。
public String login() {
// ...
return "home?faces-redirect=true";
}
public String logout() {
// ...
return "login?faces-redirect=true";
}
顺便说一句,PhaseListener
不是执行基于请求的身份验证的正确工具。您应该更喜欢servlet Filter
来完成这项工作。 PhaseListener
的主要缺点是它只在JSF请求上运行,并且在每个请求的基础上最多调用12次。有关此类过滤器的启动示例,另请参阅How to provide bean methods without EL expression
答案 1 :(得分:0)
编辑:我应该指出,BalusC的答案应该是解决这个问题的首选方法。但是,如果你仍然想玩相序,继续阅读。 /最终编辑
实际上,如果将其实现为侦听每个阶段,则可以在action-attribute中指定的方法之前和之后调用phaseListeners。
public class MyPhaseListener implements PhaseListener {
public PhaseId getPhaseId() { return PhaseId.ANY_PHASE; }
public void beforePhase(PhaseEvent event) {
System.out.println("Before Phase: " + event.getPhaseId());
}
public void afterPhase(PhaseEvent event) {
System.out.println("After Phase: " + event.getPhaseId());
}
}
在faces-config.xml中激活你的监听器
<faces-config ... >
<lifecycle>
<phase-listener>MyPhaseListener</phase-listener>
</lifecycle>
</faces-config>
以下是所有Listener调用的打印输出以及调用actionListener和action的时间:
INFO: Before Phase: RESTORE_VIEW 1
INFO: After Phase: RESTORE_VIEW 1
INFO: Before Phase: APPLY_REQUEST_VALUES 2
INFO: After Phase: APPLY_REQUEST_VALUES 2
INFO: Before Phase: PROCESS_VALIDATIONS 3
INFO: After Phase: PROCESS_VALIDATIONS 3
INFO: Before Phase: UPDATE_MODEL_VALUES 4
INFO: After Phase: UPDATE_MODEL_VALUES 4
INFO: Before Phase: INVOKE_APPLICATION 5
INFO: ActionListener Done
INFO: Action Done
INFO: After Phase: INVOKE_APPLICATION 5
INFO: Before Phase: RENDER_RESPONSE 6
INFO: After Phase: RENDER_RESPONSE 6