【发布时间】:2016-04-27 12:00:18
【问题描述】:
我已经通过this,但答案对我来说不是很清楚。于是问,
对于UIInput 类的验证方法,我们有这个(只标记与问题相关的那些行)
public void validate(FacesContext context) {
Object submittedValue = getSubmittedValue(); // LINE 958
newValue = getConvertedValue(context, submittedValue); // LINE 976
validateValue(context, newValue); // LINE 983
if (isValid()) { // LINE 987
Object previous = getValue();
setValue(newValue); // LINE 989
setSubmittedValue(null);
}
}
如果转换和验证都成功,则isValid() 返回true。
然后设置组件的 local 值 - setValue(newValue),由标志 setLocalValueSet(true) 指示
之后,submitted 值设置为 null - setSubmittedValue(null)
如果你看一下 UIInput 的 setValue(...) 方法的代码,它被覆盖了,
@Override
public void setValue(Object value) {
super.setValue(value);
// Mark the local value as set.
setLocalValueSet(true);
}
所以从第 989 行开始,调用委托给上面的 setValue(...)。 如果你看看这个方法,
@Override
public Object getValue() {
return isLocalValueSet() ? getLocalValue() : super.getValue();
}
如果本地值由 setValue(...) 设置,由标志 setLocalValueSet(true) 指示,
为什么这会返回 getLocalValue()?
我的意思是,
isLocalValueSet() ? getLocalValue() : ....
为什么没有
isLocalValueSet() ? getValue() : ....
如上所示,我的困惑在于getValue() 和getLocalValue() 方法。此外,在哪种情况下Object previous = getValue(); 将是not null?
【问题讨论】: