Проблема — хранение html-кода в теле скрипта. — Нам необходимо отделить код скрипта (java-сервлет, perl, php) от html кода — чтобы дизайнеры могли вносить изменения. При этом нам надо (например) вставлять в страничку результаты выполнения запросов к sql базе. Или например нам нужно разослать пользователям сайта письмо вида: «Уважаемый Иван Иванович...». Для этого нам надо чтобы документ (html страничка) хранился на диске, а мы при необходимости загружали ее в память каким-то образом заполняли.
То есть мы подчитываем файл-шаблон, подставляем в него вычисленные значения переменных и выдаем его как результат работы скрипта. Как куда и с каком виде подставляются наши данные? — Очень просто — мы считали в String весь html код и, например, делем обыкновенную текстовую замену — $AGE$ заменяем на вычесленное значение 25. AGE выделенно значками $ чтобы случайно не заменить что-то лишнее :).
Такую работу по замене как раз и выполняют Template библиотеки классов. Существует множество библиотек классов реализующих шаблонные технологии, например webmacro. Способ выделения переменной шаблона везде разный — в webmacro, например, переменная AGE в тексте html-кода выглядела бы как $AGE, в случае моего класса — $AGE$.
Рассмотрим подробнее как это работает. Например так мы можем сделать форму редактирования с default-значениями в полях ввода: Создадим шаблон (файл myform.tmpl):
а в исходном коде напишем:
и в результате сервлет выдаст html-код:
А как работать с таблицами? — Просто! — Для них надо уже два шаблона. Первый — шапка таблицы, второй — описывает одну строку. В StringBuffer мы накапливаем строки, после этого вставляем их в шапку (как значение одной переменной). Пример: table.tmpl:
Номенклатурный номер | Наименование |
Достонство данной технологии — такми образом мы можем генерировать не только html текст но и данные в формате PDF (не сжатом!) или любом другом.