文档章节

JSF---->事件处理---Phase 事件

小强斋太
 小强斋太
发布于 2016/11/09 20:07
字数 827
阅读 3
收藏 0

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

 

 

本文转载自:http://www.cnblogs.com/xqzt/archive/2012/05/17/5637369.html

共有 人打赏支持
小强斋太
粉丝 0
博文 181
码字总数 0
作品 0
广州
私信 提问
JSF生命周期(life cycle)

和JSF生命周期相关的请求与响应有两类:分别是Faces response和Non-Faces response,以及Faces request和Non-Faces。 另外有三种场景与此相关分别是: Scenario 1: Non-Faces Request Genera...

崔钢
2011/04/08
0
0
JSF 探索 (1)

JSF 探索 (1) 虽然JSF已经出来好久了,而且好像感觉不是很潮流的框架了,然后当我看见他的时候,我觉得他的思想很好,而且随着手机等client多样化的出现,我相信人们 必将重新拾起JSF的思想...

linugb118
2010/11/04
0
0
Spring+JSF+JPA(Hibernate)的环境搭建(一)

前言 由于primefaces在国内使用的并不是太多,因此,国内对jsf做系统、详细的介绍的资料很少,即使有一些资料,也仅仅是对国外资料的简单翻译或者是仅仅讲表面现象(皮毛而已),它们的语句甚...

码上中国博客
2015/02/06
0
2
nginx模块描述,模块分类,处理流程

一,模块概述 nginx将各功能模块组织成一条链,当有请求到达的时候,请求依次经过这条链上的部分或者全部模块,进行处理。每个模块实现特定的功能。例如,实现对请求解压缩的模块,实现SSI的...

daydayup08
2016/06/28
60
0
深入分析Node.js事件循环与消息队列

多数的网站不需要大量计算,程序花费的时间主要集中在磁盘 I/O 和网络 I/O 上面 SSD读取很快,但和CPU处理指令的速度比起来也不在一个数量级上,而且网络上一个数据包来回的时间更慢: 一个数...

小平果118
08/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Libusb交叉编译和移植

  Libusb交叉编译和移植      某项目内核需要支持USB的相关操作,所以考虑移植Libusb库      1、到官网下载最新的libusb源码(1.0.22)      2、解压源码      3、进入解压...

SEOwhywhy
3分钟前
0
0
阿里云HBase全新发布X-Pack NoSQL数据库再上新台阶

一、八年双十一,造就国内最大最专业HBase技术团队 阿里巴巴集团早在2010开始研究并把HBase投入生产环境使用,从最初的淘宝历史交易记录,到蚂蚁安全风控数据存储。持续8年的投入,历经8年双...

阿里云云栖社区
6分钟前
0
0
【58沈剑 架构师之路】数据库索引,到底是什么做的?

问题1. 数据库为什么要设计索引? 图书馆存了1000W本图书,要从中找到《架构师之路》,一本本查,要查到什么时候去? 于是,图书管理员设计了一套规则: (1)一楼放历史类,二楼放文学类,三楼...

张锦飞
7分钟前
0
0
android webpage err_unknown_url_scheme

搞一个 Android 的webview demo 来访问网页, 结果 模拟器就报错了: webpage err_unknown_url_scheme 于是去百度了 一下。发现挺多解决方案的,都拿来试试。居然有几种方式都可以。 1, 参考...

之渊
9分钟前
0
0
JVM总结

区域简介 JVM运行时区域有些随着虚拟机进程的启动而存在,有些依赖于用户线程的启动和结束而建立和销毁,大致分为以下几类:方法区,虚拟机栈,本地方法栈,堆,程序计数器,概念图如下(源于...

瑞查德-Jack
10分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部