1

通常,当使用 JSF 的 UI 组件或它的第 3 方组件库之一时,我很难找到解释这些标记的属性将在生命周期中的哪个位置起作用的文档。

假设我想使用

<h:selectOneMenu valueChangeListener="#{myBean.myMethod1}" ... />

或者

<h:commandButton action="#{myBean.myMethod2}" actionListener="#{myBean.myMethod3}" ... />

我在哪里可以找到有关在 JSF 生命周期中分别调用 、valueChangeListenertheaction或 the的信息?actionListener

请理解,这些只是示例。当我不知道何时确切调用其方法时,我试图避免为每个组件的每个属性使用 StackOverflow。

如果不存在这样的文档(??),您建议使用哪些调试技术来逐个解决这个问题?

4

1 回答 1

1

关于标准 JSF 属性,您可以在JSF 规范等中找到相关信息。该文档在第 2.5.1.3 章中关于验证的内容如下:

转换后的值被推送到组件的 setValue() 方法中,ValueChangeEvent如果值发生更改,则触发 a。

(因此,它在转换/验证结束和设置本地值时触发)

以及第 7.3 章中关于应用程序操作的以下内容:

应用程序操作是某个 Java 类上的应用程序提供的方法,它ActionEvent在请求处理生命周期的应用请求值或调用应用程序阶段(取决于 ActionSource 实例的即时属性)发生时执行某些应用程序指定的处理发起事件)。

以下相关问题也可能有助于更好地理解它:

至于第 3 方组件库,请查看其标签文档或用户指南。但通常他们不使用自定义事件,而只是标准 JSF 事件或标准 ajax/HTML DOM 事件的抽象(因此需要基本的 ajax/HTML 知识才能开始)。

至于调试,最简单的方法是在被调用的方法中放置一个断点并查看调用堆栈和/或命中顺序。Mojarra 为每个阶段使用了一个非常自我记录的类,就像ProcessValidationsPhase它应该清楚地显示在调用堆栈之后的某个地方FacesServlet#service()。您还可以记录/打印FacesContext#getCurrentPhaseId()甚至调用Thread#dumpStack()和读取日志中的堆栈跟踪并手动浏览相关的类。

于 2013-03-26T15:43:44.700 回答