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