什么时候在UIComponent上调用setValue和setSubmittedValue? [英] When are setValue and setSubmittedValue called on UIComponent?
问题描述
如果我正确地结合了BalusC 2006年出色文章中的信息,则 http: //balusc.blogspot.ch/2006/09/debug-jsf-lifecycle.html 和Optimus Prime的早期帖子
If I correctly combined the information contained in BalusC's great 2006 post http://balusc.blogspot.ch/2006/09/debug-jsf-lifecycle.html with Optimus Prime's even earlier post http://cagataycivici.wordpress.com/2005/12/28/jsf_component_s_value_local/ I get the following:
我的理解:
- 在APPLY_REQUEST_VALUES阶段,
- 将输入值设置为UI组件的SubmittedValue属性(例如inputComponent. setSubmittedValue (测试")).
- During the APPLY_REQUEST_VALUES phase,
- the input value is set to a submittedValue property of the UI component (e.g. inputComponent.setSubmittedValue("test")).
- 从submittedValue属性(假定为inputComponent. getSubmittedValue ())中读取相同的值,并在必要时用于转换.
- 如果转换成功或被跳过,则将结果设置为组件的value属性(例如inputComponent. setValue (测试")).
- 此外,submittedValue会立即被再次擦除(例如,inputComponent. setSubmittedValue (空))
- (转换后的)值是从UI组件的value属性(大概是inputComponent. getValue())中读取并验证的.
- 验证后,将读取支持bean/模型的存储值(例如myBean. getInputValue ()),并将其与新转换和验证的值进行比较.如果不同,则将调用valueChangeListener方法.
- the same values are read from the submittedValue property (presumably inputComponent.getSubmittedValue()) and used for conversion, if necessary.
- If the conversion was successful or skipped, the result is set to a value property of the component (e.g. inputComponent.setValue("test")).
- Also, the submittedValue is erased again immediately (e.g. inputComponent.setSubmittedValue(null))
- the (converted) value is read from the value property of the UI component (presumably inputComponent.getValue()) and validated.
- after validation, the backing bean/model's stored value is read (e.g. myBean.getInputValue()) and compared with the newly converted and validated value. If different, the valueChangeListener method(s) will be called.
- 新转换并验证的值最终存储在支持bean的属性字段中(例如,myBean. setInputValue (测试")).
- the newly converted and validated value is finally stored in the backing bean's property field (e.g. myBean.setInputValue("test")).
问题:
- 这正确吗?
- 要全面了解POST和将输入值保存在后备bean之间的情况,还缺少一些东西吗?
- 在Input Component上具有"instant ="true"的情况下,我们只是将这些事件转移到APPLY_REQUEST_VALUES阶段还是要更改的不仅仅是事件的时间/顺序?
推荐答案
几乎正确.仅当转换和验证成功时才设置组件的本地值.之后,将提交的值设置为null
.您可以在
Almost correct. The component's local value is only set when conversion and validation is successful. After that, the submitted value is set to null
. You can find the entire process of the validations phase in a rather self-documenting way in the UIInput#validate()
method (line numbers are conform 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 }
关于UIInput
组件上的immediate
属性,是的,这只是将验证转移到应用请求值阶段.另请参见 UIInput#processValidators()
,检查UIInput#isImmediate()
.
As to the immediate
attribute on the UIInput
component, yes this merely shifts the validation to the apply request values phase. See also the source code of UIInput#processDecodes()
and UIInput#processValidators()
, there's a check on UIInput#isImmediate()
.
这篇关于什么时候在UIComponent上调用setValue和setSubmittedValue?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!