JSF 中的值转换究竟是啥时候发生的?

Posted

技术标签:

【中文标题】JSF 中的值转换究竟是啥时候发生的?【英文标题】:When exactly does the value conversion happen in JSF?JSF 中的值转换究竟是什么时候发生的? 【发布时间】:2012-10-01 23:07:58 【问题描述】:

我咨询了几个权威来源,但要么它们真的相互矛盾,要么我误解了它们,或者可能发生了不止一次的转换? JSF 的 1.x 和 2.x 版本之间有区别吗?

IBM post 声明转换发生在应用请求值阶段(第 2 阶段)。

这个post by BalusC 表示here 默认转换发生在流程验证阶段(阶段3)。

Oracle JEE6 tutorial 表示转换发生在更新模型值阶段(第 4 阶段),在此阶段的描述中说:

如果本地数据无法转换为bean属性指定的类型..

另一方面,说明同一教程中各个阶段的图表显示了流程验证阶段更新模型值阶段出现的转换错误。

以上所有帖子都表明,如果 immediate 属性设置为 true,则所有转换和验证都将在 应用请求阶段进行处理。这意味着该阶段的转换不是默认行为。

谢谢

【问题讨论】:

【参考方案1】:

来自UIInput's documentation [强调我的]:

在请求处理生命周期的应用请求值阶段,必须存储此组件的解码值,通常但不一定是字符串 - 但尚未转换 - 使用 setSubmittedValue()。如果组件希望表明没有提交任何特定值,它可以什么都不做,或者将提交的值设置为 null。

默认情况下,在请求处理生命周期的 Process Validators 阶段,提交的值将被转换为类型安全的对象,如果验证成功,则使用 setValue() 将其存储为本地值.但是,如果 immediate 属性设置为 true,则此处理将改为在 Apply Request Values 阶段结束时进行。

在请求处理生命周期的呈现响应阶段,输出转换与 UIOutput 一样发生。 JSF 1.x 和 2.x 版本之间没有区别。

【讨论】:

+1 谢谢,亚当 - 文档是我没有咨询过的一个权威来源 :) 我仍然需要一些澄清,尽管超出了 UIInput 文档中的内容 - IBM 发布的关于转换的明显错误应用请求值阶段还是还有其他? Oracle 图形中的两个箭头是怎么回事?根据 UIInput 文档,在更新模型值阶段没有进一步的转换,那么怎么可能有任何转换错误呢? IBM 的文章在这一点上是完全错误的。 Oracle 的教程很好,只是在句子的上下文中放错了“converted”这个词。最好将其读作“强制转换”或“强制转换”(这里是 EL,而不是 JSF Converter):“如果本地数据无法转换为 bean 属性指定的类型”。请注意,Oracle 的教程确实在验证阶段部分明确提到了转换。 @BalusC 感谢您的澄清。我还发现了你在验证阶段提到的部分:The JavaServer Faces implementation also completes conversions for input components that do not have the immediate attribute set to true - 第一次忽略了它 我很惊讶蓝色巨人会犯这样的错误

以上是关于JSF 中的值转换究竟是啥时候发生的?的主要内容,如果未能解决你的问题,请参考以下文章

ShellExecute成功后返回值究竟是啥?

究竟是啥导致二进制文件“乱码”?

请问SAP中的统驭科目究竟是啥意思?

GDI+ 中发生一般性错误。 究竟是啥问题不是一般性的图片上传出错。

对于 FOR 循环中的目录,“%~zI”究竟是啥?

究竟是啥触发了 Angular 中的 main.ts