何时在 UIComponent 上调用 setValue 和 setSubscribedValue?

2023-11-23

如果我正确地组合了 BalusC 2006 年精彩帖子中包含的信息http://balusc.blogspot.ch/2006/09/debug-jsf-lifecycle.html擎天柱的更早的帖子http://cagataycivici.wordpress.com/2005/12/28/jsf_component_s_value_local/我得到以下信息:

我的理解:

  1. During the APPLY_REQUEST_VALUES phase,
    • 输入值设置为 UI 组件的 SubmitValue 属性(例如 inputComponent.设置提交值(“测试”))。
  2. During the PROCESS_VALIDATIONS phase,
    • 从 SubmitValue 属性(大概是 inputComponent.properties)读取相同的值。获取提交值()) 并用于转换(如有必要)。
    • 如果转换成功或被跳过,结果将设置为组件的 value 属性(例如 inputComponent.setValue(“测试”))。
    • 此外,所提交的值会立即再次被删除(例如 inputComponent.设置提交值(null))
    • (转换后的)值是从 UI 组件(大概是 inputComponent.value)的 value 属性中读取的。获取值())并验证。
    • 验证后,将读取支持 bean/模型的存储值(例如 myBean.获取输入值()) 并与新转换和验证的值进行比较。如果不同,将调用 valueChangeListener 方法。
  3. During the UPDATE_MODEL_VALUES phase,
    • 新转换和验证的值最终存储在支持 bean 的属性字段中(例如 myBean.设置输入值(“测试”))。

问题:

  • 它是否正确?
  • 是否缺少一些内容来充分理解 POST 和将输入值保存在支持 bean 之间发生的情况?
  • 通过输入组件上的immediate="true",我们是否只是将这些事件转移到 APPLY_REQUEST_VALUES 阶段,还是我们改变的不仅仅是事件的时间/顺序?

几乎是正确的。组件的本地值仅在转换时设置and验证成功。之后,提交的值设置为null。您可以在以下位置以相当自记录的方式找到验证阶段的整个过程:UIInput#validate()方法(行号符合 JSF 2.1 API):

934    public void validate(FacesContext context) {
935 
936         if (context == null) {
937             throw new NullPointerException();
938         }
939 
940         // Submitted value == null means "the component was not submitted
941         // at all".  
942         Object submittedValue = getSubmittedValue();
943         if (submittedValue == null) {
944             return;
945         }
946 
947         // If non-null, an instanceof String, and we're configured to treat
948         // zero-length Strings as null:
949         //   call setSubmittedValue(null)
950         if ((considerEmptyStringNull(context)
951              && submittedValue instanceof String 
952              && ((String) submittedValue).length() == 0)) {
953             setSubmittedValue(null);
954             submittedValue = null;
955         }
956 
957         Object newValue = null;
958 
959         try {
960             newValue = getConvertedValue(context, submittedValue);
961         }
962         catch (ConverterException ce) {
963             addConversionErrorMessage(context, ce);
964             setValid(false);
965         }
966 
967         validateValue(context, newValue);
968 
969         // If our value is valid, store the new value, erase the
970         // "submitted" value, and emit a ValueChangeEvent if appropriate
971         if (isValid()) {
972             Object previous = getValue();
973             setValue(newValue);
974             setSubmittedValue(null);
975             if (compareValues(previous, newValue)) {
976                 queueEvent(new ValueChangeEvent(this, previous, newValue));
977             }
978         }
979 
980     }

至于immediate属性上的UIInput组件,是的,这只是将验证转移到应用请求值阶段。另请参阅源代码UIInput#processDecodes() and UIInput#processValidators(),有一个检查UIInput#isImmediate().

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

何时在 UIComponent 上调用 setValue 和 setSubscribedValue? 的相关文章

