Формировать ответ в виде полноценной HTML страницы в cmd.js трудоемко и чревато возможными ошибками при изоляции скобочек и кавычек. Объект http может выдать страницу целиком из файла функциями http.respFile() и http.respTmplFile(). Последняя функция перед выдачей страницы производит шаблонную обработку вставок, аналогично обрабоке PHP вставок. В отличие от PHP, JavaScript вставки вводятся <!--= JavaScript code --> и в необработанном виде воспринимаются браузером как комментарии.
Настроечный файл jCjS экспериментов с динамической страницей, обратите внимание, что используется инициализирующий скрипт из предыдущего раздела:
<?xml version="1.0" encoding="UTF-8"?>
<jCjS>
<server
port = "8080"
serverPost = "dynamicPage"
>
<folders
stat = "../stat/"
stuff = "../stuff/"
/>
</server>
<post
objectName = "dynamicPage"
>
<handlers
init = "stuff@examples/helloWorld/init.js"
cmd = "stuff@examples/dynamicPage/cmd.js"
/>
</post>
</jCjS>
Детальное описание конфигурационного файла (см. раздел Конфигурация)
Командный скрипт так устроен, что при наличии аргумента counter выдает его текстовое текушее значение, при его отсутствии и при обращении по пути /, выдает HTML страницу целиком:
ans();
function ans() {
if(http.argExist("counter")) {
http.respPlainText(counter);
return;
}
if(http.argCnt == 0) {
http.respFile("stuff@examples/dynamicPage/tmp.html");
return;
}
http.respError(404);
}
Шаблон html страницы использует библиотеку jQuery:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script language="javascript" type="text/javascript" src="/jsl/jquery.min.js"></script>
<script language="javascript" type="text/javascript">
function requestCounter() {
$.get("?counter", ansCounter).error(ansError);
}
function ansCounter(ans) {
$('#counter').html(ans);
setTimeout(requestCounter, 1000);
}
function ansError(ans) {
$('#counter').html('?');
setTimeout(requestCounter, 5000);
}
$(requestCounter);
</script>
<title>Шаблон динамической страницы поста</title>
</head>
<body>
Значение счетчика поста <!--= post.objectName --> = <span id='counter'></span>
</body>
</html>
В тех случаях, когда статичное содержимое HTML страницы использует данные, содержащиеся в контексте конкретного интерпретатора JavaScript удобно воспользоваться шаблонной обработкой страницы. Покажем это на примере, на предыдущей странице в строке 28 имеется такой несколько необычный комментарий <!--= post.objectName --> Если в Листинг 2 строку 10 заменить на http.respTmplFile("stuff@examples/dynamicPage/tmp.html");, то вид динамической страницы будет содержать имя поста. Все, что заключено в таких комментариях, jCjS прежде чем отдать страницу, заменяет результатом их выполнения JavaScript машины. Такой прием во многих случаях может оказаться очень удобным.