JSF 1.2生命周期理解:在InvokeApplication阶段执行ValueChangeListener方法

我在DataTable的facet头中使用 。 该 DataTable的所有行内容都是 。 行按照我想要的方式完美选择。 以下是我使用的代码:

   ...... ...... ......        

这是ValueChangeListener的代码:

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

这是我为使这段代码工作而添加的isInvokeApplicationPhase实用程序(在此链接中引用了BalusC建议的解决方案: JSF 1.2:valueChangeListener事件未返回新选择的值 ):

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

现在我的问题:

ValueChangeListener方法中使用isInvokeApplicationPhase检查有什么用? 如果我评论这个检查然后它不起作用 – 为什么? 我以为我已经正确理解了JSF生命周期,但这种行为certificate我没有:(

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

值更改侦听器在validation阶段运行,并且意图挂钩值更改事件。 即新提交的值与原始模型值不同。

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

此特定技巧将值更改事件重新排入调用应用程序阶段,该阶段更新模型值阶段之后运行。 因此,当您尝试更改其他字段的模型值时,它将不会被覆盖。

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

实际上,价值变化事件在这里被滥用。 您应该在此处使用动作事件,但这不适用于JSF 1.x中的输入。 这只在JSF 2.x中以风格提供。

也可以看看:

  • 何时使用valueChangeListener或f:ajax监听器?
  • Setter没有调用输入文本