我需要做的是以下,我不知道为什么但是如果在数据库中更新了数据,它不会立即在我的视图中显示,我必须再次运行我的项目才能看到数据的更新. 我想做一个每 5 秒检查一次数据库并更新我想要的数据的方法。
有人告诉我,我可以用 f:ajax 做到这一点,但我不知道如何使用它,如果你能给我一个例子来指导我,我将不胜感激。
数据库是 MySQL,我使用 JavaServerFaces,连接是通过 JPA 建立的。
我需要做的是以下,我不知道为什么但是如果在数据库中更新了数据,它不会立即在我的视图中显示,我必须再次运行我的项目才能看到数据的更新. 我想做一个每 5 秒检查一次数据库并更新我想要的数据的方法。
有人告诉我,我可以用 f:ajax 做到这一点,但我不知道如何使用它,如果你能给我一个例子来指导我,我将不胜感激。
数据库是 MySQL,我使用 JavaServerFaces,连接是通过 JPA 建立的。
我给你一个ajax代码的例子:
我将解释,要使 ajax 工作,您总是必须创建一个 XMLHttpRequest 类型的对象。
最重要的是,在.open 对象中,您输入它是 POST 还是 GET 类型以及您的 PHP 的 URL。
object.onload 函数在 PHP 代码执行后执行。.responseText 方法收集 PHP 响应文本,然后将其插入到您想要的任何位置,在我的示例中,我准备好将其放入由 id 指定的字段中。在 document.getElementById("divotarget") 中,将 divotarget 更改为要重新加载信息的元素的 id。
最后在object.send()中传入你要发送的字段,模拟发送表单给PHP,格式为“data1=data&data2=data2”。
如果您希望它每 5 秒运行一次,您可以将代码放在 setInterval 中,就像这样。
我希望我已经很好地解释了自己。一切顺利。
@PabloPéres-Aradros 答案中解释的策略是一种称为轮询的解决方案。即客户端不时地咨询服务器。您必须使用
setInterval
for 方法在一个时间间隔内执行。碰巧JSF默认情况下会在客户端放置某些参数来保证视图的状态,从而避免CSRF攻击,所以使用Pablo解释的方法在手动做所有事情时使用JSF并不是“那么简单”。但是,JSF 确实支持轮询。如果您使用的是纯 JSF,最好将操作委托给一个组件
<f:ajax>
:并创建一个 JavaScript 函数:
如果您使用像 PrimeFaces 这样的库,请考虑它已经提供了自己的轮询组件(代码改编自PrimeFaces 示例页面)。
将此视为一个简单的示例。您的服务器端方法可以执行必要的数据库调用。此外,您应该测量服务器的响应时间和页面的刷新以放置您的时间间隔的值。
还有另一种称为推送的策略,它包括服务器以时间间隔执行操作并通知客户端必须更新它。BalusC (Java and JSF guru)在这个答案中解释了如何在 JSF 中使用 push ,部分翻译:
对于您的问题描述,我认为我会使用轮询。在任何情况下,您都可以评估备选方案并选择最方便使用的备选方案。
为此,您有两个选择,一个是在查询返回命令结果之前的片刻,执行一个选择命令,其中再次调用具有该表的所有内容。另一种方法是相同的,但使用带有计时器的内容,以便每隔一段时间再次执行该语句。