JSF和Facelets的生命周期

时间:2022-06-08 20:03:14

JSF的生命周期:

 

1:重载视图。试图从session,cookie还原JSF组件树,不能重载的视为第一次请求,直接转到renderview,画面重画阶段,对画面进行重画

2: 应用请求值阶段

  主要把浏览器过来的数据反映到对应的组件。也可以看做数据绑定。另外还作了一个很重要的处理。事件EVENT的队列进入处理。

此处被加入队列中的消息事件在第五个阶段被加以处理。

   主要调用过程是:Lifecyle.execute()->ApplyRequestValuesPhase.execute()->Component.processDecodes()

->Component.decode()->Component.valueBinding->Renderer.decode()->Component.queueEvent()

3:验证 合法性检查阶段

     此阶段对数据进行合法性检查。检查有错时,跳转到画面重画阶段进行重画

4 更新模型值

     此阶段把经过变换  (converter  变换等)后的组件反映到 backingbean

      主要调用过程:Lifecycle.execute()->UpdateModleValuesPhase.execute()->UIViewRoot.processUpdates->HtmlForm.processUpdates->

UIInput.processUpdate->UIInput.updateModel-ValueBinding(#{beanname.propertyName})  backingbean

5 事件处理 InvokeApplicationPhase (用户应用程序处理/事件处理阶段)

这阶段主要调用用户的应用程序的事件处理方法,对真正的业务逻辑加以处理。它是JSF和用户程序进行接口的部分。

     调用过程Lifecycle.execute()->InvokeApplicationPhase.execute()->UIViewRoot.processApplication->HtmlCommandButton.broadcast->ActionListenerImpl.processAction-MethodBinding

(#{beanName.method.methodName})->BackingBean.eventMethod

6 render(页面重画) 同页面初始化的页面重画处理

 

Facelets的生命周期:

JSP 是种生成 servlet 的模板化语言。JSP 的主体与 servlet 的 doGet() 和 doPost() 方法等价(也就是说,成为 jspService() 方法)。JSF 定制标记(例如 f:view 和 h:form)只是调用 JSF 组件来呈现它们自己的当前状态。JSF 组件模型的生命周期独立于 JSP 生成的 servlet 的生命周期。这种独立性就是混淆的来源。

与 JSP 不同,Facelets 这个模板化语言,从构建之初,就考虑了 JSF 的组件生命周期。使用 Facelets,生成的模板会构建组件树,而不是 servlet。这就允许更好的重用,因为可以把组件组合成另一个组件。
Facelets 减少了编写定制标记才能使用 JSF 的需求。Facelets 本身就可以使用 JSF 定制组件。沟通 JSF 和 Facelets 只需要很少的特殊编码:要做的全部工作就是在 Facelet 标记库文件中声明 JSF 组件。在 Facelets 模板化语言中可以直接使用 JSF 组件,不用任何额外的开发。
JSF 和 Java 服务器页面技术之间的不匹配,是 JSF 开发中的一个严重问题。问题是如何把 JSP 的动态内容集成到 JSF 基于组件的模型中。JSP 非常重视生成动态内容输出,而 JSF 需要 JSP 来协调组件模型的构建。因为这个任务超出了 JSP 原来的目的,所以产生了距离。