JSF是基于事件驱动的,首先介绍JSF的事件侦听。介绍中我仅仅给大家提供简单的场景。不过我需要首先申明,思考这些事件的时候,你最好先用C/S架构下的模式考虑她的运作模式,再用web下js调度动作的方式去认识执行过程。
1)动作事件:Action Event:普通动作响应
actionEvent是最普通的事件,任何command组件(button,link等,请参见UICommand)通过注册actionListener均可出发此事件侦听响应,简单说,用户有意义的操作,即可触发。
2)即时事件:Immediate Event:立即处理,不验证/转换/更新模型值(即bean不会保存属性)
即时事件,立即触发,在JSF生命周期中,让恢复试图之后,获取请求值,立即触发。验证、转化、更新模型值被略过,当然更多的情况下,你需要一个为被注册的UI组件binding到后台bean中,别忘了,你使用即时事件的初衷是什么??就是我只想让程序关注此组件,并排斥其他组件或者级联组件的操作。场景:单一表单中,使用“检测用户名是否存在”。立即时间,常用来做bean层面即时服务,以执行action为主要目的。
3)值改变事件:Value Change Event:选择UI值改变后,级联调度.如果国际化中选择语言.
值改变事件,如果一个输入(UIInput)、选择(UISelects)组件的值发生改变,将会执行的侦听。所谓的值改变,就是表单中local值和submit值发生偏移,local值就是页面渲染时上一个生命周期中传递的值,简单说就是表单中原来展示的值(server端生成的组件值,在周期中编码进去)。。submit值,就是面向用户或者操作者主动输入的客户端值。
比如:表单展示时,server端为一个下拉菜单赋值为1(local值),如果用户选择了2(submit值).请你用相同的思维去考虑输入框。
如果值改变,那么就会被执行,最好的场景就是:国际化中选择语言,然后把最新的语言元素,广播到整个站点。
4)阶段事件:Phase Event:监听响应的JSF生命周期
JSF的运行大致分为6个阶段,具体如下(JSF生命周期)。当然这类事件,可以注册到组件,但是更多的时候,用来监控站点中特殊组件的数据操作。
2.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)
到此请求处理结束,根据导航规则,渲染响应的页面.依次执行…