Каковы принципы разработки веб-приложений с использованием Java-фреймворков на основе действий? - PullRequest
1 голос
/ 18 мая 2010

Фон

Я собираюсь разработать новое веб-приложение с Java. Он не очень большой или очень сложный, и у меня есть достаточно времени, чтобы он "официально" начался.

У меня есть опыт разработки JSF / Facelets (около полугода). И у меня также есть некоторый опыт работы с JSP + JSTL.

В целях самообразования (а также для того, чтобы найти лучшее решение) я хочу создать прототип нового проекта с одной из основанных на действии сред. На самом деле, я буду выбирать между Spring MVC и Stripes.

Задача

Чтобы получить правильное представление об основанных на действии средах (по сравнению с JSF), я хочу быть уверенным, что использую их правильно (в большей или меньшей степени).

Итак, здесь я перечислю некоторые наиболее частые задачи (по крайней мере, для меня) и опишу, как я их решаю с помощью JSF. Я хочу знать, как их следует решать с помощью основанной на действии среды (или отдельно с Spring MVC и Stripes, если есть какая-то разница для конкретной задачи).

  1. Рендеринг контента : я могу применить готовый к использованию компонент из стандартных библиотек jsf (core и html) или из сторонних библиотек (например, RichFaces). Я могу комбинировать простые компоненты и легко создавать свои собственные компоненты, основанные на стандартных компонентах.
  2. Визуализация данных (примитивных или ссылочных типов) в правильном формате : Каждый компонент позволяет указать конвертер для преобразования данных обоими способами (для визуализации и отправки на сервер). ). Конвертер, как обычно, простой класс с двумя маленькими методами.
  3. Навигация по сайту : Я указываю набор футляров для навигации вface-config.xml. Затем я указываю атрибут действия ссылки (или кнопки), который должен соответствовать одному или нескольким случаям навигации. Лучший матч выбрал JSF.
  4. Реализация потока (например, многоформные мастера) : Я использую JSF 1.2, поэтому я использую Apache Orchestra для области потока (диалога).
  5. Обработка форм : У меня есть довольно стандартный Java-бин (поддерживающий бин в терминах JSF) с некоторой областью действия. Я 'отображаю' поля формы в свойствах этого компонента. Если все идет хорошо (исключений нет и проверка не пройдена), тогда все эти свойства устанавливаются со значениями из полей формы. Затем я могу вызвать один метод (указанный в атрибуте кнопки action ), чтобы выполнить некоторую логику и вернуть строку, которая должна во многих моих навигационных случаях перейти на следующий экран.
  6. Проверка форм : Я могу создать собственный валидатор (или выбрать из существующего) и добавить его почти к каждому компоненту. Сторонние библиотеки имеют наборы пользовательских ajax-валидаторов. Стандартные валидаторы работают только после отправки страницы. На самом деле мне не нравится, как работает валидация в JSF. Слишком много магии там. Многие стандартные компоненты (или, может быть, все) имеют предопределенную проверку, и ее невозможно отключить (возможно, не всегда, но я столкнулся с множеством проблем).
  7. Поддержка Ajax : многие сторонние библиотеки (MyFaces, IceFaces, OpenFaces, AnotherPrefixFaces ...) имеют сильную поддержку ajax и работают довольно хорошо. Пока не встретишь проблему. Слишком много магии там тоже. Очень трудно заставить его работать, если он не работает, но вы все сделали правильно, как описано в руководстве.
  8. Удобные для пользователя URL : люди говорят , что для этого существуют библиотеки. И это может быть сделано с фильтрами . Но я никогда не пробовал. Это кажется слишком сложным для первого взгляда.

Заранее благодарим за объяснение того, как эти элементы (или некоторые из них) могут быть выполнены с помощью основанных на действии фреймворков.

Ответы [ 2 ]

3 голосов
/ 18 мая 2010

Я сделаю все возможное, чтобы ответить относительно Полосы . Я использовал 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 , это так просто.

1 голос
/ 18 мая 2010

Мой ответ не тот, который вы хотите услышать: не переключайтесь с Component Framework на среду действий

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

Из 8 случаев использования, о которых вы упомянули, только один приходит на ум, где платформы Action явно лучше, и это дизайн URL / дружественные URL. Это можно сделать и в компонентных средах, но гораздо проще в Action Frameworks (особенно в Stripes, где вы просто аннотируете свой ActionBean с помощью URL).

Я бы посоветовал вам попробовать wicket, его очень легко выучить (намного проще, чем JSF), и это также позволит вам повторно использовать многие существующие компоненты.

...