验证成功后的 UIInput#getValue() 和 getLocalValue() return 个不同的值

UIInput#getValue() and getLocalValue() after validation succeeds return different values

Here,作者有提到

If it's[COMPONENT] marked valid, then both returns the same value, namely the submitted, converted and validated value.

考虑一个非常简单的片段:

<h:form>
            <h:inputText value="#{bean.inputValue}" 
                         binding="#{bean.htmlInputText}"      
                         validator="nameValidator" /><br/>
            <h:commandButton value="Submit" action="#{bean.action}" />
</h:form>

带有 @RequestScoped 支持 bean-

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());
}

按下提交按钮,输出为-

 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

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

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

作者是在流程验证阶段的背景下进行讨论。


为了澄清,这里是完整的过程:

RESTORE_VIEW

  • 从 JSF 视图状态恢复 getSubmittedValue()isValid()getLocalValue()isLocalValueSet()

APPLY_REQUEST_VALUES

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

PROCESS_VALIDATIONS

  • Convert/validategetSubmittedValue()
    • 如果有效,执行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() returns true,则渲染 getLocalValue(),否则渲染 bean.getProperty().
  • 如果更改,请在 JSF 视图状态中保存 getSubmittedValue()isValid()getLocalValue()isLocalValueSet()