Различия между различными типами JSF Managed- Beans

Недавно я прочитал эту статью от Neil Griffin Различия между различными типами JSF Managed- Beans, и это заставило меня задуматься о различии между различными beans в моем собственном приложении. Чтобы быстро суммировать суть:

  • Model Managed- Bean: этот тип управляемого bean участвует в "Модельный" дизайн шаблона MVC. Когда вы видите слово "модель" - подумайте DATA. Модель JSF - bean должна быть POJO, которая следует шаблон проектирования JavaBean с инкапсуляцией геттеров/сеттеров свойства.

  • Backing Managed- Bean: этот тип управляемого bean участвует в "Просмотр" проблемы шаблона проектирования MVC. Цель поддержка bean заключается в поддержке логики пользовательского интерфейса и имеет соотношение 1:: 1 с вид JSF или форму JSF в композиции Facelet. Хотя это обычно имеет свойства стиля JavaBean со связанными getters/seters, это свойства View - not of the базовая модель данных приложения. Поддержка JSF-beans может также иметь JSF методы actionListener и valueChangeListener.

  • Управляемый управляемый Bean: этот тип управляемого bean участвует в "Контроллер" в шаблоне проектирования MVC. Цель контроллер bean должен выполнить какую-то бизнес-логику и вернуть навигация для навигатора JSF. Контроллер JSF- beansобычно имеют методы действия JSF (а не методы actionListener).

  • Поддержка Managed- Bean: этот тип bean "поддерживает" одно или несколько видов в вопросе "Вид" шаблона проектирования MVC. Типичный вариант использования предоставляет ArrayList для JSF h: selectOneMenu. списки, которые отображаются в более чем одном представлении JSF. Если данные в выпадающие списки относятся к пользователю, то bean будет сохранен в области сеанса.

  • Утилита управляется Bean: этот тип bean предоставляет некоторые типы "полезность" для одного или нескольких представлений JSF. Хорошим примером этого может быть FileUpload bean, который может быть повторно использован в нескольких веб-приложениях приложения.

Это имело смысл для меня, и в течение последних нескольких часов я реорганизовал свой код и придумал следующее в отношении входа пользователя:

AuthenticationController - пример управляемого контроллера - Bean. Он имеет область запроса и имеет два геттера и сеттеры для установки имени пользователя и пароля и два метода навигации authenticate и logout, перемещение пользователя в их личную область при успешном входе в систему или обратно на главную страницу, когда выход из системы.

UserBean - пример поддержки, управляемой - Bean. Он имеет область сеанса и имеет экземпляр класса User (который был бы нулевым, если вы не аутентифицирован) с помощью getter и setter, не более того.

AuthenticationController имеет этот пользователь как управляемое свойство (@ManagedProperty(value = "#{userController.user} private User user;). После успешной проверки подлинности AuthenticationController установит управляемое свойство фактическому экземпляру пользователя с соответствующим именем пользователя, которое было использовано для входа.

Любой новый beans сможет также захватить пользователя как управляемое свойство и вытащить нужные им данные, например, членство в группе, если класс User будет содержать список с именами групп.

Будет ли этот способ надлежащим образом действовать в отношении разделения проблем?

Ответ 1

Это очень субъективный вопрос. Я лично не согласен с этой статьей и считаю, что она дает очень плохие советы начинающим.


Model Managed- Bean: этот тип управляемого bean участвует в проблеме "Модель" шаблона проектирования MVC. Когда вы видите слово "модель" - подумайте DATA. Модель JSF - bean должна быть POJO, которая следует за шаблоном проектирования JavaBean с инкапсулирующими свойствами getters/setters.

Я бы не стал или называл это управляемым bean. Просто сделайте это свойство @ManagedBean. Например, DTO или JPA @Entity.


Backing Managed- Bean: этот тип управляемого bean участвует в заботе "Вид" шаблона проектирования MVC. Цель поддержки bean заключается в поддержке логики пользовательского интерфейса и имеет отношение 1:: 1 с представлением JSF или форму JSF в композиции Facelet. Хотя он, как правило, обладает свойствами стиля JavaBean со связанными getters/seters, это свойства представления, а не модели данных базового приложения. Поддержка JSF- beans может также иметь методы JSF actionListener и valueChangeListener.

Таким образом, вы сохраняете дублирование и сопоставление свойств объекта в управляемом bean. Для меня это не имеет смысла. Как сказано, просто сделайте объект свойством управляемого bean и пусть поля ввода ссылаются на него как #{authenticator.user.name} вместо #{authenticator.username}.


Управляемый управляемый Bean: этот тип управляемого bean участвует в заботе "Контроллер" шаблона проектирования MVC. Назначение контроллера bean заключается в выполнении какой-либо бизнес-логики и возвращении результата навигации в навигатор JSF. JSF-контроллер beans обычно имеет методы действия JSF (а не методы actionListener).

Это описывает класс @RequestScoped/@ViewScoped @ManagedBean. Доступны ли методы прослушивателя событий или нет, зависит от того, являются ли они конкретными для представления, которое привязано к bean и/или для их работы, зависящей от состояния bean. Если они есть, то они принадлежат bean. Если нет, то они должны быть автономной реализацией любого FacesListener интерфейса, но определенно не управляемого bean.


Support Managed- Bean: Этот тип bean "поддерживает" одно или несколько видов в представлении "Вид" шаблона проектирования MVC. Типичным примером использования является предоставление списков ArrayList для JSF h: selectOneMenu, которые отображаются в более чем одном представлении JSF. Если данные в раскрывающихся списках относятся к пользователю, то bean будет храниться в области сеанса.

Fine. Для данных с широким охватом приложений, таких как выпадающие списки, просто используйте @ApplicationScoped bean, а для данных с широким диапазоном сеансов, таких как вход в систему, и его предпочтения просто используйте @SessionScoped.


Utility Managed- Bean: Этот тип bean предоставляет некоторую функцию "полезности" для одного или нескольких представлений JSF. Хорошим примером этого может быть FileUpload bean, который может быть повторно использован в нескольких веб-приложениях.

Это не имеет для меня никакого смысла. Резервное копирование beans обычно привязывается к отдельным представлениям. Это слишком похоже на ActionListener, которая должна использоваться <f:actionListener> в компонентах команд по вашему выбору. Определенно не управляемый bean.

Примеры запуска правильного подхода см. также: