我一直在尝试使用h:messages组件来显示全局消息。我一直无法弄清楚如何在消息显示后可靠地使消息消失。我看过很多帖子谈论同一个问题,但我还没有找到一个描述Faces消息系统如何工作的帖子。
特别是,我希望了解FaceMessages被解雇的条件,即是否通过在包含消息组件的组件上强制客户端ajax执行周期,渲染周期或两者来完成?是否有一种通用的方法可以从服务器端支持bean获取适当的周期,从而接收到对其模型的异步更新?例如,我正在使用icefaces,它提供了服务器端的ajax推送功能,似乎为此提供了一些支持,但它只会在发生时影响单个组件。此外,除了在浏览器中请求完整页面刷新之外,强制删除FacesContext.addMessage插入的FacesMessage的可接受做法是什么。我通过验证异常生成FacesMessages以取消更成功,但即使这样也不总是可靠的,我想了解原因。
不幸的是,发布我的应用程序代码将很困难,因为我开发的系统没有连接到互联网。我希望在这一点上有人指出我正确的方向,这样我就能更好地理解事情应该如何运作。因此,如果有人可以根据前面的内容描述FacesMessage的生命周期,或者给我一个权威的参考信息,我将非常感激。
答案 0 :(得分:1)
基于我在BalusC(http://balusc.blogspot.com/2006/09/debug-jsf-lifecycle.html和http://balusc.blogspot.com/2012/03/reset-non-processed-input-components-on.html)找到的一些工作,我能够创建一个PhaseListener,记录有关FacesMessage世界中发生的事情的充分信息,以了解我的方法失败的原因
我采用的方法是使用“重置”按钮清除当前显示的消息(显示在h:messages组件中)。我在我的支持bean中使用“actionListener”回调来清除消息(可以通过两个FacesContext.getMessages方法访问),但即使显示了消息,消息数据结构也总是空的。
原来我的问题是阶段相关。 “actionListener”回调在INVOKE_APPLICATION阶段运行,但是在RENDER_RESPONSE阶段之前不会填充消息数据结构。通过创建一个适当编码的PhaseListener,我现在能够推迟清除消息数据结构,直到RENDER_RESPONSE阶段完美运行。
我应该补充一点,上面引用的第二个BalusC链接在由于PROCESS_VALIDATIONS阶段引发的故障而发生消息时也非常重要,因为输入组件在重置之前将保持无效状态,并且他提供了非常好的这样做的方法。
再次,我为无法发布实际代码而道歉,因为我的开发系统与互联网断开连接,我被禁止在可移动媒体上取出任何内容。