javascript - 当数据库表更改时自动刷新 Grails 中的 .gsp

标签 javascript ajax grails

我有: - 一个名为“订单”的数据库表,该表由后端的某些 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 秒刷新一次。

  1. ...那么,我该如何解决我的问题

  2. 我无法弄清楚的另一件事是如何将 True/False 从 Controller 返回到 gsp 中的 javascript 函数,以及您对我使用它的具体想法是什么?

  3. 最后,我目前在我的代码中使用“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/

相关文章:

javascript - 图像结果未显示在页面上

javascript - 2个js文件之间的链接

javascript - jQuery 无法正确解析 JSON

php - 使用 AJAX 切换 Like 按钮颜色

grails - 如何重写 GORM/Grails 的 addTo* 和 RemoveFrom* 方法?

javascript - 从选择以 'aa' 开始的文本中删除选项

javascript - 从 Javascript 检测损坏的锁图标(混合安全/不安全内容)

javascript - 无法比较 out.print() 返回的字符串

unit-testing - Grails单元测试不会失败

java - Grails 应用程序速度非常慢