验证成功后的 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/validate
getSubmittedValue()
。
- 如果有效,执行
setValue(convertedAndValidatedValue)
、setLocalValueSet(true)
、setSubmittedValue(null)
。请注意 setValue()
有效地表现为 setLocalValue()
.
- 如果无效,请执行
setValid(false)
并跳过更新模型值和调用应用程序阶段。
UPDATE_MODEL_VALUES
- 如果设置了有效的本地值,请执行
bean.setProperty(getLocalValue())
并将 getSubmittedValue()
、isValid()
、getLocalValue()
和 isLocalValueSet()
重置为其默认值 null
、false
、null
和 false
.
INVOKE_APPLICATION
- 调用
bean.method()
.
RENDER_RESPONSE
- 如果
getSubmittedValue()
不是 null
,则渲染它,否则如果 isLocalValueSet()
returns true
,则渲染 getLocalValue()
,否则渲染 bean.getProperty()
.
- 如果更改,请在 JSF 视图状态中保存
getSubmittedValue()
、isValid()
、getLocalValue()
和 isLocalValueSet()
。
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/validate
getSubmittedValue()
。- 如果有效,执行
setValue(convertedAndValidatedValue)
、setLocalValueSet(true)
、setSubmittedValue(null)
。请注意setValue()
有效地表现为setLocalValue()
. - 如果无效,请执行
setValid(false)
并跳过更新模型值和调用应用程序阶段。
- 如果有效,执行
UPDATE_MODEL_VALUES
- 如果设置了有效的本地值,请执行
bean.setProperty(getLocalValue())
并将getSubmittedValue()
、isValid()
、getLocalValue()
和isLocalValueSet()
重置为其默认值null
、false
、null
和false
.
INVOKE_APPLICATION
- 调用
bean.method()
.
RENDER_RESPONSE
- 如果
getSubmittedValue()
不是null
,则渲染它,否则如果isLocalValueSet()
returnstrue
,则渲染getLocalValue()
,否则渲染bean.getProperty()
. - 如果更改,请在 JSF 视图状态中保存
getSubmittedValue()
、isValid()
、getLocalValue()
和isLocalValueSet()
。