JSF 页眼生命周期管理 (一)
JSF 页 面的生命周期 类 似于 JSP 页 面。当客 户 端 为页 面 创见 一个 HTTP 请 求 时 ,服 务 器端响 应这个页面并翻译 HTML 。因 为 JSF 提供了 额 外功能,因此,生命周期提供了一些 额 外的服 务 去 处 理 页 面。
作 为 开 发 人 员,除了 需要知道 生命周期过程中中,比如什么时候对进行数据校验、数据转换和事件发生时刻这些外,还可能需要知道这些能做什么;如何改变这些的处理方式和时间。
一个树形的 UI组件描述一个 JSF页面,叫视图。当客户端为这个页面创造一个请求,生命周期开始,在整个生命周期中,考虑到页面当前视图状态从前一个子阶段保存而来, JSF的实现框架( MyFaces、 OpenFaces、 Glassfish等)必须创建这个视图。当客户端提交一个页面, JSF实现框架必须执行几个任务,比如校验当前视图中输入的数据,然后转换这些数据为服务端所需要的数据类型。 JSF实现框架执行所有这些任务——生命周期中一系列的步骤。
哪一个步骤需被执行取决于请求是否出之于 JSF应用和响应是否生成于 JSF生命周期的渲染阶段。
JSF应用支持两种响应和两种请求类型:
1. Faces Response, 一种 Servlet响应,创建于 Render Response Phase阶段
2. Non-Faces Response, 一种 Servlet响应,不在 Render Response Phase阶段创建的,比如一个 JSP页没有包含任何的 JSF组件。
3. Faces Request, 一种 Servlet请求,由前一个已生成的 Faces响应发送。比如一个表单是从一个 JSF的 UI组件发送,并且请求的 URI指示应用 JSF的组件树去处理这个请求。
4. Non-Faces Request, 一种 Servlet请求发送到一个应用组件,比如 JSP或者 Servlet,而不是直接发送到 JSF的 组件上。
因 为这 些不同 类 型的 请 求和响 应 , 导 致三种可能的生命周期 场 合存在于 JSF 应 用之中:
1. Non-Faces Request产 生 Faces Response
比如,点击 HTML页面上的超链接,打开一个 JSF页面,从一个 Non-Faces Request渲染 Faces Response, JSF应用必须提供 FacesServer对应关系,来接受传入请求并且传递这些请求到生命周期实现中去处理,表明生命周期处理 Servlet描述怎么样去提供一个对应关系给 FacesServlet。在生成一个 Faces Response时, JSF应用必须创建一个新视图,保存 FacesContext对象,以期获得视图必须要的对象引用—— FacesContext.renderResponse, 它立即跳过 Render Response Phase,强制渲染视图。
2. Faces Request产 生 Non-Faces Response
有时, JSF应用重定向至不同的 WEB应用或者重定向至不包含任何 JSF组件的 JSP、 Servlet,这种情况下,开发人员必须通过调用 FacesContext.responseComplete来跳过 Render Response Phase这个阶段。 FacesContext对象包含了一个特定 Faces Request的所有的信息,这个方法还可以在 Apply Request Values Phase, Process Validation Phase和 Update Model Values Phase这三个阶段被调用。
3. Faces Request产 生 Faces Response
这 是 JSF 生命周期中最常 见 的 场 合,它也是 标准请求处理描述下一个阶段的处理方式。这个场合里,包含了 JSF组件利用 FacesServlet提交一个请求到 JSF应用。因为请求已经被处理,无须额外的步骤去生成响应,在相关的阶段,所有的监听器,校验器和转换器会自动地被调用。
标 准 请 求 处 理生命周期
标 准 请 求 处 理生命周期代表第三种 场 合。多数 JSF 用 户 不要抱怨生命周器 处 理方式。确 实 , JSF 技 术 足 够 丰富去 执行页面处理过程,所以开发人员不用去面对象组件的状态改变这类复杂的渲染问题。比如,选择一个 checkbox会影响到页面上其他组件的外观行为。 JSF会正确地处理这些事件,并且不会让页面渲染而不反映出这个变化。
总 体 说 来,生命周期有两种 请 求,初始 请 求和提交 请 求。用 户 第一 请 求 页 面 时 ,会建立一个初始 请 求, 请求的页面会被服务器端装载,并转换成 HTML,响应给浏览器,当用户在这个页面上提交表单时, JSF处理提交请求。生命周期处理初始请求时,只执行 Restore View和 Render Response两个阶段因为这个请求中用户没有输入数据,相反地,生命周期处理提交请求时,会执行所有的阶段。
tobe continue