2016-04-27 39 views
1

我已经通过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

回答

2

如果本地值通过的setValue(...)设置,由旗setLocalValueSet(真)表示,这是为什么返回的getLocalValue()?

我认为读取ValueHolder接口的javadoc会有帮助。

Object getLocalValue()

返回这个UIComponent的局部值(如果有的话),而不评估任何相关ValueExpression

Object getValue()

获取此UIComponent的价值。如果验证失败,如FacesContext.isValidationFailed()返回true所示,则始终返回本地值。否则,首先查阅该组件的本地值属性。如果非null返回它。如果null,看看我们是否有ValueExpression值属性。如果是,则返回评估属性的结果,否则返回null

void setValue(Object value)

设置此UIComponent的值(如果有的话)。

请注意我对“无”的重视。

换言之,getLocalValue()setValue()形成真正的getter/setter对,基本上参照组件自己的实例变量,而不是在组件的value指定的任何表达式背后的bean属性属性如value="#{bean.value}"

getValue()方法以这样的方式实现,即当验证未失败(尚)和本地值为null时,它自动评估任何关联的ValueExpression。当(转换的)提交值实际上是null且组件仍处于繁忙状态处理验证阶段并且模型值尚未更新时,这是不希望的。

简而言之,如果使用getValue()而不是getLocalValue(),那么由于getValue()返回初始模型值,因此“用户移除(非必需)输入值”的情况将失败。


此外,在这种情况下,对象以前=的getValue();会不会为空?

当模型中存在初始值时。

+0

你在这里提到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,则始终返回本地值。如果验证失败,为什么返回本地值。 –

+0

当验证阶段因任何地方的转换或验证错误而失败时,成功通过验证的组件将返回本地值,验证失败的组件将返回提交的值。 – BalusC

+0

但是,getValue()的javadoc让我感到困惑。如果验证失败[这将成为特定组件],如FacesContext.isValidationFailed()返回true所示,总是返回本地值。他们没有回复提交的价值。 –

相关问题