【问题标题】:UIInput#getValue() and getLocalValue() after validation succeeds return different values验证成功后的 UIInput#getValue() 和 getLocalValue() 返回不同的值
【发布时间】:2016-04-28 06:36:51
【问题描述】:

Here,是作者提到的。

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

考虑一个非常简单的sn-p:

<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

【问题讨论】:

    标签: validation jsf lifecycle


    【解决方案1】:

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

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

    作者在过程验证阶段的背景下谈论。


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

    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() 重置为其默认值nullfalsenull 和@98765434 @。

    INVOKE_APPLICATION

    • 调用bean.method()

    RENDER_RESPONSE

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

    【讨论】:

    • 如果验证成功,则在第 4 阶段将 getSubmittedValue()、isValid()、getLocalValue() 和 isLocalValueSet() 设置为其默认值。如果在下一个恢复视图阶段,为什么要将它们保存为视图状态,它们也将是默认值。
    • 与默认值相比,当它们未更改时,最佳状态管理实现确实不会保存它们。
    • 您可能会生气,因为我一次又一次地询问与一个概念相关的事情。我在这里提出了一个问题stackoverflow.com/questions/36917652/…,我的困惑是在输入一个不正确的值之后,之前该值是有效的,isLocalValueSet() 是真的。这只有在它之前被序列化,使用 getValue() 和 getLocalValue() 保存在视图状态时才可能,也反映了以前输入的值。
    • 您似乎对提出的问题一点兴趣都没有。相信我,除了请求/咨询你之外,我别无他法。事实上,我在这里提出的所有问题,都是因为你的存在。如果你不在这里,我不会抚养他们。这里(公司)的所有高级架构师都不熟悉这一点。据我所知,与我现在所知道的相比,他们甚至不知道一丝一毫。请告诉我我最近的评论是否正确,或者至少告诉我哪里出错了。
    • 没问题。不过,我喜欢你的技术好奇心。那个问题投票是我的。您的问题与那些永恒的“请为我调试此代码转储”问题不同。你显然想学习钓鱼,而不是被鱼喂饱。
    猜你喜欢
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    相关资源
    最近更新 更多