XML Data and XSL Views in Takes Framework

The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:

Год назад я пытался объяснить, насколько эффективно можно разделить данные и их представление в веб-приложении с помощью XML и XSL. Вкратце, вместо использования шаблонизации (типа JSP, Velocity, FreeMarker и т. д.) и внедрения данных в HTML, мы составляем их в виде XML-документа, а затем преобразуем их в HTML с помощью таблицы стилей XSL. Вот краткий пример того, как все это может использоваться совместно с фреймворком Takes.

Во-первых, давайте согласимся, что шаблонизация - это плохая идея сама по себе. Да, я серьезно. Весь дизайн JSP неправильный, с уважением к его создателям. Вот как это работает: предположим, что мой веб-сайт должен получить текущий обменный курс евро из базы данных и показать его на главной странице. Вот как будет выглядеть мой index.jsp:

Чтобы создать HTML, движок JSP должен вызвать get() для объекта rates и вывести результат через toString(). Это ужасный дизайн по нескольким причинам. Во-первых, представление тесно связано с моделью. Во-вторых, гибкость отображения очень ограничена. В-третьих, результат отображения нельзя использовать повторно, а представления нельзя стековать. Есть и другие причины… о них будет рассказано подробнее в одной из следующих статей.

Посмотрим, как это должно быть сделано правильно. Сначала мы позволяем нашей модели генерировать вывод в формате XML, например:

Это то, что модель создаст, не имея знания о представлении. Затем мы создаем представление в виде таблицы стилей XSL, которая преобразует XML в HTML.

Как видите, представление ничего не знает о модели в терминах реализации. Оно знает только о формате вывода XML данных, создаваемых моделью. Вот как вы его проектируете в фреймворке Takes. Давайте начнем с простого примера:

Это простое веб-приложение, которое запускает веб-сервер и никогда не завершается (оно ожидает соединений в режиме демона). Чтобы заставить его работать, нам нужно создать простой “take” с именем TkApp:

Этот “take” всегда возвращает одинаковый XML-отклик, но пока не выполняет никаких преобразований XSL. Нам нужно добавить класс RsXSLT в картину.

Прошу прощения за использование конкатенации строк, которая является плохой практикой; это только для простоты примера.

Как вы видите, я также добавил инструкцию обработки таблицы стилей XML в XML. RsXSLT сможет понять это и попытается найти ресурс /xsl/index.xsl на пути классов. Вы видите содержимое этого файла выше.

На самом деле, нет. Создание XML из строк - плохая идея. У нас есть лучший инструмент в рамках фреймворка Takes. Мы используем Xembly, который является простым императивным языком для создания и изменения XML-документов. Подробнее об этом здесь: Xembly, сборка для XML.

Вот как будет выглядеть наш TkApp:

Самый важный класс здесь - RsXembly. Идея заключается в том, чтобы позволить классам модели раскрывать свои данные через «директивы» Xembly, которые затем будут применены к структуре DOM с помощью RsXembly.

В конечном итоге, этот код создаст точно такой же XML-документ, какой я создал выше с помощью конкатенации строк.

Преимущество такого подхода заключается в идеальной развязке генерации данных, построения XML и перевода между XML и HTML. Он абсолютно переиспользуемый и “стекируемый”. Мы можем несколько раз преобразовывать данные в формате XML, применяя к каждому из них различные таблицы стилей XSL. Мы даже можем преобразовывать их в JSON, не изменяя ни одной строки кода в модельных классах.

Кроме того, мы можем форматировать их по-разному, используя мощные инструменты XSLT 2.0. XSLT сам по себе является мощным и чисто функциональным языком, который позволяет выполнять любые возможные манипуляции с данными. Ни один шаблонизатор даже близко не подходит к нему.

Посмотрите, как это работает, например, в классе RsPage в Rultor.

Translated by ChatGPT gpt-3.5-turbo/42 on 2023-11-18 at 05:10

sixnines availability badge   GitHub stars