随机推荐

  • 使用 LINQ to SQL 存储图像:将字节数组或流转换为二进制

    我正在使用 LINQ to SQL 我的图像字段被视为二进制 当我需要渲染图像时 将 Binary 类型转换为 byte 您可以使用 Binary 对象的 ToArray 方法 并不是什么大问题 但是有人可以告诉我如何将 byte 或将对象
  • 为 PerSession WCF 服务调用两次静态构造函数

    无法理解为什么类型构造函数PerSession WCF 服务调用了两次 ConcurrencyMode is Multiple 只需启动五个同时执行相同 WCF 服务方法调用的客户端 在日志中我看到static构造函数被调用两次 第一次 3
  • 使用(自定义)GCC 4.x 或 5.x 时,Boost 构建无法通过 C++11 功能检查

    我需要在 Fedora 24 机器上构建 Boost 1 62 和 1 63 但使用 GCC 4 9 3 或 GCC 5 4 0 取决于 CUDA 版本 这就是我需要旧编译器的原因 但是如果我按照中所述设置自定义 GCC 版本这个答案 an
  • 如何在Tensorflow 2.0中使用gradient_override_map?

    我正在尝试使用gradient override map与张量流2 0 有一个文档中的示例 我也将在这里用作示例 In 2 0 GradientTape可用于计算梯度 如下所示 import tensorflow as tf print t
  • 在 SDK 工具修订版 12 中启动 Android 模拟器

    我将 Android SDK 工具从修订版 11 更新到修订版 12 模拟器现在无法启动 当我尝试运行 emulator exe 时 我得到 无效的命令行参数 Files Android android sdk tools emulator
  • 为什么音频和视频事件不冒泡?

    我想知道为什么我的一些 Javascript 无法工作 直到我发现音频事件没有在 DOM 树中冒泡 例如这timeupdate event 是否有理由不让音频和视频标签的事件冒泡 事件冒泡存在的原因是为了解决哪个元素是事件的预期目标这一含糊
  • 序言。结构(复杂术语)和谓词,我真的不明白区别

    我是序言新手 我似乎无法理解结构和谓词之间的区别 真的有什么区别吗 在四处挖掘时 我发现有些人认为f X a X 是一个谓词 有些人认为嫉妒 X Y 爱 X Z 爱 Y Z 是一个结构 或一个复杂的术语 他们对我来说看起来几乎一样 有人愿意
  • Android 上使用 SoundPool 实现无缝循环?

    我尝试使用 SoundPool 类循环短 20kb 无间隙 ogg 文件 但在硬件测试时无法获得一致的结果 它总是使用模拟器完美播放 但当我在 Nexus 1 或 Samsumg Galaxy Tab 10 1 上进行测试时 每个循环点都会
  • 手动生成条令段

    我在 Symfony2 项目中使用 slugable 行为 但现在我想根据不同的文本 当前标题 旧标题 表单输入中的用户文本 为一个页面制作许多 slugs 并将其保留在另一个页面中桌子 我的问题是 如何手动使用任何文本的学说扩展 我到处都
  • 大数据读取子样本R

    我非常感谢您花时间阅读本文 我有一个 30GB 的超级文件 其中包含 600 万条记录和 3000 个 csv 格式的列 主要是分类数据 我想引导子样本进行多项回归 但事实证明 即使我的机器中有 64GB RAM 和两倍的交换文件 这个过程
  • 在 XHTML 1.1 中:元素“input”不能嵌套在元素“form”内。为什么?

    下面的代码在 XHTML 1 1 严格模式下是被禁止的
  • python 中仅按第一个空格分割字符串[重复]

    这个问题在这里已经有答案了 我有字符串例如 238 NEO Sports 我只想在first空间 输出应该是 238 NEO Sports 我能想到的一种方法是使用split 最后合并返回的最后两个字符串 有没有更好的办法 只需将计数作为第
  • 如何从java执行https GET请求

    我写了一个Java客户端 它执行httpGET 请求没有任何问题 现在我想修改这个客户端以便执行https获取请求 import org apache http HttpHost import org apache http auth Au
  • Angular 6 复选框过滤器

    我想使用复选框通过变量 类别 过滤 JSON 对象 产品 列表 产品如下 bikeId 6 bikeName Kids blue bike bikeCode KB 3075 releaseDate June 28 2016 descript
  • Fortran - 在运行时设置变量的种类/精度

    是否可以将变量本身的精度设置为将在运行时定义的变量 假设我尝试编译 SUBROUTINE FOO VARIABLE PRECISION VALUE IMPLICIT NONE INTEGER 4 PRECISION VALUE INTEGE
  • IIS 返回 404 未找到 .mp4 文件

    我使用 html video 标签来播放视频 在我的本地主机中视频播放 但是当我发布 没玩过 我已经创建了基于ASP NET的项目 我在本地使用类似这种方法 http localhost 41563 files Just mp4 当我发布网
  • 如何精确测量绳子的宽度?

    首先 问一个问题How to measure width of character precisely 这是回答 对于这种情况并没有真正的帮助 所以这不是那个的重复 我有一根绳子 我画画使用graphics DrawString 但是当我需
  • 三角形网格的测地线计算? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我试图找到三角表面上两点之间的距离 测地距离 这看起来像是一个基本操作 但并不简单 所以我想知道是否有任何图书馆可以做到这一点 我的谷歌搜索失败了
  • 从 Android-NDK 应用程序发送意图

    我正在 android 下用 C 编写一个本机应用程序 我需要广播一些意图 这可能吗 如果您要向我指出 JNI 请给我更多详细信息 因为我不确定这是如何完成的 如果这是不可能的 我会做的是在 NDK 守护进程和 Java Android S
  • 何时在 UIComponent 上调用 setValue 和 setSubscribedValue?

    如果我正确地组合了 BalusC 2006 年精彩帖子中包含的信息http balusc blogspot ch 2006 09 debug jsf lifecycle html擎天柱的更早的帖子http cagataycivici wor