Мозг и когнитивные функции

вторник, 28 августа 2007 г.

Wicket 1.2.4 - опыт использования

Что это такое?
Строго говоря, Wicket относится к категории программных каркасов (application framework). Являясь надстройкой над Servlet API, Wicket предоставляет всю необходимую инфраструктуру для функционирования приложений, включая средства для управления жизненным циклом объектов, разграничения прав доступа, локализации, обработки исключительных ситуаций, поддержки сессий пользователей и т.п.

Более подробно и простым языком это описано в статье "Разработка Web-приложений с использованием Wicket".

Домашняя страничка проекта: http://wicket.apache.org/index.html

Основной список фичей: http://wicket.apache.org/features.html

Список компонент: http://wicketstuff.org/wicket13/compref


Опыт использования версии 1.2.4

Данный фреймворк пользуем более полугода в проекте фотошаринга для компании Nikon.

Из заявленного в рекламных слоганах правдой оказалось только одно - скорость выполнения. На тестах wicket показал скорострельность в 3-ри раза выше чем на JSF! На этом все :( Все остальное сводилось к обходу и "обманам" самого фреймворка для получения необходимой функциональности. Однако, стоит отметить, что некоторые компонены заработали сразу и не требовали "доработки напильником".

Реальные недостатки / неудобства можно перечислять долго, отмечу только основные. Причем, меня как не UI специалиста более интересовала backend часть (занимаемая память, быстродействие, и пр. мелочи).

Wicket API
Очень "концептуальный" API. Многие вещи можно было бы сделать гораздо проще и "прозрачнее", но это оставим на совести автора и идеолога Игоря Вайнберга. В силу того, что многие полезные методы у большинства классов объявлены как:
public final ...

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

Wicket AJAX Components
Многие AJAX компоненты уже готовы и их легко использовать, нежели писать с ноля на JSTL (любой другой подход проиграет по скорострельности). Заявляется, что все легко кастомизируемо... Это не так :( Например, готовый компонент wicket.extensions.markup.html.tree.Tree НЕ поддерживает применения произвольных стилей для того что бы он выглядел так как вы захотите. Они (стили) там просто захардкодены! Другими словами, если в вашем Web проекте CSS дизайн будет отличаться от предложенного Wicket'ом по дефолту - вас ждет много увлекательных путешествий в глубины концептуализма. Вероятнее всего, вам понадобиться сделать copy-past оригинального компонента, переобозвать его и переписать под свои нужды. Наследование, скорее всего не поможет по причине объявления многих методов как 'final'.

Wicket Session
Достоен внимания тот факт, что ЛЮБАЯ страничка в Wicket'е (ее инстанс) храниться в сессии в специальных PageMap компонентах. И при динамическом измении содержимого страницы в сессии создается ЕЩЕ одна копия новой стринички с новой версией. Т.е. существование так называемых stateless страниц (например простой статический HTML) идеалогия фрэймворка просто не допускает. Конечно, вы можете создавать такие и мапить пути к ним мимо Wicket сервлета (фильтра в последних версиях), но на этих страницах вы не сможете повторно использовать уже имеющиеся компоненты. Представьте себе HomePage который создается в виде объекта и сохраняется в сессии гостевого пользователя. В более поздних версиях (об этом ниже) допускается таки существование stateless страниц, но для них всеравно заведена отдельная fake сессия. Кстати, в тех же более поздних версиях аффтары научились выгружать (ObjectOutputStream) на диск из памяти те странички которые хранятся в сессии и подгружать их обратно.

Обратная совметимость по версиям
Это страшный сон! Достаточно взглянуть на инструкции по миграции. Для нас, например, перевод продакшина на последнюю версию 1.3 - НЕ приемлем. Причина банальна, потребуется переписать и перетестировать все наши кастомные компоненты под новый API.



Делайте выводы сами, коллеги, и учитывайте специфику своих проектов и необходимых AJAX компонент.

Комментариев нет: