Я сделаю все возможное, чтобы ответить относительно Полосы . Я использовал Struts и JSF в прошлом, но не в последнее время, так что в лучшем случае у меня есть смутные представления и чувства к ним.
Мы очень хорошо знакомы с Полосами, теперь используем его почти для всего и действительно наслаждаемся им. В него легко войти, он поддерживает многие сложные сценарии, но вы также можете свободно работать вне его, что очень важно, если вы хотите создать свои собственные ajax-виджеты или поговорить с другой системой или чем-то еще.
Если вы идете по маршруту полос, я определенно рекомендую купить или скачать книгу . Это универсальный магазин для всего, что вам нужно для Stripes, и практически единственная документация для Stripersist (действительно хорошая функция, но без веб-документации).
Рендеринг контента: я могу применить готовый к использованию компонент из стандартных библиотек jsf (core и html) или из сторонних библиотек (например, RichFaces). Я могу комбинировать простые компоненты и легко создавать свои собственные компоненты, основанные на стандартных компонентах.
Это похоже. Core, Html, Fmt и т. Д., А также любые пользовательские теги, которые вы найдете, вкл. Дисплей: тег, пакет тегов, и создать свой собственный. Однако, очевидно, что вы не имеете дела на уровне компонентов сейчас, вы имеете дело с тегом, который определяет, что находится на странице / отправлено на сервер или с сервера.
Рендеринг данных (примитивных или ссылочных типов) в правильном формате: каждый компонент позволяет указать конвертер для преобразования данных обоими способами (для рендеринга и отправки на сервер). Конвертер, как обычно, простой класс с двумя маленькими методами.
В Stripes есть много встроенных конвертеров, и легко создавать собственные конвертеры для более сложных типов данных. Stripes поддерживает очень сложные структуры данных, которые должны отображаться без особых хлопот. Например, в сочетании с Stripersist я могу поместить объект моей модели непосредственно в ActionBean, поместить несколько полей в форму, а Stripersist будет гидрировать модель из БД (на основе ее PK) и обновите его с помощью полей, которые я поместил в форму - все, прежде чем передать мне управление в ActionBean.
Навигация по сайту: я указываю набор футляров навигации вface-config.xml. Затем я указываю атрибут действия ссылки (или кнопки), который должен соответствовать одному или нескольким случаям навигации. Лучший матч выбрал JSF.
Навигация в полосах основана на том, что вы изначально называете ActionBeans. Там нет XML. Кроме того, pretty urls - это аннотация на уровне ActionBean в Stripes 1.5, поэтому вы можете делать такие вещи, как @UrlBinding("/{$event}/{model}")
, где /view/5
приведет вас к обработчику событий "view
" для вашего объекта Model. с ID / ПК 5.
Реализация потока (например, мастера с несколькими формами): я использую JSF 1.2, поэтому я использую Apache Orchestra для области действия потока (диалога).
В то время как я только смутно знаком с концепцией области разговора, у Stripes есть Wizard Form функциональность, но я не использовал его и не могу по-настоящему расширить это. Я думаю, что это похожая идея.
Обработка формы: у меня есть довольно стандартный Java-бин (поддерживающий бин в терминах JSF) с некоторой областью действия. Я 'отображаю' поля формы в свойствах этого компонента. Если все идет хорошо (исключений нет и проверка не пройдена), тогда все эти свойства устанавливаются со значениями из полей формы. Затем я могу вызвать один метод (указанный в атрибуте действия кнопки), чтобы выполнить некоторую логику и вернуть строку, которая во многих моих навигационных случаях должна перейти к следующему экрану.
Не сильно отличается. Вместо компонентов в вашем бине [action] у вас теперь есть Java или пользовательские типы. ActionBeans создаются для каждого запроса и выбрасываются, если только вы не делаете что-то вроде сеанса, мастера или чего-то еще. Это хорошо, потому что все переменные экземпляра сопоставляются с данными из формы, вы используете их, а затем выбрасываете, и вам не нужно иметь дело с какими-либо проблемами синхронизации, как это сделали распорки. После того, как вы поработаете с данными, Stripes позволит вам отправить ForwardResolution (состояние OK), Redirect или Streaming (JSON, файл и т. Д.). Шаблон Redirect-after-POST реализован с идеей flash scope (3/4 вниз по странице).
Проверка форм: я могу создать собственный валидатор (или выбрать из существующего) и добавить его почти к каждому компоненту. Сторонние библиотеки имеют наборы пользовательских ajax-валидаторов. Стандартные валидаторы работают только после отправки страницы. На самом деле мне не нравится, как работает валидация в JSF. Слишком много магии там. Многие стандартные компоненты (или, может быть, все) имеют предопределенную проверку, и ее невозможно отключить (возможно, не всегда, но я столкнулся с множеством проблем).
Полосы позволяют проверять аннотации переменных экземпляра в ActionBean. Они допускают некоторые значения по умолчанию, требуемые, максимальную длину и т. Д., Или вы всегда можете создать свой собственный. Значение по умолчанию легко добавить и гибко, в то время как всегда есть возможность сделать что-то полностью настроенное.
Поддержка Ajax: многие сторонние библиотеки (MyFaces, IceFaces, OpenFaces, AnotherPrefixFaces ...) имеют сильную поддержку ajax, и она работает довольно хорошо. Пока не встретишь проблему. Слишком много магии там тоже. Очень трудно заставить его работать, если он не работает, но вы все сделали правильно, как описано в руководстве.
Это была моя большая проблема с JSF. Даже если вы правильно сделали виджет, вы все равно останетесь с этим виджетом. С Stripes вы можете использовать все, что может предложить последняя и самая лучшая Jquery, и если вы отправляете правильный GET или POST на сервер, Stripes знает, что с ним делать, и может легко отправить JSON обратно. Я думаю, что компонентные каркасы несколько лет назад занимали свою нишу намного лучше, когда AJAX был сложным, но JQ теперь делает это очень просто.
Удобные для пользователя URL: люди говорят, что для этого существуют библиотеки. И это можно сделать с помощью фильтров. Но я никогда не пробовал. Это кажется слишком сложным для первого взгляда.
@ UrlBinding , это так просто.