JSF处理请求时的每个阶段与简单说明,起始状态即使用者端发出请求时,终止状态则相当于绘制器发出响应时

扣除事件处理,JSF总共必须经过六个阶段:

1)恢复视图(Restore View)

视图表示组成特定页面的所有组件。它被保存在客户端(通常存储在隐藏字段中)或服务器中(通常在会话中)。根据请求访问的视图ID(页面地址),重建JSF 组件DOM树。如果JSF页面是第一次访问,也即是试图ID在内存中没没有存根,那么JSF会在内存中构建JSF组件的DOM树。恢复视图也确保了组件的值,与树中的组件相关联的事件监听器、验证器或者转换器,都被恢复。

2)应用请求值(Apply Request Values)

JSF组件获取请求中的属于自己的值,包括Local值,和submit值.同时处理转换,转换成功,更新local值(submit转换结果),当然过程没有那么简单,JSF处理器有自己的一套解码过程。

3) 执行验证

在处理验证阶段,JSF遍历组件树并检查每个组件,看是否每个组件的被提交值都可以接受。验证发生前,被提交值将首先由注册到该组件的转换器或者默认转换器进行转换。然后验证直接由组件进行或者委托给一个或者多个其他验证器来进行。如果用户的输入无效就会向FacesContext中增加一个错误消息,并且该组件会被表示为无效,然后转到响应阶段,显示当前视图,表示错误信息。

4)更新模型值:如果所有的组件本地值转换验证等均成功,此时JSF就会根据EL处理关联的bean,并更新bean绑定值.在此处JSF会根据EL绑定加载配置的后台bean。

5)调用应用:调用注册的侦听器,然后执行事件驱动,获取下一个视图。侦听器此时可以有效的侦听到UI组件的各项数据,事件驱动部分即action可以有效的获取被更新的后台bean数据。执行自己的业务逻辑。

6)渲染响应(Render Response)

到此请求处理结束,根据导航规则,渲染响应的页面.依次执行

实时事件 中的例子

jsf页面第一次访问时

16:51:58,438 INFO  [STDOUT] Before RESTORE_VIEW 1
16:51:58,448 INFO  [STDOUT] After RESTORE_VIEW 1
16:51:58,448 INFO  [STDOUT] Before RENDER_RESPONSE 6
16:51:58,579 INFO  [STDOUT] After RENDER_RESPONSE 6

会发现immediate="true"时,后台打印的输出

16:52:01,939 INFO  [STDOUT] Before RESTORE_VIEW 1
16:52:01,970 INFO  [STDOUT] After RESTORE_VIEW 1
16:52:01,970 INFO  [STDOUT] Before APPLY_REQUEST_VALUES 2
16:52:01,970 INFO  [STDOUT] After APPLY_REQUEST_VALUES 2
16:52:01,970 INFO  [STDOUT] Before RENDER_RESPONSE 6
16:52:02,010 INFO  [STDOUT] After RENDER_RESPONSE 6

不加immediate="true"时 后台打印的输出

16:50:52,044 INFO  [STDOUT] Before RESTORE_VIEW 1
16:50:52,065 INFO  [STDOUT] After RESTORE_VIEW 1
16:50:52,065 INFO  [STDOUT] Before APPLY_REQUEST_VALUES 2
16:50:52,075 INFO  [STDOUT] After APPLY_REQUEST_VALUES 2
16:50:52,075 INFO  [STDOUT] Before PROCESS_VALIDATIONS 3
16:50:52,075 INFO  [STDOUT] After PROCESS_VALIDATIONS 3
16:50:52,075 INFO  [STDOUT] Before UPDATE_MODEL_VALUES 4
16:50:52,075 INFO  [STDOUT] After UPDATE_MODEL_VALUES 4
16:50:52,075 INFO  [STDOUT] Before INVOKE_APPLICATION 5
16:50:52,075 INFO  [STDOUT] After INVOKE_APPLICATION 5
16:50:52,075 INFO  [STDOUT] Before RENDER_RESPONSE 6
16:50:52,105 INFO  [STDOUT] After RENDER_RESPONSE 6

如果您只是要「使用」JSF,则您最基本的只需要知道「执行验证」、「更新模型值」、与「唤起应用程序」这三个阶段及中间的事件触发,JSF参考实作将这三个阶段之外的其它阶段之复杂性隐藏起来了,您不需要知道这几个阶段的处理细节。

然而如果您要自订组件,则您还必须知道「回复画面」、「套用请求值」与「绘制响应」这些阶段是如何处理的,这几个阶段相当复杂,所幸的是您可以使用JSF 所提供的框架来进行组件自订,JSF提供的框架已经很大程度上降低了组件制作的复杂性。

当然,即使JSF框架降低了复杂性,但实际上要处理JSF自订组件还是很复杂的一件事,在尝试开发自订组件之前,您可以先搜寻一些网站,像是 Apache MyFaces http://myfaces.apache.org/ ,看看是不是已经有相关类似的组件已经开发完成,省去您重新自订组件的气力。