Что у меня есть:
- Таблица базы данных под названием «заказы», которая постоянно заполняется каким-то 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 секунд.
... Итак, как мне решить мою проблему
Еще одна вещь, которую я не могу понять, это как вернуть True / False из контроллера в функцию javascript в gsp и как именно вы хотели, чтобы я его использовал?
И, наконец, в настоящее время я использую 'window.load = timeDB' внутри моего тега для вызова функции таймера. Я пытался использовать, но по какой-то причине я не могу заставить его работать, несмотря ни на что. Есть ли что-то, что я должен иметь в виду при использовании?
И последнее: что я могу сделать, чтобы просто обновлять часть gsp каждые 5 секунд?