Декларативный язык опснаия веб-страниц. Введение. MiLK - это декларативный язык описания веб-страниц,не являющийся языком программирования. Он построен на основе XML и J2SE для интеграции его в CMS-подобные системы на основе J2EE. Цели разработки: Первое: При решении простых веб-задач, очень часто приходится сталкиваться со структурой программ типа: включиь множество нужных классов (библиотек) установить соединение с базой данных и так далее. Вполне логично выделить приведенные выше строки в отдельный модуль,который бы обладал способностью загружать программы выполняющие генерацию HTML содержимого страницы и проверку содержимого запроса и сессии. (Здесь ничего нового я не выдумал, многие CMS работают подобным образом). Однако, очень часто приходится наблюдать, как разработчики начинают внедрять некие формы описания генерации веб-страниц (например, в ассоциативных массивах PHP), равно как и формы описания проверок форм. Отсюда второе: Описать генерацию страниц и проверки форм специализированным языком. При этом желательно избавиться от циклических конструкций при обработке resultSet-ов, что по сути означает привнесение декларативности в описание. Задача построения языка: Необходимо создать декларативный язык описания веб-страниц, интерпретатор которого имел бы следующие входные данные: 1) адрес скрипта 2) адрес конфигурационного файла 3) адрес binding файла (файла связей тегов с классами) 4) соединение с БД 5) сессия 6) запрос выход: 1) org.w3c.dom.Document Что получено: Структура языка: Из сказанного выше очевидно, что язык разбивается на две не равные части, а именнно list и form. list описывает генерацию списков по правилам вида: 1) выходные теги 2) страничная развертка 3) сортировки, фильтрации 4) основа списка (либо запроса к БД, либо сессии, либо HTTP запроса, либо их всех всместе или некоего сочетания) 5) трансформации каждого элемента списка 6) инструменты каждого элемента списка. form описывает обработчик формы: 1) проверки 2) трансформации 3) действия при успешном завершении проверок. Описание списка логически (не явно) разбивается на 2 части: 1) создание запроса к БД (базы списка): выходные теги, постраничная развертка, сортировки, фильтрации, база (либо запроса к БД, либо сессии, либо HTTP запроса, либо их всех вместе или некоего сочетания). 2) обработка результатов запроса к БД (базы списка): трансформации каждого элемента списка, инструменты каждого элемента списка. Как все работает: Для всех тегов, за исключнием activation (используется для реализации условий) и MiLK, используется отложенное выполнение. Каждый тег обслуживается двумя классами: генератором и исполнителем. Когда MiLKHandler "находит" открывающий тег, он инициализирует пустой ArrayList local для результатов выполнения генераторов дочерних тегов и при нахождении атрибутов помещает их в стек атрибутов соотвествующего тега. По нахождении конца данного тега, результаты выполнения генераторов дочерних тегов, если таковые имеются, автоматически передаются генератору данного тега (информация о кассах генераторах данного тега содержится в MiLKBinding.xml). Таким образом, MiLKHandler ищет информацию о классе и методе генератора данного тега и, если поиск успешен, передает результаты выполния дочерних тегов в метод, указанный в MiLKBinding.xml. В этом методе обычно создается объект исполнителя и задаются его параметры. Результат автоматически помешается в ArrayList local. Данная процедура выполняется до нахождения закрывающего тега MiLK, который по сути является элементом, запускающим выполнение результатов генерации (выполнения тегов). Особый случай представляет собой тег аctivation. Для него предусмотрено 2 режима: динамический и статический. Статический режим - предназначен для того, чтобы избежать генерации результатов тегов того же уровня вложенности по входным данным для интерпретатора MiLK: содержимого запроса, содержимого сессии. При этом не происходит генерации исполнителей тегов, если результат выполнения дочерних тегов активации может быть интерпритирован как ложь (более подробно - см. документацию по языку). Выполняется статическая активация по месту, то есть сам генератор является и исполнителем тега. Динамический режим - предназначен для управления исполнением тегов (выполняющихся по результатам запроса к БД и фактической генерации списка): тег трансформация каждого элемента списка, тег инструменты каждого элемента списка. Динамическая активация выполняетя в отложенном режиме. Несколько слов о XML. MiLK не является самостоятельным языком и его расширение подразумевает создание новых тегов, а значит, и языковых конструкций. В данных условиях наиболее прямолинейный подход - это использовать WXS для определения грамматики языка, что позволяет относительно легко менять грамматические правила, в том числе вводить новые конструкции. Это не требует перекомпиляции интерпретатора языка, за что, естественно, мы расплачиваеся временем выполнения скрипта. Выводы: Был построен не самостоятельный, декларативный язык описания веб-страниц на основе J2SE, выходом которого является dom объект. Грамматика MiLK описана в WXS. Расширение языка подразумевает введение новых элементов в WXS языка (MiLK.xsd), создание класса генератора и исполнителя, запись соответствия тега его классу генератору в MiLKBinding.xml.