我已经通过this,但答案不是很清楚。因此,询问,为什么这行[isLocalValueSet()? getLocalValue():...]而不是[isLocalValueSet()? UIInput类中的getValue():...]?
对于类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
值设置为空 - setSubmittedValue(null)
如果你看一下这个的setValue(代码。 UIInput的..)方法,它将被重写,
@Override
public void setValue(Object value) {
super.setValue(value);
// Mark the local value as set.
setLocalValueSet(true);
}
所以从LINE 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
?
你在这里提到http://stackoverflow.com/questions/6642242/how-can-i-populate-a-text-field-using-primefaces-ajax-after-validation-errors-oc that when JSF validation在验证阶段失败了一个特定的输入组件,然后提交的值被保存在输入组件中。]即没有设置本地值(即validatemethod中的setValue(...)不是c/d)。而如上面的getValue()所写,如果验证失败,如FC.isValidationFailed()所示返回true,则始终返回本地值。如果验证失败,为什么返回本地值。 –
当验证阶段因任何地方的转换或验证错误而失败时,成功通过验证的组件将返回本地值,验证失败的组件将返回提交的值。 – BalusC
但是,getValue()的javadoc让我感到困惑。如果验证失败[这将成为特定组件],如FacesContext.isValidationFailed()返回true所示,总是返回本地值。他们没有回复提交的价值。 –