JSF生命周期

2019-04-28 07:32|来源: 网路

JSF(JavaServer Faces)应用程序框架的简单程序是自动管理生命周期阶段,并允许您手动管理。JSF(JavaServer Faces)应用程序的生命周期从客户端对页面发出HTTP请求时开始,并在服务器响应页面时结束。

JSF生命周期分为两个主要阶段:

  • 执行阶段

  • 渲染阶段

1. 执行阶段

在执行阶段,当第一次请求时,构建或恢复应用程序视图。 对于其他后续请求,执行其他操作,如应用请求参数值,对组件值执行转换和验证,受托管的bean将使用组件值进行更新,并调用应用程序逻辑。
执行阶段被进一步分成以下子阶段。

  • 恢复视图阶段

  • 应用请求值阶段

  • 流程验证阶段

  • 更新模型值阶段

  • 调用应用阶段

  • 渲染响应阶段

恢复视图阶段

当客户端请求一个JavaServer Faces页面时,JavaServer Faces实现开始恢复视图阶段。 在此阶段,JSF将视图中的组件构建为请求页面,线性事件处理程序和验证器的视图,并将视图保存在FacesContext实例中。

如果对该页面的请求是回发,那么与该页面相对应的视图已经存在于FacesContext实例中。 在此阶段,JavaServer Faces实现通过使用保存在客户端或服务器上的状态信息来还原视图。

应用请求值阶段

在此阶段,在回发请求期间恢复组件树。 组件树是表单元素的集合。树中的每个组件通过使用其decode(processDecodes())方法从请求参数中提取其新值。 之后,该值将本地存储在每个组件上。

  • 如果任何解码方法或事件侦听器在当前FacesContext实例上调用了renderResponse方法,则JavaServer Faces实现将跳过“渲染响应”阶段。

  • 如果任何事件在此阶段已排队,则JavaServer Faces实现将事件广播到有兴趣的监听器。

  • 如果应用程序需要重定向到其他Web应用程序资源或生成不包含任何JavaServer Faces组件的响应,则可以调用FacesContext.responseComplete()方法。

  • 如果当前请求被识别为部分请求,则从FacesContext检索部分上下文,并应用部分处理方法。

流程验证阶段

在此阶段,JavaServer Faces通过使用其validate()方法来处理在组件上注册的所有验证器。 它检查指定验证规则的组件属性,并将这些规则与为组件存储的本地值进行比较。 JavaServer Faces还完成了没有将immediate属性设置为true的输入组件的转换。

  • 如果任何验证方法或事件侦听器在当前FacesContext上调用了renderResponse方法,则JavaServer Faces实现将跳过“渲染响应”阶段。

  • 如果应用程序需要重定向到不同的Web应用程序资源或生成不包含任何JavaServer Faces组件的响应,则可以调用FacesContext.responseComplete方法。

  • 如果事件在此阶段已排队,则JavaServer Faces实现将它们广播给有兴趣的监听器。

  • 如果当前请求被识别为部分请求,则从FacesContext检索部分上下文,并应用部分处理方法。

更新模型值阶段

确保数据有效后,它遍历组件树,并将相应的服务器端对象属性设置为组件的本地值。 JavaServer Faces实现只更新输入组件的value属性指向bean属性。 如果本地数据无法转换为bean属性指定的类型,生命周期将直接前进到“渲染响应”阶段,以便重新呈现页面并显示错误。

  • 如果任何updateModels方法或任何监听器在当前FacesContext实例上调用了renderResponse()方法,则JavaServer Faces实现将跳过“渲染响应”阶段。

  • 如果应用程序需要重定向到其他Web应用程序资源或生成不包含任何JavaServer Faces组件的响应,则可以调用FacesContext.responseComplete()方法。

  • 如果任何事件在此阶段已排队,JavaServer Faces实现将它们广播到有兴趣的监听器。

  • 如果当前请求被识别为部分请求,则从FacesContext检索部分上下文,并应用部分处理方法。

调用应用阶段

在此阶段,JSF处理应用程序级事件,例如提交表单或链接到另一个页面。
现在,如果应用程序需要重定向到其他Web应用程序资源或生成不包含任何JSF组件的响应,则可以调用FacesContext.responseComplete()方法。

之后,JavaServer Faces实现将控制转移到“渲染响应”阶段。

渲染响应阶段

这是JSF生命周期的最后阶段。 在此阶段,JSF将构建视图并将权限委托给相应的资源来呈现页面。

  • 如果这是初始请求,则页面上表示的组件将被添加到组件树中。

  • 如果这不是初始请求,组件已经添加到树中,不需要再添加。

  • 如果请求是回应,并且在应用请求值阶段,过程验证阶段或更新模型值阶段期间遇到错误,则在此阶段将再次呈现原始页面。

如果页面包含h:messageh:messages标签,页面上会显示任何排队的错误消息。
在渲染视图的内容之后,保存响应的状态,以便后续请求可以访问它。 恢复视图阶段可以使用保存的状态。

2. 渲染阶段

在此阶段,请求的视图作为对客户端浏览器的响应。 视图渲染是以HTML或XHTML生成输出的过程。 所以,用户可以在浏览器看到它。

