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