阶段监听器和命令按钮

时间:2012-12-06 01:07:23

标签: java jsf jsf-2 xhtml phaselistener

方法

public void beforePhase(PhaseEvent event)
public void afterPhase(PhaseEvent event)
在与

相关联的方法之后调用

<p:commandButton value="Login" action="#{checkUser.login}" ajax="false" />

在我尝试实现注销功能时,现在必须按两次按钮才能离开页面。

有没有办法在上面提到的“阶段监听器”方法之前调用“命令按钮”方法?

2 个答案:

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