所谓的实时事件(Immediate Events),是指JSF视图组件在取得请求中该取得的值之后,即立即处理指定的事件,而不再进行后续的转换器处理、验证器处理、更新模型值等流程。
在JSF的事件模型中会有所谓实时事件,导因于Web应用程序的先天特性不同于GUI程序,所以JSF的事件模式与GUI程序的事件模式仍有相当程度的不同,一个最基本的问题正因为HTTP无状态的特性,使得Web应用程序天生就无法直接唤起伺服端的特定对象。
所有的对象唤起都是在伺服端执行的,至于该唤起什么对象,则是依一个基本的流程:
- 回复画面(Restore View)
依客户端传来的session数据或伺服端上的session数据,回复JSF画面组件。
- 套用请求值(Apply Request Values)
JSF画面组件各自获得请求中的值属于自己的值,包括旧的值与新的值。
- 执行验证(Process Validations)
转换为对象并进行验证。
- 更新模型值(Update Model Values)
更新Bean或相关的模型值。
- 唤起应用程序(Invoke Application)
执行应用程序相关逻辑。
- 绘制回应画面(Render Response)
对先前的请求处理完之后,产生画面以响应客户端执行结果。
对于动作事件(Action Event)来说,组件的动作事件是在套用请求值阶段就生成ActionEvent对象了,但相关的事件处理并不是马上进行,ActionEvent会先被排入队列,然后必须再通过验证、更新模式值阶段,之后才处理队列中的事件。
这样的流程对于按下按钮然后执行后端的应用程序来说不成问题,但有些事件并不需要这样的流程,例如只影响画面的事件。
举个例子来说,在窗体中可能有使用者名称、密码等字段,并提供有一个地区选项按钮,使用者可以在不填下按钮的情况下,就按下地区选项按钮,如果依照正常的流程,则会进行验证、更新模型值、唤起应用程序等流程,但显然的,使用者名称与密码是空白的,这会引起不必要的错误。
您可以设定组件的事件在套用请求值之后立即被处理,并跳过后续的阶段,直接进行画面绘制以响应请求,对于JSF的input与command组件,都有一个immediate属性可以设定,只要将其设定为true,则指定的事件就成为立即事件