如果我正确地组合了 BalusC 2006 年精彩帖子中包含的信息http://balusc.blogspot.ch/2006/09/debug-jsf-lifecycle.html擎天柱的更早的帖子http://cagataycivici.wordpress.com/2005/12/28/jsf_component_s_value_local/我得到以下信息:
我的理解:
- During the APPLY_REQUEST_VALUES phase,
- 输入值设置为 UI 组件的 SubmitValue 属性(例如 inputComponent.设置提交值(“测试”))。
- During the PROCESS_VALIDATIONS phase,
- 从 SubmitValue 属性(大概是 inputComponent.properties)读取相同的值。获取提交值()) 并用于转换(如有必要)。
- 如果转换成功或被跳过,结果将设置为组件的 value 属性(例如 inputComponent.setValue(“测试”))。
- 此外,所提交的值会立即再次被删除(例如 inputComponent.设置提交值(null))
- (转换后的)值是从 UI 组件(大概是 inputComponent.value)的 value 属性中读取的。获取值())并验证。
- 验证后,将读取支持 bean/模型的存储值(例如 myBean.获取输入值()) 并与新转换和验证的值进行比较。如果不同,将调用 valueChangeListener 方法。
- 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(使用前将#替换为@)