Phase 事件

实时事件 中我们提到,JSF的请求执行到响应,完整的过程会经过六个阶段:
  • 回复画面(Restore View)

  依客户端传来的session数据或伺服端上的session数据,回复JSF画面组件。

  • 套用请求值(Apply Request Values)

  JSF画面组件各自获得请求中的值属于自己的值,包括旧的值与新的值。

  • 执行验证(Process Validations)

  转换为对象并进行验证。

  • 更新模型值(Update Model Values)

  更新Bean或相关的模型值。

  • 唤起应用程序(Invoke Application)

  执行应用程序相关逻辑。

  • 绘制回应画面(Render Response)

  对先前的请求处理完之后,产生画面以响应客户端执行结果。

  在每个阶段的前后会引发javax.faces.event.PhaseEvent,如果您想尝试在每个阶段的前后捕捉这个事件,以进行一些处理,则可以实作javax.faces.event.PhaseListener,并向javax.faces.lifecycle.Lifecycle登记这个Listener,以有适当的时候通知事件的发生。

  PhaseListener有三个必须实作的方法getPhaseId()、beforePhase()与afterPhase(),其中getPhaseId()传回一个PhaseId对象,代表Listener想要被通知的时机,可以设定的时机有:

  • PhaseId.RESTORE_VIEW
  • PhaseId.APPLY_REQUEST_VALUES
  • PhaseId.PROCESS_VALIDATIONS
  • PhaseId.UPDATE_MODEL_VALUES
  • PhaseId.INVOKE_APPLICATION
  • PhaseId.RENDER_RESPONSE
  • PhaseId.ANY_PHASE

  其中PhaseId.ANY_PHASE指的是任何的阶段转换时,就进行通知;您可以在beforePhase()与afterPhase()中撰写阶段前后撰写分别想要处理的动作,例如下面这个简单的类别会列出每个阶段的名称:

ShowPhaseListener.java
package onlyfun.caterpillar;

 import javax.faces.event.PhaseEvent;
 import javax.faces.event.PhaseId;
 import javax.faces.event.PhaseListener;

 public class ShowPhaseListener implements PhaseListener {

    public void beforePhase(PhaseEvent event) {
        String phaseName = event.getPhaseId().toString();
        System.out.println("Before " + phaseName);
    }

    public void afterPhase(PhaseEvent event) {
        String phaseName = event.getPhaseId().toString();
        System.out.println("After " + phaseName);
    }

    public PhaseId getPhaseId() {
        return PhaseId.ANY_PHASE;
    }
 }

  撰写好PhaseListener后,我们可以在faces-config.xml中向Lifecycle进行注册:

faces-config.xml
<?xml version="1.0"?>
 <!DOCTYPE faces-config PUBLIC
 "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN"
 "http://java.sun.com/dtd/web-facesconfig_1_0.dtd">

 <faces-config>
    <lifecycle>
        <phase-listener>
            onlyfun.caterpillar.ShowPhaseListener
        </phase-listener>
    </lifecycle>
    ......
 </faces-config>

  您可以使用这个简单的类别,看看在请求任一个JSF画面时所显示的内容,藉此了解JSF每个阶段的流程变化。