Разница между Apache Tapestry и Apache Wicket

Apache Wicket (http://wicket.apache.org/) и Apache Tapestry (http://wicket.apache.org/) являются оба компонентно-ориентированными веб-фреймворками - в отличие от основанных на действиях такие фреймворки, как Stripes - от Apache Foundation. Оба позволяют создавать приложение из компонентов на Java. Они оба очень похожи на меня.

В чем разница между этими двумя фреймворками? Есть ли у кого-нибудь опыт работы с обоими? Конкретно:

  • Какова их производительность, насколько можно настроить обработку состояния, можно ли использовать их без сохранения состояния?
  • В чем разница в их компонентной модели?
  • Что бы вы выбрали для каких приложений?
  • Как они интегрируются с Guice, Spring, JSR 299?

Изменить: я прочитал документацию для обоих и использовал оба. На эти вопросы нельзя дать исчерпывающий ответ, прочитав документацию, но исходя из опыта их использования в течение некоторого времени, например как использовать Wicket в режиме без сохранения состояния для высокопроизводительных сайтов. Спасибо.


person KingOfCoders    schedule 18.03.2009    source источник
comment
JFYI, я много пересмотрел свой ответ.   -  person Sergey    schedule 15.04.2009
comment
Я бы лично избегал Tapestry по той причине, что он, как правило, полностью переписывается с каждым основным выпуском и редко имеет обратную совместимость с предыдущими версиями.   -  person skaffman    schedule 06.08.2009
comment
Начиная с версии 5 это больше не должно быть проблемой - версия 5 была создана с расчетом на возможность расширения в будущем.   -  person Joel    schedule 03.12.2009


Ответы (8)


Некоторые важные отличия, как я их вижу:

  • Tapestry использует полустатическую структуру страницы, где вы можете работать с условными выражениями и циклами для достижения динамического поведения. Калитка полностью динамична; вы можете загружать компоненты динамически, заменять их во время выполнения и т. д. Следствием этого является то, что Tapestry легче оптимизировать, а Wicket более гибок в использовании.
  • Обе структуры примерно одинаково эффективны в исполнении, но Wicket полагается на хранилище на стороне сервера (по умолчанию текущая страница в сеансе и прошлые страницы в «кеше второго уровня», который по умолчанию является временным файлом в файловой системе). Если вас это беспокоит, подумайте о том, сколько одновременных сеансов вы ожидаете провести в часы пик, и рассчитайте, скажем, ~ 100 КБ на сеанс (что, вероятно, является высоким показателем). Это означает, что вы можете поддерживать примерно 20 тысяч одновременных сеансов для 2 ГБ. Скажите 15k, потому что вам нужна эта память и для других вещей. Конечно, недостатком хранения состояния является то, что оно будет хорошо работать только с привязкой к сеансу, так что это ограничение при использовании Wicket. Фреймворк предоставляет вам средства для реализации страниц без состояния, но если вы разрабатываете полностью приложения без состояния, вы можете рассмотреть другой фреймворк.
  • Цель Wicket - максимально полно поддерживать статическую типизацию, тогда как Tapestry больше ориентирована на сохранение строк кода. Таким образом, с Tapestry ваша база кода, вероятно, меньше, что хорошо для обслуживания, а с Wicket вы много статически типизированы, что упрощает навигацию с помощью IDE и проверку с помощью компилятора, что также хорошо для обслуживания. Что сказать имхо обоим.

Я уже несколько раз читал, что люди думают, что Wicket во многом работает через наследование. Подчеркну, что у вас есть выбор. Существует иерархия компонентов, но Wicket также поддерживает композицию с помощью таких конструкций, как IBehavior (поверх которых, например, встроена поддержка Ajax Wicket). Вдобавок ко всему у вас есть такие вещи, как преобразователи и валидаторы, которые вы добавляете к компонентам глобально или даже в качестве сквозной задачи, используя некоторые из прослушивателей фаз, которые предоставляет Wicket.

person Eelco    schedule 13.08.2009
comment
... ваша кодовая база, вероятно, меньше, что хорошо для обслуживания - вы уверены? Опыт показывает, что часто бывает наоборот. Для того же уровня сложности и того же качества кода подробный код обычно более удобен в обслуживании, чем краткий. Чтобы добиться терпкости, вам понадобится магия и прорези углов. - person Laurent Grégoire; 03.02.2012
comment
@IOranger, что, безусловно, может быть так. Зависит от того, как поддерживается «меньший код». Не всякая магия плоха, но, безусловно, может иметь неприятные последствия. - person Eelco; 03.02.2012

ПЕРЕСМОТРЕНО после изучения Гобелена 5.

Цель Wicket - попытаться сделать веб-разработку похожей на графический интерфейс для настольных компьютеров. Им удалось сделать это очень хорошо за счет использования памяти (HTTPSession).

Цель Tapestry 5 - сделать очень оптимизированную (для ЦП и памяти) компонентно-ориентированную веб-платформу.

По-настоящему большой ловушкой для меня были ответы "Wicket поддерживает компонент без сохранения состояния!" к аргументам «Калитка голодна до памяти». Хотя Wicket действительно поддерживает компоненты без сохранения состояния, они не являются «фокусом разработки Wicket». Например, ошибка в StatelessForm очень долго не исправлялась - см. StatelessForm - проблема с параметрами после сбоя проверки.

  • IMHO использование Wicket немного проще, пока вы не собираетесь оптимизировать / настраивать параметры веб-приложения.
  • IMHO Wicket сложнее изучать, если вы запрограммировали веб-приложения и хотите думать в терминах обработки запросов.
  • Tapestry 5 автоматически перезагружает классы компонентов, как только вы их меняете. Обе структуры перезагружают разметку компонентов.
  • Wicket заставляет разделение разметки / кода, Tapestry 5 просто дает вам эту возможность. Вы также можете использовать менее подробный синтаксис в Tapestry 5. Как всегда, эта свобода требует большей осторожности.
  • Ядро Wicket легче отлаживать: пользовательские компоненты основаны на наследовании, а пользовательские компоненты Tapestry 5 основаны на аннотациях. С другой стороны, это может упростить переход к будущим версиям для Tapestry, чем для Wicket.

К сожалению, учебник по Tapestry 5 не подчеркивает, что пример кода Tapestry, такой как 't: loop source = "1..10" ... 'может быть плохой практикой. Поэтому следует приложить некоторые усилия для написания правил использования гобеленов / передовых практик, если ваша команда не очень мала.

Мои рекомендации:

  • Используйте Wicket, если структура ваших страниц очень динамична и вы можете позволить себе потратить 10-200 Кбайт памяти HttpSession на пользователя (это приблизительные цифры).
  • Используйте Tapestry 5 в тех случаях, когда вам нужно более эффективно использовать ресурсы
person Sergey    schedule 18.03.2009
comment
Спасибо, хорошее замечание, я также думаю, что хорошая скорость важна для будущего обслуживания. - person KingOfCoders; 18.03.2009
comment
Особенно, если в вашей команде несколько младших / недисциплинированных программистов :) - person Sergey; 18.03.2009
comment
Я никогда не видел кода в шаблоне Tapestry 5. Как это должно работать? - person Henning; 19.03.2009
comment
Понятно. Что ж, это не совсем код, поскольку вы все равно должны использовать компоненты, и цикл - лишь один из них. Но вы правы, я также предпочитаю синтаксис инструментария, и, возможно, синтаксис ‹t: ... следовало бы не учитывать. - person Henning; 20.03.2009
comment
Молодец, Сергей! Спасибо за это. Мне всегда было лень подробно изучить Wicket. +1 - person Henning; 15.04.2009
comment
@Henning, теперь я понимаю совет внимательно изучить список рассылки проекта, прежде чем выбирать фреймворк. Я бы изучил Tapestry 5 в первую очередь, если бы я следил за этим. - person Sergey; 15.04.2009
comment
Не думайте, что Tapestry на самом деле более эффективен для всех аккаунтов. Предыдущие тесты показали очень сравнимую производительность. Я лично всегда сомневался в объединении объектов Tapestry (4 и ниже, не знаю о 5), которое на практике может оказаться дороже, чем просто создание объектов. Кроме того, государство должно куда-то уходить; просто хранить его в памяти намного эффективнее, чем, например, экстернализируя это. - person Eelco; 27.08.2009
comment
@chillenious, в Tapestry 5 объединение компонентов в пул необходимо, потому что создание компонентов T5 - это обширная операция. С другой стороны, это позволяет проводить сложные оптимизации. Например, преобразование дерева рекурсивных компонентов в оптимизированный конечный автомат. Это имеет значение, если у вас много компонентов. См. tapestryjava.blogspot.com/2009/02/speeding-up -tapestry-51.html - person Sergey; 28.08.2009
comment
@chillenious, по крайней мере, с Tapestry 5 у вас есть выбор: интенсивно использовать память или нет. Насколько я понимаю, с Wicket вы можете играть только с тем, где хранить пользовательские сеансы. - person Sergey; 28.08.2009
comment
Сергей, чтобы доказать свою точку зрения: см. ptrthomas .wordpress.com / 2009/09/14 / Даже если вы откажетесь от этого предвзятого микробенчмарка (а я думаю, что это не так), просто не предполагайте, измеряйте. Результаты там (что Wicket быстрее и потребляет меньше памяти) согласуются с различными тестами, которые я запускал сам и слышал от других людей за эти годы. Я бы не сказал, что разница достаточно велика, чтобы выбрать ваш фреймворк; просто выберите тот, который лучше всего подходит вашему стилю. - person Eelco; 17.09.2009
comment
›По крайней мере, с Tapestry 5 у вас есть выбор: интенсивно использовать память или нет. Насколько я понимаю, с Wicket вы можете играть только с тем, где хранить пользовательские сеансы. Вы можете выбрать, где хранить что угодно. Это очень гибкий фреймворк, особенно потому, что он оставляет разработчиков ответственными за создание объектов и т. Д. Мы просто не поддерживаем сохранение состояния клиента, главным образом потому, что, когда мы были на полпути к его реализации, это оказалось настолько неэффективным (как в ASP.NET, JSF и т. Д.), Что, по нашему мнению, не стоит наших усилий. - person Eelco; 17.09.2009
comment
@chillenius, я думаю, что самое интересное в последнем сравнении находится в комментариях. См. 39-й комментарий Игоря Дробязко. ИМХО авторский подход к переписыванию базового приложения очень близко к оригиналу не годится для измерения производительности. Это как писать программы в стиле C на Лиспе, чтобы доказать, что Лисп намного медленнее. - person Sergey; 20.09.2009
comment
@chillenius, я согласен, что текущие документы T5 не очень хороши. - person Sergey; 20.09.2009

