gpt4 book ai didi

java - JSF 生命周期和自定义组件

转载 作者:太空狗 更新时间:2023-10-29 22:39:26 24 4
gpt4 key购买 nike

关于在 JSF 中开发自定义组件,有几件事我很难理解。出于这些问题的目的,您可以假设所有自定义控件都使用值绑定(bind)/表达式(不是文字绑定(bind)),但我也对它们的解释感兴趣。

  1. 我在哪里设置值绑定(bind)的值?这应该发生在解码中吗?还是应该解码做其他事情,然后在 encodeBegin 中设置值?
  2. 从值绑定(bind)中读取 - 何时从值绑定(bind)中读取数据与从提交的值中读取数据并将其放入值绑定(bind)中?
  3. 什么时候调用与所有这些相关的表单上的 Action 监听器? JSF 生命周期页面都提到了在各个步骤中发生的事件,但是当只调用命令按钮的简单监听器时,我并不完全清楚

我尝试了一些组合,但最终总是很难找到错误,我认为这些错误来自对事件生命周期的基本误解。

最佳答案

JSF specification 中有一个非常好的图表这显示了请求生命周期 - 对于理解这些内容至关重要。

步骤是:

  • 恢复 View 。重建 UIComponent 树。
  • 应用请求值。可编辑组件应该实现 EditableValueHolder。此阶段遍历组件树并调用 processDecodes 方法。如果组件不像 UIData 那样复杂,它除了调用自己的decode 方法外不会做太多事情。 decode 方法除了找到它的渲染器并调用它的 decode 方法,并把它自己作为参数传递外,并没有做太多事情。渲染器的工作是获取任何提交的值并通过 setSubmittedValue 进行设置。
  • 流程验证。此阶段调用 processValidators,后者将调用 validatevalidate 方法获取提交的值,使用任何转换器对其进行转换,使用任何 validator 对其进行验证,然后(假设数据通过了这些测试)调用 setValue。这会将值存储为局部变量。虽然此局部变量不为空,但它将返回,而不是任何调用 getValue 的值绑定(bind)的值。
  • 更新模型值。此阶段调用 processUpdates。在输入组件中,这将调用 updateModel,后者将获取 ValueExpression 并调用它来设置模型的值。
  • 调用应用程序。按钮事件监听器等将在此处调用(如果没记错,导航也会调用)。
  • 呈现响应。树通过渲染器渲染并保存状态。
  • 如果这些阶段中的任何一个失败(例如,值无效),生命周期将跳到呈现响应。
  • 可以在大多数这些阶段之后触发各种事件,并根据需要调用监听器(例如流程验证后的值更改监听器)。

这是事件的简化版本。有关详细信息,请参阅规范。

我会质疑您为什么要编写自己的 UIComponent。这是一项非常重要的任务,需要对 JSF 体系结构有深刻的理解才能正确完成。如果您需要自定义控件,最好创建一个具体的控件来扩展现有的 UIComponent(如 HtmlInputText 所做的那样),并使用等效的渲染器。

如果污染不是问题,可以使用 Apache MyFaces 形式的开源 JSF 实现。

关于java - JSF 生命周期和自定义组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33476/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com