【问题标题】:JSF 1.2 Life Cycle understanding: Executing the ValueChangeListener method in InvokeApplication phaseJSF 1.2生命周期理解:在InvokeApplication阶段执行ValueChangeListener方法
【发布时间】:2013-04-22 02:50:12
【问题描述】:

我在 DataTable 的 facet 标头中使用了 <h:selectBooleanCheckbox>。该<h:column> DataTable 的所有行内容都是<h:selectBooleanCheckbox>。行正在按照我想要的方式完美选择。下面是我使用的代码:

<h:form>
<h:dataTable
    value="#{employeeService.employeeList }"
    var="empl"
    binding="#{employeeService.dataTablebinding }">
    ......
    ......
    ......
    <h:column>
            <f:facet name="header">             
                <h:selectBooleanCheckbox id="chkBoxAll" value="#{employeeService.checkedHdr }" valueChangeListener="#{employeeService.checkAll }" onclick="submit()"></h:selectBooleanCheckbox>
            </f:facet>
            <h:selectBooleanCheckbox id="tableChkBox" value="#{empl.checked }" valueChangeListener="#{employeeService.getCheckChanged }" onclick="submit()"></h:selectBooleanCheckbox>
        </h:column>
</h:dataTable>

这是ValueChangeListener的代码:

public void checkAll(ValueChangeEvent event){
    if(isInvokeApplicationPhase(event)){
        Iterator<Employee> empl = employeeList.iterator();
        while(empl.hasNext()){
            Employee emp = empl.next();             
            emp.setChecked(checkedHdr);
        }
    }
}

这是我添加的用于使此代码工作的isInvokeApplicationPhase 实用程序(参考此链接中BalusC 建议的解决方案:JSF 1.2: valueChangeListener event not returning newly selected value):

public boolean isInvokeApplicationPhase(FacesEvent event){      
    if(event.getPhaseId() != PhaseId.INVOKE_APPLICATION){
        event.setPhaseId(PhaseId.INVOKE_APPLICATION);
        event.queue();
        return false;
    }       
    return true;
}

现在我的问题:

isInvokeApplicationPhaseValueChangeListener 方法中检查有什么用?如果我注释掉这个检查,那么它就不起作用 - 为什么?我以为我已经正确理解了 JSF 生命周期,但这种行为证明我没有:(

请让我知道基于 JSF 生命周期阶段的解释。

【问题讨论】:

    标签: java jsf icefaces jsf-1.2 icefaces-1.8


    【解决方案1】:

    值更改侦听器在验证阶段运行,旨在挂钩值更改事件。 IE。新提交的值与原始模型值不同。

    验证阶段运行之前更新模型值阶段,其中 JSF 在模型中设置所有提交、转换和验证的值(支持 bean 的属性)。因此,当您尝试更改值更改侦听器中不同字段的模型值时,它将在更新模型值阶段被覆盖。

    这个特殊技巧将值更改事件重新排队到调用应用程序阶段,该阶段运行更新模型值阶段。因此,当您尝试更改不同字段的模型值时,它不会被覆盖。

    简而言之:验证阶段是手动操作模型值的错误时刻,而调用应用程序阶段是手动操作模型值的正确时刻。

    其实这里就是滥用值变化事件。您应该在此处使用一个动作事件,但这不适用于 JSF 1.x 中的输入。这仅在 &lt;f:ajax listener&gt; 风格的 JSF 2.x 中可用。

    另见:

    【讨论】:

    • 请验证我的理解。这一次我又觉得我明白了。但我仍然想验证我的理解。就我而言,DataTable 包含每一行的复选框。单击标题复选框时,每行中存在的所有dataTableComponent#checkbox 的值为false,因为它们都未选中(仅选中标题复选框)。因此每行中所有复选框的datatableComponent#setSubmittedValue是假的。我没有任何转换器/验证器,因此datatableComponent#setValue 也是false
    • 然后是ValueChangeListener,我在其中迭代并将所有检查设置为true。第三阶段到此结束。在第 4 阶段,checkbox 的模型值更新为false,因为在转换/验证之后(即在第 3 阶段中,在 ValueChangeListener 之前)将datatableComponent#setValue 设置为false。因此,我们需要您在帖子中提到的绕过概念。请验证我的理解。
    • 如果您添加一些我在解释中可能遗漏的内容,我将不胜感激。感谢您为 JSF 1.2 创建的博客解释生命周期事件:) 关闭线程。
    猜你喜欢
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-25
    • 2016-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多