什么时候在UIComponent上调用setValue和setSubmittedValue? [英] When are setValue and setSubmittedValue called on UIComponent?

查看:117
本文介绍了什么时候在UIComponent上调用setValue和setSubmittedValue?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果我正确地结合了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:

我的理解:

  1. 在APPLY_REQUEST_VALUES阶段,
    • 将输入值设置为UI组件的SubmittedValue属性(例如inputComponent. setSubmittedValue (测试")).
  1. 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属性,是的,这只是将验证转移到应用请求值阶段.另请参见

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