6.5.5 阶段事件示例
在本节及前面几节,我们介绍了JSF主要的3种事件,即动作事件、值改变事件和阶段事件。当JSF应用运行时,这三种事件都可能发生,有些事件发生在这个阶段,有些事件发生在另一个阶段,JSF应用正是通过事件的触发和响应,来实现各种各样的功能的。
我们已经知道,JSF将请求处理过程划分为若干个阶段,在每个阶段,阶段事件都会发生,那么,动作事件和值改变事件又发生在哪些阶段呢?这正是本例要回答的问题。
我们用一个简单的JSF页面来揭示JSF事件发生的先后顺序。在一个页面上,放置一个文本字段组件和一个按钮组件,分别触发值改变事件和动作事件,与阶段事件交织在一起。当任一事件发生时,我们在其事件处理方法中输出一行信息,通过观察这些信息,就可以知道事件发生的先后顺序。
在NetBeans中的操作步骤如下:
1. 新建一个“Web应用程序”项目,选择“Visual Web JavaServer Faces”为框架;
2. 设计Page1页面:
a) 放置一个文本字段组件,用来触发值改变事件。双击该组件,编辑其事件处理方法代码,使输出字符串“值改变事件”,如图 6 29所示;
|
| (点击查看大图)图 6 29 值改变事件处理方法代码 |
b) 放置一个按钮组件,用来触发动作事件。双击该组件,编辑其事件处理方法代码,使输出字符串“动作事件”,如图 6 30所示。
|
| 图 6 30 动作事件处理方法代码 |
3. 设计阶段监听器:
a) 创建一个Java类MyListener,使实现PhaseListener接口;
b) 在MyListener的beforePhase()方法中,输出字符串“阶段”+阶段名称+“开始”;
c) 在MyListener的afterPhase()方法中,输出字符串“阶段”+阶段名称+“结束”。
MyListener类的代码如图 6 31所示。
|
| (点击查看大图)图 6 31 阶段监听器MyListener的代码 |
4. 注册阶段监听器MyListener:
编辑JSF配置文件faces-config.xml,在其中加入MyListener的注册代码,如图 6 32的高亮部分所示。
|
| (点击查看大图)图 6 32 在faces-config.xml中注册阶段监听器MyListener |
运行程序,当Page1页面被呈现时,可以观察到一些输出。暂时忽略这些输出,我们感兴趣的是,在文本框中输入一些字符再点击按钮后,被触发的值改变事件、动作事件和阶段事件是如何交织在一起的。下面是从输出窗口拷贝下来的输出信息:
阶段RESTORE_VIEW 1开始
阶段RESTORE_VIEW 1完成
阶段APPLY_REQUEST_VALUES 2开始
阶段APPLY_REQUEST_VALUES 2完成
阶段PROCESS_VALIDATIONS 3开始
值改变事件
阶段PROCESS_VALIDATIONS 3完成
阶段UPDATE_MODEL_VALUES 4开始
阶段UPDATE_MODEL_VALUES 4完成
阶段INVOKE_APPLICATION 5开始
动作事件
阶段INVOKE_APPLICATION 5完成
阶段RENDER_RESPONSE 6开始
阶段RENDER_RESPONSE 6完成
从这段输出信息可以看出,典型情况下:
JSF的请求处理要经历6个阶段,这6个阶段依次是:
1. Restore View阶段,即“恢复视图”阶段;
2. Apply Request Value阶段,即“应用请求值”阶段;
3. Process Validation阶段,即“验证数据”阶段;
4. Update Model Value阶段,即“更新模型值”阶段;
5. Invoke Application阶段,即“调用应用”阶段;
6. Render Response阶段,即“呈现响应”阶段。
值改变事件发生在第3个阶段,早于动作事件;
动作事件发生在第5个阶段,晚于值改变事件。
图 6 33示出了JSF的请求处理阶段和各种事件的关系。图中,从左到右的6个椭圆代表请求处理过程及其行进方向,虚线代表事件的触发,小圆点指示触发事件的时间,而箭头所指则是被触发事件的类型。
|
| (点击查看大图)图 6 33 JSF请求处理阶段和各种事件的关系 |
提示:随本书发行的光盘中含有本范例源代码,目录名称为eventdriven8。具体使用方法请参阅《第12章 使用源代码光盘》。
| 回书目 上一节 |