通常在使用JSF的UI组件或其中一个第三方组件库时,我很难找到解释这些标记的属性将在生命周期中的位置的文档。
假设我想使用
<h:selectOneMenu valueChangeListener="#{myBean.myMethod1}" ... />
或
<h:commandButton action="#{myBean.myMethod2}" actionListener="#{myBean.myMethod3}" ... />
我在哪里可以找到有关JSF生命周期中valueChangeListener
,action
或actionListener
的调用位置的信息?
请理解这些只是示例。当我不明白何时会调用它的方法时,我试图避免为每个组件的每个属性访问StackOverflow。
如果这样的文档不存在(??),你会建议使用哪些调试技术来逐个解决这个问题?
答案 0 :(得分:1)
对于标准JSF属性,您可以在JSF specification中找到其他信息。文档在第2.5.1.3章中说明了有关验证的内容:
转换后的值会被推送到组件的setValue()方法中,如果值已更改,则会触发
ValueChangeEvent
。
(因此,它在转换/验证结束和设置本地值时被触发)
以下第7.3章关于申请行动:
应用程序操作是某个Java类上的应用程序提供的方法,在发生
ActionEvent
时,在请求处理生命周期的应用请求值或调用应用程序阶段期间执行某些应用程序指定的处理(取决于在ActionSource实例的直接属性启动时 事件)。
以下相关问题也可能有助于更好地理解它:
对于第三方组件库,请查看其标签文档或用户指南。但通常它们不使用自定义事件,而只是标准的JSF事件或标准ajax / HTML DOM事件的抽象(因此需要基本的ajax / HTML知识)。
关于调试,最简单的方法是在被调用的方法中放置一个断点并查看调用堆栈和/或命中顺序。 Mojarra为每个阶段使用了一个非常自我记录的类,如ProcessValidationsPhase
,它应该在FacesServlet#service()
之后的某个地方清楚地显示在调用堆栈中。您还可以记录/打印FacesContext#getCurrentPhaseId()
甚至调用Thread#dumpStack()
并在日志中读取堆栈跟踪并手动浏览关联的类。