Введение

Фреймворк веб-приложений с открытым исходным кодом

Apache Tapestry — это Java-фреймворк для веб-приложений, ориентированный на компоненты и имеющий открытый исходный код, концептуально схожий с JavaServer Faces и Apache Wicket. Tapestry был создан Говардом Льюисом Шипом и принят Apache Software Foundation в качестве проекта высшего уровня в 2006 году. Tapestry делает акцент на простоте, удобстве использования и продуктивности разработчиков. Он следует парадигме "Соглашения важнее конфигурации", устраняя почти всю необходимость в XML-конфигурации. Tapestry использует модульный подход к веб-разработке, обеспечивая тесную связь между каждым компонентом пользовательского интерфейса (объектом) на веб-странице и соответствующим классом Java. Эта архитектура, основанная на компонентах, заимствует множество идей из WebObjects.

Примечательные особенности

Live Class Reloading Tapestry отслеживает файловую систему на предмет изменений в классах страниц Java, классах компонентов, классах реализации сервисов, шаблонах HTML и файлах свойств компонентов, и динамически подменяет изменения в работающем приложении без необходимости перезапуска. Это обеспечивает очень короткий цикл обратной связи при сохранении кода, что, как утверждается, значительно повышает производительность разработчиков. Страницы, основанные на компонентах, могут быть построены из небольших вложенных компонентов, каждый из которых имеет шаблон и класс компонента. Создание пользовательских компонентов, как утверждается, очень простое. Tapestry использует соглашения об именовании и аннотации вместо XML для настройки приложения. Экономное использование HTTPSession. Благодаря минимальному использованию HTTPSession, Tapestry разработан для высокой эффективности в кластеризованной среде с репликацией сессий. Большинство отправлений форм следуют шаблону Post/Redirect/Get (PRG), что снижает вероятность случайной повторной отправки форм, делает URL более удобными и пригодными для закладок, а также обеспечивает нормальную работу кнопок "Назад" и "Обновить" в браузере. Inversion of Control (IoC) Tapestry построен на легковесной основе Inversion of Control, похожей на Google Guice, но предназначенной для обеспечения конфигурируемости и заменяемости практически всех аспектов поведения Tapestry.

Поддержка клиентов

Версии Tapestry 5 до 5.3 включали в себя JavaScript-фреймворки Prototype и Scriptaculous, а также библиотеку, специфичную для Tapestry, для поддержки операций Ajax наравне с основными возможностями. Для интеграции jQuery вместо или в дополнение к Prototype/Scriptaculous доступны сторонние модули. Начиная с версии 5.4, Tapestry включает новый JavaScript-слой, который избавляет встроенные компоненты от зависимости от Prototype, позволяя подключать jQuery или другую JavaScript-библиотеку. Версия 5.4 также представляет поддержку JavaScript-модулей с использованием системы загрузки модулей RequireJS.

Критика

Tapestry подвергается критике за отсутствие обратной совместимости между основными версиями, особенно это проявилось при переходе с версии 4 на версию 5, где для существующих приложений не было предусмотрено чёткого пути миграции. Члены команды проекта признали это серьёзной проблемой для пользователей Tapestry в прошлом, и обратная совместимость стала одной из главных целей при разработке Tapestry в дальнейшем. С самого начала разработки версии 5 обратная совместимость была включена в список четырёх новых "основных принципов" Tapestry, а два из остальных трёх принципов были направлены на обеспечение возможности развития фреймворка без ущерба для обратной совместимости. Члены команды проекта утверждают, что все выпуски Tapestry, начиная с 5.0, обладают высокой степенью обратной совместимости. Среди ранних замечаний в адрес Tapestry 5 также упоминалась недостаточная документация. Теперь участники проекта утверждают, что этот недостаток в значительной степени устранён благодаря тщательно переработанному и обновлённому руководству пользователя и другой документации. Начиная с версии 5.0, Tapestry поставляется с JavaScript-библиотеками Prototype и Scriptaculous. По словам Говарда Льюиса Шипа, в 2008–2009 годах это были разумные решения. Однако с тех пор популярность Prototype снизилась, а популярность jQuery значительно возросла. В ответ сообщество Tapestry разработало модули, позволяющие использовать jQuery как дополнение к Prototype или вместо него. В то же время, текущая версия Tapestry, 5.4, полностью исключает зависимость от Prototype, заменяя её слоем совместимости, в который можно интегрировать jQuery или Prototype (или, возможно, любой другой JavaScript-фреймворк).

Отношение к другим структурам

Согласно Говарду Льюису Шипу, Tapestry изначально задумывался как попытка реализовать в Java некоторые общие концепции и подходы, которые использовались в WebObjects, написанном в то время на Objective-C и имевшем закрытый исходный код. Apache Wicket был разработан как реакция на сложность ранних версий Tapestry, по словам инициатора проекта Wicket Джонатана Локка. Сообщается, что Facelets, стандартная технология представления в JavaServer Faces, была вдохновлена ранними версиями Tapestry как попытка создать "фреймворк, подобный Tapestry, опирающийся на JavaServer Faces как на отраслевой стандарт".

История

Дата Версия Описание 2000 Разработан Говардом Льюисом Шипом для внутреннего использования 2002 04 Впервые опубликован на SourceForge под лицензией GNU Lesser General Public License. 2004 04 Первый релиз под Apache, как подпроект Jakarta. 2006 01 Добавлена поддержка аннотаций JDK 1.5, новая подсистема проверки ввода и улучшенное сообщение об ошибках. 2008 12 Практически полная переработка по сравнению с Tapestry 4, внедрение новой компонентной модели на основе POJO, делающей акцент на соглашениях, а не на конфигурации, и замена Hivemind новым слоем инверсии управления без использования XML. 2009 04 Улучшения производительности и использования памяти, автоматическое сжатие GZIP, агрегация JavaScript, при этом сохранена обратная совместимость с Tapestry 5.0. 2010 12 Добавлена валидация JSR 303 Bean Validation. Расширена перезагрузка классов в реальном времени на реализации сервисов. Удалено объединение страниц. 2011 11 Добавлена поддержка HTML5 doctype, аннотации JSR 330 для внедрения зависимостей, улучшения производительности и использования памяти, новые компоненты, переход с JavaAssist на манипуляции с байт-кодом ASM. 2012–2014 Исправления ошибок и незначительные улучшения. 2015–2019 Значительные улучшения клиентской части. Новый JavaScript-слой с возможностью переключения между поддержкой jQuery/Prototype, использующий Require.js в качестве системы модулей JavaScript и Twitter Bootstrap для стилей оформления по умолчанию. 2020 03 Текущая стабильная версия. Поддержка байт-кода Java 12, Typescript и Bootstrap 4.