Вот довольно подробное сравнение из IBM Developer Works.

http://www.ibm.com/developerworks/java/library/os-tapestrywicket/index.html?ca=drs

Обновление: ссылка мертва, но вы можете найти страницу на http://web.archive.org/web/20131011174338/http://www.ibm.com/developerworks/java/library/os-tapestrywicket/index.html?ca=drs

person Scott Swank    schedule 06.08.2009
comment
хотелось бы увидеть такое сравнение с использованием гобелена 5 - person jnichols959; 21.10.2009
comment
Извините, эта статья касается только Tapestry 4, поэтому она больше не актуальна. - person Bob Harner; 12.01.2011

Я думаю, что Wicket - это более простой в использовании фреймворк.

Кроме того, Wicket позволяет перезагрузить класс через систему замены горячего кода вашей IDE. Это все, что требуется Wicket для запуска измененных версий классов текущего приложения. Для замены горячего кода применяются обычные ограничения, такие как необходимость работать в режиме отладки (Eclipse) и невозможность изменять структурные аспекты класса (например, имя класса, изменение сигнатур методов и т. Д.).

person Antony Stubbs    schedule 18.07.2009

Мне не нравится модель программирования Tapestry, и я знаю многих разработчиков, покидающих Tapestry из-за слишком большого количества изменений и несовместимости в разработке. См .: http://ptrthomas.wordpress.com/2009/09/14/perfbench-update-tapestry-5-and-grails/

