验证成功后,UIInput#getValue()和getLocalValue()返回不同的值

Shi*_*han 1 validation lifecycle jsf

在这里,它被作者提及。

如果[COMPONENT]标记为有效,则两者都返回相同的值,即提交,转换和验证的值。

考虑一个非常简单的代码段:

<h:form>
            <h:inputText value="#{bean.inputValue}" 
                         binding="#{bean.htmlInputText}"      
                         validator="nameValidator" /><br/>
            <h:commandButton value="Submit" action="#{bean.action}" />
</h:form>
Run Code Online (Sandbox Code Playgroud)

@RequestScoped支持豆-

public Integer inputValue = 5;
public HtmlInputText htmlInputText;

public void action(){
        System.out.println(" getSubmittedValue() "+htmlInputText.getSubmittedValue());
        System.out.println(" isLocalValueSet() "+ htmlInputText.isLocalValueSet());
        System.out.println(" getValue() " + htmlInputText.getValue());
        System.out.println(" getLocalValue() " +htmlInputText.getLocalValue());
}
Run Code Online (Sandbox Code Playgroud)

按下提交按钮后,输出为-

 getSubmittedValue() null    AS EXPECTED, since Conversion & Validation succeded
 isLocalValueSet() false
 getValue() 25               AS EXPECTED, since Conversion & Validation succeded
 getLocalValue() null        Why NULL? IN WHAT CONTEXT HAS THE AUTHOR SAID SO
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 5

您正在调用应用程序阶段检查本地值。

在更新模型值阶段会清除本地值。

作者在过程验证阶段进行讨论。


要澄清,这是完整的过程:

RESTORE_VIEW

  • 从,和从JSF视图状态还原getSubmittedValue()(如果有)。isValid()getLocalValue()isLocalValueSet()

APPLY_REQUEST_VALUES

  • setValid(true)setSubmittedValue(request.getParameter(getClientId()))

PROCESS_VALIDATIONS

  • 转换/验证getSubmittedValue()
    • 如果有效,这样做setValue(convertedAndValidatedValue)setLocalValueSet(true)setSubmittedValue(null)。请注意,该setValue()行为实际上与一样setLocalValue()
    • 如果无效,请执行setValid(false)并跳过更新模型值并调用应用程序阶段。

UPDATE_MODEL_VALUES

  • 如果有效和本地值集,请bean.setProperty(getLocalValue())和复位getSubmittedValue()isValid()getLocalValue()isLocalValueSet()到它们的默认值nullfalsenullfalse

INVOKE_APPLICATION

  • 调用bean.method()

RENDER_RESPONSE

  • 如果getSubmittedValue()不是null,则渲染它,否则isLocalValueSet()返回true,渲染getLocalValue(),否则渲染bean.getProperty()
  • 保存getSubmittedValue()isValid()getLocalValue()以及isLocalValueSet()在JSF视图状态,如果改变。