浏览 6298 次
锁定老帖子 主题:关于jsf 生命周期
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-05-04
这是jsf 的分析系列第三篇,随着不断的深入,jsf的设计变得越来越清晰。当然,在目前的规范中,jsf还是很不完善的,这也就导致了为什么jsf还是不能成为目前的主流框架。先不去谈论这些弊端,还是先看看一下jsf具体是如何运作的。
对于jsf规范,个人觉得和其他框架相比,最大的区别,可能在于jsf划分了web 请求的生命周期。like ejb一样,web 请求也是有生命周期的。虽然,在其他的框架中,也可以看到相关的生命周期,但还是没有jsf划分的清晰。也许,这也是jsf的一大特色。 对于生命周期的执行,所有的操作都归结到Lifecycle这个接口。接口包括了两个主要的方法: public abstract void execute(FacesContext context) throws FacesException;和 public abstract void render(FacesContext context) throws FacesException; 前者是用来执行各个生命周期的阶段,也就是除了render之外的其他五个阶段,而且是按照相应的顺序执行。而render,是执行最后一个阶段,展示页 面。可能有人不太理解,为什么不把两个方法合并成一个方法,刚开始,我也是这么认为。既然已经定义了相应的Phase,何必要把最后的render过程分 离出来。看了sun 的RI实现类,发现在render之前需要进行context.getResponseComplete()判断,可能规范中,认为render是必须要 执行的阶段,其他的阶段可以跳过,所以分离了相应的方法,同时在执行前,为了避免重复输出,需要对render过程进行特殊的处理. 规范中定义了6个阶段,从下面的流程图中可以看到。 简单介绍一下每个阶段的工作: RESTORE_VIEW:查找原有的view ,恢复原有的状态,如果没有,则调用ViewHandler.createView,如果为post操作,则按照顺序执行各个阶段。 否则执行RENDER_RESPONSE阶段。 APPLY_REQUEST_VALUES:读取客户端参数,处理各个组件的processDecodes方法,内部调用decode方法,由Renderer执行decode方法 PROCESS_VALIDATIONS:执行组件的processValidators方法,对于UIInput执行validate方法,用于绑定值,调用convert,和validate UPDATE_MODEL_VALUES:执行组件的processUpdates方法,对于UIViewRoot,执行broadcastEvents和notifyPhaseListeners 所有的UIInput,执行updateModel方法。 INVOKE_APPLICATION:调 用UIViewRoot.processApplication方法。这一过程主要读取相应的action配置,如果存在action,则调用 action,也就是调用应用逻辑。在执行完相应的逻辑后,查询action是否返回值,如果有,由navigationHandler去读取下一个 view id。 RENDER_RESPONSE:展示view,调用ViewHandler.renderView,展示view。 每 个阶段定义定义的都比较清晰,有一点需要注意的是,在处理请求时,并不一定会执行每个阶段,可能其中会直接跳到最后的render response阶段。举例来说,如果validator时,存在错误信息,那么就会直接到render response阶段,而下一个阶段不会执行。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-05-04
其实,jsf这东西实在有点无聊了,随便哪一个做过asp.net研究的,立刻可以发现,其实就是模仿了asp.net的web框架和对象生命周期,以及服务器端事件(Server events),甚至viewstate这种词汇都是抄来的,这东西一点没有都创新。
而且,jsf使用jsp作为view,其中的一般UI控件都是tag,这是一个有很大潜在问题的设计,由于tag编程本身不是一件非常简单事情,它严重影响UI控件复用编码的简单性,对照asp.net的UI控件可复用性和简便性,tag简直太失败了。 tag的另一个问题,是在嵌套使用tag的时候,你必须在设计一开始就确定,自己开发的这个tag是否在将来需要内嵌套其他控件还是可能被其他tag嵌套,这是一个很讨厌的问题,对想使用多个tag组合的设计想法构成障碍。如果你使用过jsf:subview就马上有体会了。 |
|
返回顶楼 | |
发表时间:2007-05-04
SteveGY 写道 其实,jsf这东西实在有点无聊了,随便哪一个做过asp.net研究的,立刻可以发现,其实就是模仿了asp.net的web框架和对象生命周期,以及服务器端事件(Server events),甚至viewstate这种词汇都是抄来的,这东西一点没有都创新。
而且,jsf使用jsp作为view,其中的一般UI控件都是tag,这是一个有很大潜在问题的设计,由于tag编程本身不是一件非常简单事情,它严重影响UI控件复用编码的简单性,对照asp.net的UI控件可复用性和简便性,tag简直太失败了。 tag的另一个问题,是在嵌套使用tag的时候,你必须在设计一开始就确定,自己开发的这个tag是否在将来需要内嵌套其他控件还是可能被其他tag嵌套,这是一个很讨厌的问题,对想使用多个tag组合的设计想法构成障碍。如果你使用过jsf:subview就马上有体会了。 没有看过.net的设计,看来jsf是有抄袭的嫌疑了,对于tag,我也是比较反感,还有那个viewstate管理,也不是令人那么的满意。目前,只是想看看jsf到底能给我们带来什么。 |
|
返回顶楼 | |
发表时间:2007-05-04
引用 没有看过.net的设计,看来jsf是有抄袭的嫌疑了 JSF是借鉴了ASP.NET的思想。 |
|
返回顶楼 | |
发表时间:2007-05-04
SteveGY 写道 其实,jsf这东西实在有点无聊了,随便哪一个做过asp.net研究的,立刻可以发现,其实就是模仿了asp.net的web框架和对象生命周期,以及服务器端事件(Server events),甚至viewstate这种词汇都是抄来的,这东西一点没有都创新。
而且,jsf使用jsp作为view,其中的一般UI控件都是tag,这是一个有很大潜在问题的设计,由于tag编程本身不是一件非常简单事情,它严重影响UI控件复用编码的简单性,对照asp.net的UI控件可复用性和简便性,tag简直太失败了。 tag的另一个问题,是在嵌套使用tag的时候,你必须在设计一开始就确定,自己开发的这个tag是否在将来需要内嵌套其他控件还是可能被其他tag嵌套,这是一个很讨厌的问题,对想使用多个tag组合的设计想法构成障碍。如果你使用过jsf:subview就马上有体会了。 的确,如果用JSP的话,跟JSF和起来用的确很麻烦,但现在这个问题已经解决了,那就是用Facelets来代替JSP!这样不仅可以简单的写复合组件,和可以方便的让HTML和JSF组件混合使用! |
|
返回顶楼 | |