`
lonvea
  • 浏览: 75429 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JSF生命周期简介

阅读更多

前沿:对于很多JSF初学者,甚至是有开发经验的开发者,都没有清晰的认识JSF的生命周期已经如何恰当使用JSF构架合适的项目。

 

    在此我需要首先说一下,JSF是一个优秀的框架,并且它相当的成熟,但是请你不要用斧子去切菜,很多时候你会骂“斧子”不锋利。。使用JSF要知道它适合的开发场景

 

    1)JSF不适合以页面展现为目的的web站点:如果你的项目,是一个信息系统,或者是一个合并了强大静态数据的应用系统,那么用JSF稍微有些不妥,因为JSF不能再展现上为你节约更多的人力,反而它会绑架你的思考或者设计方式。

 

    2)JSF虽然提供了强大组件,以及“承诺”的自定义组件开发,但是很多时候组件约束了你的手脚,你会逼着自己用组件去做文章,再者“自定义”组件并没有你想象的那么“温柔”反而很坎坷。。有时候你会怀念html的放荡,JS的“忠诚”。。

 

 

    3)JSF的组件,已经动态消息机制,页面流程统一管理,等等特性,其实时时在想你发出一个信号,“我适合做交互复发,操作繁多的面向用户的应用系统”。

 

 

 

    在你使用JSF之前,你需要了解下面的两种事情,它会让你在“清醒”中开发“清醒”的程序,闭着眼开发JSF,其实你在浪费自己的时间,也在浪费老板为你开出的低廉的“租金”。

 

 

    1.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) 执行验证


         如果组件注册验证器,依次执行验证.


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

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

 

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

 

 

 

    在此我需要罗嗦一句,每当我看到员工把业务逻辑写在actionListener里的时候,就有点窝火。actionListener真正目的是让开发者通过获取触发事件的组件,逐末求源,级联操作其他组件(binding的使用),或者定性的操作触发事件的组件数据,listener说白了,就是处理面向UI的数据操作。从更新模型之后的binding的UI中获取三方附属数据,如触发action的组件的style,状态,国际化,http等。而不是让用来做业务处理的。action方法及事件驱动程序部分,才是用来做业务服务的,然后指定导航。。。

 

    如果谁在乱写,小心没收你的“小弟弟”。。。。。。。。。

 

 

 

 

 

 

4
1
分享到:
评论
3 楼 shiw019 2016-03-03  
   写的不错,多谢楼主
2 楼 lonvea 2015-06-14  
kongxm66 写道
就是瞎鸡-巴写,你来没收我小弟弟啊!


我去,这么多年了,竟然还有人看我的blog。太感动了。
1 楼 kongxm66 2014-09-12  
就是瞎鸡-巴写,你来没收我小弟弟啊!

相关推荐

Global site tag (gtag.js) - Google Analytics