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

时间:2016-04-28 06:36:52

标签: validation jsf lifecycle

Here,作者提到了它。

  

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

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

<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

1 个答案:

答案 0 :(得分: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()重置为默认值{{1} },nullfalsenull

false

  • 调用INVOKE_APPLICATION

bean.method()

  • 如果RENDER_RESPONSE不是getSubmittedValue(),请进行渲染,否则null返回isLocalValueSet(),渲染true,否则渲染getLocalValue()。< / LI>
  • 在JSF视图状态中保存bean.getProperty()getSubmittedValue()isValid()getLocalValue(),如果已更改。