JSF---->事件处理---Phase 事件
2016-11-09 00:00
246 查看
Phase 事件
JSF的请求执行到响应,完整的过程会经过六个阶段:回复画面(Restore View)
依客户端传来的session数据或伺服端上的session数据,回复JSF画面组件。
套用申请值(Apply Request Values)
每个组件尝试从到来的请求中找寻自己的参数并更新组件值,在这边会触发ActionEvent,这个事件会被排入队列中,然后在唤起应用程序阶段之后才会真正由事件处理者进行处理。
然而对于设定immeduate为true的命令(Commamnd)组件来说,会立即处理事件并跳过之后的阶段直接绘制响应,而对于设定immediate为true的输入(Input)组件,会马上进行转换验证并处理值变事件,之后跳过接下来的阶段,直接绘制响应。
执行验证(Process Validations)
进行转换与验证处理,如果验证错误,则会跳过之后的阶段,直接绘制响应,结果是重新呼叫同一页绘制结果。
更新模型值(Update Model Values)
更新每一个与组件绑定的backing 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 wsz.ncepu; 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> wsz.ncepu.ShowPhaseListener </phase-listener> </lifecycle> ...... </faces-config>
您可以使用这个简单的类别,看看在请求任一个JSF画面时所显示的内容,藉此了解JSF每个阶段的流程变化。
登录的执行结果:
10:59:25,095 INFO [STDOUT] Before RESTORE_VIEW 1 10:59:25,105 INFO [STDOUT] After RESTORE_VIEW 1 10:59:25,105 INFO [STDOUT] Before RENDER_RESPONSE 6 10:59:25,136 INFO [STDOUT] After RENDER_RESPONSE 6
点击送出之后
10:59:34,966 INFO [STDOUT] Before RESTORE_VIEW 1 10:59:34,976 INFO [STDOUT] After RESTORE_VIEW 1 10:59:34,976 INFO [STDOUT] Before APPLY_REQUEST_VALUES 2 10:59:34,987 INFO [STDOUT] After APPLY_REQUEST_VALUES 2 10:59:34,987 INFO [STDOUT] Before PROCESS_VALIDATIONS 3 10:59:34,987 INFO [STDOUT] After PROCESS_VALIDATIONS 3 10:59:34,987 INFO [STDOUT] Before UPDATE_MODEL_VALUES 4 10:59:34,987 INFO [STDOUT] After UPDATE_MODEL_VALUES 4 10:59:34,987 INFO [STDOUT] Before INVOKE_APPLICATION 5 10:59:34,997 INFO [STDOUT] After INVOKE_APPLICATION 5 10:59:34,997 INFO [STDOUT] Before RENDER_RESPONSE 6 10:59:35,247 INFO [STDOUT] After RENDER_RESPONSE 6
相关文章推荐
- JSF---->事件处理---Phase 事件
- JSF---->事件处理---Phase 事件
- JSF---->事件处理---动作事件
- JSF---->事件处理--值变事件
- JSF---->事件处理--值变事件
- JSF---->事件处理---动作事件
- JSF---->事件处理----实时事件
- JSF---->事件处理----实时事件
- JSF 2 简介,第 3 部分: 事件处理、JavaScript 和 Ajax
- <input>中中文输入时input事件处理
- redis学习笔记->事件处理流程
- EasyUI的datagrid中<a>标签需要点两次才能触发事件的处理方法
- <Android>长按事件的连续处理
- JSF---->错误讯息处理
- JSF事件处理
- <asp: DropDownList>实现事件处理
- <HeadFirst_HTML5> O'REILLY_Chap.3_事件_处理程序
- <WEB>平板_手机开发_13 个处理触摸事件和多点触摸的JS 库
- JSF---->错误讯息处理
- JSF中的<h:selectBooleanCheckBox/>标签的监听事件