Автоматическое обновление .gsp в Grails при изменении таблицы базы данных - PullRequest
1 голос
/ 22 ноября 2011

Что у меня есть: - Таблица базы данных под названием «заказы», ​​которая постоянно заполняется каким-то Java-модулем на сервере. - Сайт работает на Grails, который отображает эти заказы. Точнее - list.gsp в представлении заказов. - list.gsp будет отображать новые заказы, если в браузере нажата кнопка обновления.

Что мне нужно: - Некоторый способ для страницы .gsp на клиенте обновляться автоматически при размещении нового заказа в базе данных. - Автообновление требуется только для автоматического обновления страницы .gsp, когда клиент уже находится на странице .gsp. то есть, если клиент находится на show.gsp для определенного заказа, то нет необходимости в автообновлении.

Вещи, которые я мог бы помочь:

  • option1: Наличие службы grails, которая будет периодически (каждые 5 секунд) запрашивать базу данных, чтобы узнать, есть ли новые заказы. Если есть, то каким-то образом с .gsp-страницы снова вызовите и заново отредактируйте .gsp-страницу ??!

      - suboption1-1: create and destroy a new connection every 5 sec.
      - suboption1-2: create and keep a connection alive ... forever
    
  • option2: чтобы модуль java, который размещает заказы, вызывал refreshController через Интернет и каким-то образом повторно отображал страницу .gsp. т.е. refreshController уведомляет всех клиентов, которые в настоящее время находятся на странице .gsp, о необходимости обновления.

=============================================== ================================== Продолжение:

Как я могу вызвать контроллер из сценария Java ?:

function checkDB()
{
   t = setTimeout("com.mypackage.DBChecker.checkdbController.checkAction()", 5000)
}

=============================================== =================================== Продолжение 2:

Итак, я почти получил то, что хотел, за исключением того, что не могу понять, как AJAX вернуться на мою страницу list.gsp только часть себя. Я не хочу обновлять всю страницу, а только раздел с id = "обновить таблицу". то есть

В данный момент у меня есть следующий код, который не работает:

   <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:

Мне удается вернуть только частичную страницу через мой вызов ajax, скопировав / вставив div, который я хотел, в отдельный gsp. Я не знаю, как это работает - для меня это немного волшебство, но все работает, за исключением случаев, когда я пытаюсь отсортировать столбцы моей таблицы. Затем, только этот частичный gsp отображается в моем браузере, без остальной части начальной страницы, в результате получается простая табличная текстовая страница. Кроме того, как только я попадаю на такую ​​HTML-страницу - автообновление больше не работает, но пока я буду оставаться в представлении списка checkDB, страница будет обновляться каждые 5 секунд.

  1. ... Итак, как мне решить мою проблему

  2. Еще одна вещь, которую я не могу понять, это как вернуть True / False из контроллера в функцию javascript в gsp и как именно вы хотели, чтобы я его использовал?

  3. И, наконец, в настоящее время я использую 'window.load = timeDB' внутри моего тега для вызова функции таймера. Я пытался использовать, но по какой-то причине я не могу заставить его работать, несмотря ни на что. Есть ли что-то, что я должен иметь в виду при использовании?

И последнее: что я могу сделать, чтобы просто обновлять часть gsp каждые 5 секунд?

Ответы [ 3 ]

1 голос
/ 22 ноября 2011

Вы можете воспользоваться подходом , установив таймер на странице через javascript . Затем вы вызываете легкий вызов ajax со своей страницы gsp обратно на контроллер, который выдаст true / false, чтобы указать, нужно ли вам полное обновление. Это довольно простой подход, но вы должны быть осторожны, чтобы оптимизировать внутреннюю цель вызова ajax, так как он будет вызываться каждые 5 секунд для каждого пользователя на этой странице. Он также генерирует немного трафика.

Я мог бы изучить плагины публикации подписки из предыдущего ответа, прежде чем вернуться к этому подходу, однако я реализовал простой вызов timer / ajax (в мире java Struts) на веб-сайте среднего размера с довольно хорошими результатами. *

1 голос
/ 22 ноября 2011

То, что вы объясняете, является типичной моделью публикации - подписки.

В Grails есть несколько плагинов, которые помогут вам сделать это. Посмотрите на Атмосферу и комету для этого. Оба варианта предоставляют этот вид pub / sub.

Если они чувствуют себя немного тяжелыми для того, что вы хотите, вы должны проверить Pusher и соответствующий плагин Grails. Это немного приятнее, потому что вы можете просто интегрировать библиотеку javascript в свою страницу gsp и выполнять загрузку со стороны сервера всякий раз, когда создается заказ. Чувствуется немного легче, чем 2 библиотеки выше. Он использует веб-сокеты HTML5.

0 голосов
/ 27 ноября 2011

Итак, следующий фрагмент кода в моем list.gsp сделал это для меня.Я решил, что просто обновлять «div id =« myDiv »» каждые 5 секунд - это достаточно хорошо, иначе я бы в любом случае попадал на сервер каждые 5 секунд, так как запрашивал базу данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...