13

我决定完全深入研究 JSF 2.0,因为我的项目需要深入了解它。我正在阅读JSF Lifecyle Debug,这是一篇关于 JSF 生命周期的精彩文章。在阅读本文时,我有以下困惑。

  1. 如果是初始请求,则会在Restore View Phase空视图中创建并直接Render Response Phase发生。此时没有要保存的状态。那时到底发生了什么render response phase?在运行示例时,我有点困惑。

  2. 文章指出,检索到的输入值是同相设置inputComponent.setSubmittedValue()Apply Request Values。如果验证和转换通过,则值被设置inputComponent.setValue(value)inputComponent.setSubmittedValue(null)运行。在同一点文章指出,现在如果在下一个回发请求中更改了值,则将其与提交的值进行比较,每次回发时始终为空,alue change listener将调用 v。这意味着如果我们甚至不更改值,因为提交的值将为空,那么 valueChangeListener 将始终被调用?我对这个说法感到困惑。有人可以详细说明一下吗?

  3. immediate文章说明了属性的用法。如果immediate在输入组件上设置了属性,则理想情况下Process Validation Phase会跳过,但所有转换和验证都发生在Apply Request Values. 我的观点是,仍然在进行转换和验证时,跳过第三阶段有什么好处?

  4. 检索值一词是什么意思?

  5. 我想知道,如果让我们说视图上有五个字段。JSF 是否列出了这些值的一些集合并Apply Request Values逐个Process Validations阶段迭代它们?

  6. 在本文的最后一点,它说明了何时使用immediate属性。根据我的理解,如果在输入组件和命令组件中都设置了立即属性,它将跳过从应用请求值到调用应用程序的阶段以获取任何没有immediate. 那么最后一条语句是什么意思是登录表单中的“忘记密码”按钮,其中包含必填且立即的用户名字段和必填但非立即的密码字段。

我知道这些是非常基本的混淆,但明确这些主题肯定有助于提高 JSF 知识。

4

1 回答 1

17

1:那么在渲染响应阶段实际发生了什么?

为客户端生成 HTML 输出,以UIViewRoot#encodeAll(). 您可以通过右键单击查看结果,在 webbrowser 中查看源代码(因此不能通过右键单击,在 webbrowser 中检查元素,因为这只会显示 webbrowser 基于原始 HTML 源代码和之后的所有 JavaScript 事件构建的 HTML DOM 树)。


2:与提交的值进行比较,每次回发时该值始终为空

不,它被保留为实例变量。JSF 不会调用getSubmittedValue()来比较它。


3:我的观点是,仍然在进行转换和验证时,跳过第三阶段有什么好处?

这在文章的底部得到了回答,在Okay 下,我应该什么时候使用 immediate 属性?. 简而言之:优先验证。如果immediate="true"转换/验证失败的组件,则immediate="true"不会转换/验证组件。


4:检索值是什么意思?

最终用户提交的“原始”值(最终用户在输入表单中输入的确切输入值)。这通常是一个String. 如果您熟悉 servlet,那么很容易理解它正是您通过request.getParameter().


5:JSF 是否列出了这些值的一些集合,并且应用请求值和流程验证阶段会一一迭代它们?

几乎。该集合已经存在于 JSF 组件树的风格中。因此,JSF 基本上迭代一个树结构,从FacesContext#getUIViewRoot().


6:那么最后一条语句的含义是什么意思是登录表单中的“忘记密码”按钮,其中包含必填且立即的用户名字段和必填但非立即的密码字段。

这样,您可以将登录表单重复用于“忘记密码”的情况。如果您提交“登录”按钮,那么显然必须验证用户名和密码字段。但是,如果您提交“忘记密码”按钮,则不应验证密码字段。


也就是说,您可能会发现以下 JSF 阶段/生命周期备忘单对于快速参考也很有用:

  • fc = FacesContext
  • vh = ViewHandler
  • in = UIInput
  • rq = HttpServletRequest
  • id = in.getClientId(fc);

1RESTORE_VIEW

String viewId = rq.getServletPath();
fc.setViewRoot(vh.createView(fc, viewId));

2APPLY_REQUEST_VALUES

in.setSubmittedValue(rq.getParameter(id));

3PROCESS_VALIDATIONS

Object value = in.getSubmittedValue();
try {
   value = in.getConvertedValue(fc, value);
   for (Validator v : in.getValidators())
      v.validate(fc, in, value);
   }
   in.setSubmittedValue(null);
   in.setValue(value);
} catch (ConverterException | ValidatorException e) {
   fc.addMessage(id, e.getFacesMessage());
   fc.validationFailed(); // Skips phases 4+5.
   in.setValid(false);
}

4UPDATE_MODEL_VALUES

bean.setProperty(in.getValue());

5INVOKE_APPLICATION

bean.submit();

6RENDER_RESPONSE

vh.renderView(fc, fc.getViewRoot());

也可以看看:

于 2014-02-21T08:02:18.203 回答