【问题标题】:Triggering Ajax event when an object changes its state当对象改变其状态时触发 Ajax 事件
【发布时间】:2025-12-26 07:50:09
【问题描述】:

我有一个小型大学项目,我必须在其中展示某些算法的工作原理。决定使用 JSF 做一个简单的 webapp,并将算法生成的所有数据保存到数据库中。

我心想,‘嘿,如果我能一步一步地向用户展示算法的工作原理,那就太酷了,没什么花哨的,只是简单的格式化文本,当算法做它的事情时会发生变化。带有 Ajax 的输出文本字段应该可以完成工作!',但我无法完全解决某个问题。 Ajax 在某个事件发生时触发,例如“click”或“keyup”,但是有没有办法让它在我的 ManagedBean 类中的对象发生更改时触发?

不知道我解释的是否充分,所以这里是我想做的一个例子:

  1. ManagedBean 中的 ArrayList 为空,输出文本不打印任何内容
  2. 经过一定时间后,ArrayList 中保存了一个新对象,Ajax 触发器和 outputtext 打印出它的 onString()
  3. 再次经过一定时间后,之前打印出来的同一个对象发生变化,Ajax触发,输出文本也随之变化

如果问题不是很清楚,我很抱歉,尽我所能尝试描述它。

【问题讨论】:

    标签: ajax jsf


    【解决方案1】:

    您所描述的不再是经典的、客户端触发的 AJAX,而是称为server-sent events (SSE)。它们通常使用长轮询来实现(周期性的客户端请求,只有在有服务器端事件时才会得到答复)。

    您最喜欢的 JSF 工具包可能以“Push”的名义支持它。这是Primefaces example

    但是,对于您的简单用例,我建议改用 polling。见this example。主要区别在于您的服务器端逻辑切换以保留“待显示”字符串/ids/对象的列表。当您的浏览器客户端轮询服务器(调用侦听器方法)时,将第一项分配给支持 bean 中的 String 字段,并让您的客户端重新渲染显示此 String 的区域。

    请注意,您可以在纯 JSF-2 中执行此操作,不需要 Primefaces。

    【讨论】: