Apache Tapestry — это компонентно-ориентированная [ требуется пояснение ] Java- фреймворк веб-приложений с открытым исходным кодом , концептуально аналогичный JavaServer Faces и Apache Wicket . [2] Tapestry был создан Говардом Льюисом Шипом [ когда? ] и принят Apache Software Foundation в качестве проекта верхнего уровня в 2006 году. [3]
Tapestry подчеркивает простоту, удобство использования и производительность разработчика. Он придерживается парадигмы Convention over Configuration , устраняя почти всю конфигурацию XML . [4] Tapestry использует модульный подход к веб-разработке, имея сильную привязку между каждым компонентом пользовательского интерфейса (объектом) на веб-странице и соответствующим ему классом Java . Эта основанная на компонентах архитектура заимствует много идей из WebObjects . [5]
Для минимального шаблонного приложения Tapestry требуется всего три файла:
<!DOCTYPE html> <html xmlns= "http://www.w3.org/1999/xhtml" xmlns:t= "http://tapestry.apache.org/schema/tapestry_5_3.xsd" > <body> <p> Здравствуйте, ${username} </p> </body> </html>
пакет org.example.demo.pages ; /** Класс страницы (автоматически связанный с файлом шаблона с тем же именем) */ public class HelloWorld { /** Обычный геттер */ public String getUsername () { return "World" ; } }
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <display-name> Пример Tapestry </display-name> <context-param> <!-- Укажите Tapestry 5, где искать страницы, компоненты и миксины --> <param-name> tapestry.app-package </param-name> <param-value> org.example.demo </param-value> </context-param> <filter> <!-- Определите фильтр сервлета Tapestry --> <filter-name> app </filter-name> <filter-class> org.apache.tapestry5.TapestryFilter </filter-class> </filter> <filter-mapping> <!-- Сообщите контейнеру сервлета, какие запросы следует отправлять в фильтр сервлета Tapestry --> <filter-name> приложение </filter-name> <url-pattern> /* </url-pattern> </filter-mapping> </web-app>
Tapestry использует манипуляцию байт-кодом для преобразования классов страниц и компонентов во время выполнения. Этот подход позволяет записывать классы страниц и компонентов как простые POJO с несколькими соглашениями об именовании и аннотациями, потенциально запускающими существенное дополнительное поведение во время загрузки класса. Версии Tapestry 5.0, 5.1 и 5.2 использовали библиотеку манипуляции байт-кодом Javassist. Последующие версии заменили Javassist новым слоем манипуляции байт-кодом под названием Plastic , который основан на ObjectWeb ASM . [11] [12]
Версии Tapestry 5 вплоть до 5.3 объединяли фреймворки JavaScript Prototype и script.aculo.us вместе с библиотекой Tapestry, специфичной для Tapestry, чтобы поддерживать операции Ajax как первоклассные граждане. Доступны сторонние модули для интеграции jQuery вместо Prototype/Scriptaculous или в дополнение к ним.
Начиная с версии 5.4, Tapestry включает новый слой JavaScript, который устраняет зависимость встроенных компонентов от Prototype, позволяя подключать jQuery или другой фреймворк JavaScript. [13]
В версии 5.4 также реализована поддержка модулей JavaScript с использованием системы загрузки модулей RequireJS.
В документации проекта Tapestry приводятся четыре «принципа», которые определяют все решения по разработке Tapestry, начиная с версии 5 в 2008 году: [14]
Tapestry критиковали за отсутствие обратной совместимости между основными версиями, особенно это было отмечено при переходе с версии 4 на версию 5, когда не было чистого пути миграции для существующих приложений. [15] Члены команды проекта признали это как серьезную проблему для пользователей Tapestry в прошлом, и обратная совместимость была сделана основной целью дизайна Tapestry в будущем. С самого начала разработки версии 5 обратная совместимость была указана как один из четырех новых «Основных принципов» Tapestry, а два из трех других были предназначены для того, чтобы сделать эволюцию фреймворка возможной без ущерба для обратной совместимости. Члены команды проекта утверждают, что все выпуски Tapestry, начиная с версии 5.0, были в высокой степени обратно совместимы.
Ранние критики Tapestry 5 также упоминали документацию как недостаток. Участники проекта теперь утверждают, что этот недостаток был в значительной степени устранен с помощью тщательно переработанного и обновленного Руководства пользователя и другой документации.
Начиная с версии 5.0, Tapestry объединяет библиотеки Prototype и Scriptaculous JavaScript. По словам Говарда Льюиса Шипа, в 2008-2009 годах это был разумный выбор. Однако с тех пор популярность Prototype снизилась, а jQuery резко возросла. В ответ на это сообщество Tapestry разработало модули, которые позволяли использовать jQuery в дополнение к Prototype или вместо него. Между тем, текущая версия Tapestry, 5.4, полностью устраняет зависимость от Prototype, заменяя ее слоем совместимости, в который можно подключить либо jQuery, либо Prototype (или потенциально любой другой фреймворк JavaScript).
По словам Говарда Льюиса Шипа, Tapestry изначально задумывался как попытка реализовать на Java некоторые общие концепции и подходы, найденные в WebObjects, который в то время был написан на Objective-C и имел закрытый исходный код. [16]
По словам создателя Wicket Джонатана Локка, Apache Wicket был разработан в ответ на сложность ранних версий Tapestry. [17]
Facelets , технология представления по умолчанию в JavaServer Faces , как сообщается, была вдохновлена ранними версиями Tapestry, как попытка удовлетворить потребность в «фреймворке, подобном Tapestry, подкрепленном JavaServer Faces как отраслевым стандартом». [18] [19]