我有: - 一个名为“订单”的数据库表,该表由后端的某些 Java 模块不断填充。 - 在 Grails 上运行的显示这些订单的网站。更准确地说 - 订单 View 中的 list.gsp。 - 如果在浏览器上按下刷新按钮,list.gsp 将显示新订单。
我需要: - 在数据库中下达新订单时,客户端上的 .gsp 页面可以自动刷新的一些方法。 - 当客户端已经在 .gsp 页面中时,自动刷新只需要自动刷新 .gsp 页面。即,如果客户端在 show.gsp 上针对特定订单,则无需自动刷新。
我认为可能有帮助的事情:
选项 1:拥有一个定期(每 5 秒)查询数据库以查看是否有任何新订单的 grails 服务。如果有,则以某种方式从 .gsp 页面再次调用并重新呈现 .gsp 页面??!
- suboption1-1: create and destroy a new connection every 5 sec. - suboption1-2: create and keep a connection alive ... forever
- 选项 2:让下订单的 java 模块通过网络调用 refreshController,并以某种方式重新呈现 .gsp 页面。即让 refreshController 通知当前在 .gsp 页面中的所有客户端需要刷新。
============================================= ================================== 跟进:
如何从 java 脚本调用 Controller ?:
function checkDB()
{
t = setTimeout("com.mypackage.DBChecker.checkdbController.checkAction()", 5000)
}
============================================= =================================== 后续2:
所以我几乎得到了我想要的工作,除了我无法弄清楚如何将 AJAX 返回到我的 list.gsp 页面本身的一部分。我不想刷新整个页面,而只想刷新 id="refresh table"的部分。 IE。 。
目前我有以下代码不起作用:
<script type="text/javascript">
function checkDB()
{
var xmlhttp;
var xmlDoc;
var x;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
xmlDoc=xmlhttp.responseText;
x=xmlDoc.getElementsByTagId("refreshTable");
for (i=0;i<x.length;i++)
{
txt = x[i].childNodes[0].nodeValue;
}
document.getElementById("refreshTable").innerHTML=txt;
}
else
{
}
}
xmlhttp.open("GET","http://localhost:8080/Orderlord/checkdb/checkdb",true);
xmlhttp.send();
}
window.load = checkDB();
</script>
============================================= ==================
跟进 3:
通过将我想要的 div 复制/粘贴到单独的 gsp,我成功地通过我的 ajax 调用仅返回了部分页面。我不知道它是如何工作的——这对我来说有点神奇,但一切正常,除了当我尝试对表格的列进行排序时。然后,在我的浏览器上只呈现部分 gsp,而不会在一个简单的表格文本页面中生成初始页面的其余部分。此外,一旦我进入那种 html 页面 - 自动刷新不再起作用,但只要我停留在 checkDB ListView 中,页面就会每 5 秒刷新一次。
...那么,我该如何解决我的问题
我无法弄清楚的另一件事是如何将 True/False 从 Controller 返回到 gsp 中的 javascript 函数,以及您对我使用它的具体想法是什么?
最后,我目前在我的代码中使用“window.load = timeDB”来调用计时器函数。我尝试使用 ,但出于某种原因,无论如何我都无法让它工作。使用时有什么需要注意的吗?
最后:我该怎么做才能每 5 秒简单地刷新部分 gsp?
最佳答案
您可以采用 setting a timer on the page via javascript 的方法.然后,您将从 gsp 页面调用一个轻量级的 ajax 调用返回到您的 Controller ,该调用将产生 true/false 以指示您是否需要完全刷新。这是一种相当简单的方法,但您需要注意优化了 ajax 调用的后端目标,因为它将每 5 秒为该页面上的每个用户调用一次。它还会产生相当多的流量。
在回退到这种方法之前,我可能会探索早期答案中的发布订阅插件,但是我已经在一个中等规模的网站上实现了简单的计时器/ajax 调用(在 java struts 世界中)并取得了很好的效果。
关于javascript - 当数据库表更改时自动刷新 Grails 中的 .gsp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8219960/