在渲染过程中采取以下步骤。

  • 当客户端对index.xhtml网页进行初始请求时,编译应用程序。

  • 应用程序在编译后执行,并为应用程序构建一个新的组件树,并放置在FacesContext中。

  • 使用由EL表达式表示的组件和与其关联受托管bean属性填充组件树。

  • 基于组件树。 建立了新的视图。

  • 该视图作为响应呈现给请求客户端。

  • 组件树被自动销毁。

  • 在后续请求中,重新构建组件树,并应用已保存的状态。

相关问答

更多
  • 要看蝙蝠的种类,像果蝠寿命可达35年以上,而身体强健的食鱼蝠寿命却不到20年,吸血蝙蝠寿命在12年左右,而猪鼻蝠(蝴蝶蝠)这类微型蝙蝠寿命只有几年光景。 从你的补充问题来看,你应当是指的普通蝙蝠,这类蝙蝠的寿命通常在30年左右,但实际上往往活不过20年,这是因为现在的生存条件变得越来越恶劣。 家里进了蝙蝠不要害怕,可在夜间对其栖息处做些消毒工作,如果实在不喜欢它们光顾,可以在它们停止活动要休息时关好门窗,拒绝它们入内就行了。
  • 如果是当前Activity弹出的dialog则不会执行Activity任何生命周期中的方法,只有其它Activity弹出了Dialog或者拦住了当前的Activity才会执行onPause() 以下为Activity的生命周期图 关于Activity的生命周期的解释: 启动Activity:系统会先调用onCreate方法,然后调用onStart方法,最后调用onResume,Activity进入运行状态。 当前Activity被其他Activity覆盖其上或被锁屏:系统会调用onPause方法,暂停当前A ...
  • 这是指定的行为。 来自FacesContext#renderResponse() javadoc : 发出JavaServer面向实现的信号,一旦请求处理生命周期的当前阶段完成 ,控制应该传递到渲染响应阶段,绕过尚未执行的任何阶段。 因此,它不会像您预期的那样突然中止当前阶段。 它将完成当前阶段,然后进入渲染响应阶段。 只是,当你从验证器内部抛出ValidatorException时,它默认就已经这样做了。 所以,两者都做是不必要的。 This is specified behavior. From the ...
  • TLDR:字段是只读的 虽然你的panelGrid绑定到loanBean是可变的,但是panelGrid只使用输出组件( javax.faces.component.UIOutput子类),根据定义它们是只读的。 这些没有处理请求值的方法(即UIInput.setSubmittedValue , UIInput.getSubmittedValue和UIInput.setValue )。 实际上,在提交表单时,请求不包含OutputText组件的解码值。 因此,您不需要在ValueChangeListener ...
  • 在最小化代码以发布SSCCE期间(参见上面的评论)我将更改为 ,这导致了 javax.el.PropertyNotFoundException: Target Unreachable, 'someField' returned null 因为表单中的 。 在这种情况下,PrimeFaces CommandButton不会呈现错 ...
  • 我在PrimeFaces论坛上找到了答案。 它应该使用ui:composition而不是ui:fragment。 “从文档”ui:fragment与ui:composition相同,除了两件事:JSF创建一个组件并将其直接添加到树中,并且没有关联的模板。“ 链接 I have found an answer on PrimeFaces forum. It should use ui:composition instead of ui:fragment. "From the docu "ui:fragment ...
  • 提交的表单值存储在“ Apply Request Values阶段的组件中。 例如,在您的情况下, javax.faces.component.html.HtmlInputText#decode javax.faces.component.UIInput#setSubmittedValue方法调用javax.faces.component.UIInput#setSubmittedValue 。 提交的值未设置为bean(如您所期望的那样),因为未包含该组件以execute part。 然后inputText ...
  • 在JSF实现的Lifecycle实现的execute()方法上放置一个断点。 在那里,JSF生命周期的每个阶段都期望渲染响应将被执行。 要挂钩渲染响应,请在同一Lifecycle实现的render()方法上添加另一个beakpoint。 在Mojarra中, Lifecycle实现是com.sun.faces.lifecycle.LifecycleImpl类。 它是开源的(MyFaces也是如此),您可以在供应商的主页上下载源代码,例如http://javaserverfaces.java.net 。 Pu ...
  • 您似乎期望生命周期是基于视图的。 这确实会造成混乱。 实际上,生命周期是基于请求的,而不是基于视图的。 这应该清除一切。 如果您考虑一下,实际上没有必要重做整个收集,转换和验证请求参数以及更新模型值的整个周期,并在同一个HTTP请求期间调用操作。 也可以看看: 重定向和导航/转发有什么区别以及何时使用什么? 视图构建时间是什么时候? You seem to expect that the lifecycle is view based. This will indeed cause confusion. I ...
  • 在应用请求值阶段,所有请求参数都由setSubmittedValue()在UIInput上设置为提交值。 在验证阶段,仅当且值有效时,将提交的值设置为null ,并通过setValue()在UIInput上设置转换和验证的值。 因此,如果该值无效,则提交的值不会设置为null 。 在更新模型值阶段期间,使用该值更新模型值。 在呈现响应阶段, UIInput呈现器首先检查getSubmittedValue()是否不返回null 。 如果没有(因此,验证失败),则显示它。 否则只显示模型值。 During th ...