person deamon    schedule 16.01.2010
comment
Также см. stackoverflow.com/questions/1303438/ - person Stephan Eggermont; 13.06.2010

Wicket - очень хороший веб-фреймворк. Лучшее из всего, что я знаю. Я использую его с версии 1.3 и всегда получаю то, что хочу. Wicket имеет отличную интеграцию со Spring - просто используйте аннотацию @SpringBean в своем коде, чтобы внедрить любой Spring bean-компонент в свои классы.

person Alexey Sviridov    schedule 23.03.2009
comment
У него также хорошая интеграция с Guice (если вы заставите его работать, настройка иногда может быть немного громоздкой). - person Laurent Grégoire; 15.02.2013

Попробуйте http://incubator.apache.org/click/. Это потрясающий веб-фреймворк на Java. Некоторые называют это «Калитка, сделанная правильно» ;-)

person Andrej Fink    schedule 16.01.2010
comment
Многие фреймворки утверждают, что ни один из них на самом деле еще не оказался правильным. Конечно, Wicket сделал некоторые вещи абсурдно громоздким способом, но просто скопировав лучшее из Wicket, вы не добьетесь лучшего фреймворка. Кроме того, их быстрый запуск более сложен, чем у Wicket уже на этапе 1. - person Esko; 16.01.2010
comment
После быстрого старта Click вы можете использовать Click (написать код). После быстрого старта Wicket у вас установлена ​​калитка - чувствуете разницу? ;-) Click не вторая копия Wicket. Они родились примерно в одно время, вдохновленные Гобеленом. 2Stephan: если вам нравится Stripes, вам понравится CLick, как это делает автор книги Stripes: stripesbook.org/blog/index.php?/archives/ - person Andrej Fink; 16.01.2010
comment
Wicket QuickStart является создателем Maven POM, QuickStart Click эквивалентен Wicket Hello World @ wicket.apache.org/examplehelloworld .html Также кажется, что у Click действительно нет separation of code and markup, что является одной из самых важных функций Wicket - на самом деле Click использует Velocity для HTML, который сам по себе является языком шаблонов. Из-за этого Click на самом деле не ориентирован на компоненты, хотя и утверждает, что он более близок к JSTL или, возможно, Tapestry в этом отношении. Кроме того, вы явно рекламируете, что заставляет меня беспокоиться о вашем посте в целом. - person Esko; 16.01.2010
comment
1) Для меня (и, например, для этого парня assertinteresting.com/2009/03/why-i-prefer-stripes-over-wicket) быстрый старт означает немного больше (цитата: если вы прочитали краткое руководство, всего 3 страницы или около того, вы Буду в основном «получать» полосы). 2) Я не такой пурист, после долгого времени с необработанными сервлетами + JSP, затем сервлетами + Freemarker, затем SpringMVC + Freemarker Click - это достаточно объектно-ориентированный и ориентированный на меня компонент. 3) Мне нравятся Spring и Freemarker. Щелчок доставляет такое же удовольствие, как и они оба. 4) Я не связан с платформой Click, я просто ее большой поклонник. - person Andrej Fink; 18.01.2010

Как я уже сказал, когда официальной стабильной версией была 4.1:

Вы должны очень внимательно изучить историю разработки Tapestry, прежде чем приступить к ее использованию. Tapestry претерпела множество несовместимых обновлений, при этом поддержка более старых версий не продолжается. Исправления до 4.1 больше не обрабатываются в разумные сроки. На мой взгляд, это неприемлемо для официальной стабильной версии.

Обязательство использовать Tapestry 5 означает:

вы должны стать коммиттером; нужно идти в ногу со всеми новыми разработками, как можно быстрее отказываться от старых версий; поддерживайте стабильные версии самостоятельно.

person Stephan Eggermont    schedule 13.06.2010
comment
Мне это кажется FUD; есть тысячи счастливых пользователей Tapestry 5 и лишь горстка коммиттеров. Мы сделали все возможное, чтобы обновления Tapestry 5 были максимально безболезненными. - person Howard M. Lewis Ship; 17.07.2012
comment
Есть разница между болезненным опытом и FUD. - person Stephan Eggermont; 29.10.2012