JSF backing bean structure (лучшие практики)


Я надеюсь, что в этом посте я могу получить мнение людей о лучших практиках для интерфейса между страницами JSF и бэк-бобами.

одна вещь, на которой я никогда не могу остановиться, - это структура моих вспомогательных бобов. Кроме того, я никогда не находил хорошей статьи на эту тему.

какие свойства принадлежат к каким бэк-бобам? Когда целесообразно добавить больше свойств к данному компоненту, а не создавать новый компонент и добавлять свойства на него? Для простые приложения, имеет ли смысл просто иметь один бэк-бин для всей страницы, учитывая сложность, связанную с введением одного Бина в другой? Должен ли бэк-компонент содержать какую-либо фактическую бизнес-логику или он должен строго содержать данные?

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


Что касается уменьшения связи между страницей JSF и бэк-Бобом, я никогда не позволяю странице JSF получать доступ к какой-либо поддержке свойства свойства Боба. Например, я никогда не позволяю что-то типа:

<h:outputText value="#{myBean.anObject.anObjectProperty}" />

Я всегда требую что-то вроде:

<h:outputText value="#{myBean.theObjectProperty}" />

со значением бэк-Бина:

public String getTheObjectProperty()
{
    return anObject.getAnObjectProperty();
}

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

В общем, этот подход кажется мне "правильным". Это позволяет избежать любой связи между представлением и данными. Пожалуйста, поправьте меня, если я неправильный.

6 114

6 ответов:

вы можете проверить это:проведение различий между различными видами управляемых компонентов JSF.

Вот описание различных типов бобов, как определено в приведенной выше статье Нила Гриффина:

  • Модель Управляемого Bean-Компонента: обычно область сеанса. этот тип управляемого компонента участвует в" модельной " проблеме шаблона проектирования MVC. Когда вы видите слово "модель" -- подумайте о данных. A JSF model-bean должен быть POJO, который следует шаблону проектирования JavaBean с геттерами / сеттерами, инкапсулирующими свойства. Наиболее распространенный вариант использования компонента модели-это быть сущностью базы данных или просто представлять набор строк из результирующего набора запроса базы данных.
  • Backing Managed-Bean: нормально объем запроса. этот тип управляемого компонента участвует в заботе" представления " шаблона проектирования MVC. Целью бэк-Бина является поддержка пользовательского интерфейса логика и имеет отношение 1::1 с представлением JSF или формой JSF в композиции Facelet. Хотя он обычно имеет свойства JavaBean-стиля со связанными геттерами / сеттерами, это свойства представления, а не базовой модели данных приложения. JSF backing-beans может также иметь методы JSF actionListener и valueChangeListener.
  • Контроллер Управляемый-Bean: нормально объем запроса. этот тип управляемого компонента участвует в "Контроллер" касается шаблона проектирования MVC. Цель компонента контроллера-выполнить некоторую бизнес-логику и вернуть результат навигации в обработчик навигации JSF. Контроллер-компоненты JSF, как правило, имеют в JSF способы действий (и не actionlistener и методы).
  • Поддержка Управляемых Bean-Компонентов: обычно область сеанса или приложения. этот тип Боба " поддерживает "одно или несколько представлений в отношении" представления " шаблона проектирования MVC. Типовое значение вариант использования предоставляет ArrayList в раскрывающиеся списки JSF h:selectOneMenu, которые отображаются в нескольких представлениях JSF. Если данные в выпадающих списках являются конкретными для пользователя, то компонент будет храниться в области сеанса. Однако если данные применяются ко всем пользователям (например, выпадающие списки провинций), то компонент будет храниться в области приложения, чтобы его можно было кэшировать для всех пользователей.
  • Утилита Managed-Bean:как правило, сфера применения. Этот тип компонента предоставляет некоторую функцию "полезности" для одного или нескольких представлений JSF. Хорошим примером этого может быть компонент FileUpload, который можно повторно использовать в нескольких веб-приложениях.

большой вопрос. Я много страдал с той же дилеммой, когда перешел в JSF. Это действительно зависит от вашего приложения. Я из мира Java EE, поэтому я бы рекомендовал иметь как можно меньше бизнес-логики в ваших резервных бобах. Если логика чисто связана с представлением вашей страницы, то это нормально, чтобы иметь его в бэк-бин.

Я считаю, что одной из (многих) сильных сторон JSF является тот факт, что вы можете предоставлять объекты домена непосредственно на управляемом зернышки. Поэтому я настоятельно рекомендую <:outputText value="#{myBean.anObject.anObjectProperty}" /> подход, в противном случае вы в конечном итоге делаете слишком много работы для себя в ручном выставлении каждого свойства. Кроме того, это будет немного беспорядок при вставке или обновлении данных, если вы инкапсулировали все свойства. Бывают ситуации, когда одного доменного объекта может быть недостаточно. В этих случаях я готовлю ValueObject прежде чем выставить его на фасоль.

редактировать: на самом деле, если вы собираетесь инкапсулируйте каждое свойство объекта, которое вы хотите предоставить, я бы рекомендовал вместо этого привязать компоненты пользовательского интерфейса к бэк-компоненту, а затем ввести содержимое непосредственно в значение компонента.

С точки зрения структуры бобов поворотным моментом для меня было то, что я насильно игнорировал все, что я знал о создании веб-приложений, и вместо этого начал рассматривать его как приложение GUI. JSF имитирует качели много и поэтому лучшие практики для разработки качели приложения будут в основном также применяться для создания приложений JSF.

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

  • Это нормально иметь бизнес-логику в вашем бэк-бобов. Это зависит от того, откуда вы пришли. Если вы практикуете дизайн, управляемый доменом, у вас возникнет соблазн включить бизнес-логику в бэк-боб или также может быть логикой персистентности. Они утверждают, что почему так тупо возражают. Объект должен нести не только состояние, но и поведение тоже. С другой стороны, если вы рассмотрим традиционный способ Java EE делать вещи, вы можете чувствовать себя как наличие данных в вашем бэк-Бобе, который также может быть вашим Бобом сущности и другой логикой бизнеса и персистентности в каком-то сеансовом Бине или что-то еще. Это тоже хорошо.

  • его совершенно нормально иметь один бэк-бин для всей страницы. Я не вижу никаких проблем с этим в одиночку. Это может выглядеть неправильно, но это зависит от случая.

  • Ваш вопрос далеко больше зависит от случая, который вы имеете в руках. Я бы предпочел перейти на домен, управляемый здесь, возможно, было бы целесообразно добавить свойства к существующему или иным образом создать новый компонент для этого. Что лучше подходит. Я не думаю, что есть какая-то серебряная пуля для этого.

  • какие свойства принадлежат какому бэк-Бобу. Ну, это не зависит от объекта домена? Или может быть вопрос не ясно.

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

Я думаю, что самое главное с вашими бэк-бобами-это отделить их логику. Если у вас есть первая страница для системы CMS, я бы счел это плохой практикой, чтобы поместить каждый кусок кода в один боб, потому что:

  1. боб в конце концов станет очень большим
  2. его легче для других людей, чтобы найти то, что они ищут, если они устраняют неполадки на странице входа, если они затем могут легко просто посмотреть loginBean.Java-файл.
  3. иногда у вас есть небольшие функциональные возможности, которые четко отличаются от остальной части вашего кода, отделяя это, я бы предположил, что вам будет легче переделать/расширить этот код в нечто большее, когда у вас уже есть хороший боб с хорошей структурой.
  4. наличие 1 большого Боба, чтобы сделать все это, сделает его более зависимым от памяти, если/когда вам нужно сделать объявления, подобные этому MyBigBean bigBean = new MyBigBean (); вместо использования funksjonality вам действительно нужно, делая LoginBean loginBean = new LoginBean (); (поправьте меня, если я ошибаюсь здесь???)
  5. на мой взгляд, разделение ваших бобов похоже на разделение ваших методов. Вы не хотите 1 большой метод, который работает более 100 линий, а разделить его с новыми методами обработки их конкретных задач.
  6. помните, скорее всего, кто-то другой, чем вы должны будете работать на ваших проектах JSF, а также.


Что касается сцепления, я не вижу в этом проблемы проблема, чтобы разрешить вашим страницам JSF доступ к свойствам объектов в вашем backingbean. Это поддержка, которая встроена в JSF, и на самом деле просто облегчает чтение и создание imo. Ваш allready отделяет логику MVC строго. Делая это, вы экономите себе тонны линий с геттерами и сеттерами в вашем backingbean. Например, у меня есть действительно огромный объект, предоставленный мне веб-службами, где мне нужно использовать некоторые свойства в моей презентации. Если бы я должен был сделать геттер / сеттер для каждое свойство my bean будет расширяться по крайней мере еще 100 строк переменных и методов для получения свойств. Используя встроенную функциональность JSF, мое время и драгоценные строки кода экономятся.

только мои 2 цента относительно этого даже с вопросом, уже отмеченным как ответ.

Я бы не стал держать только один бэк-боб на странице. Это зависит от функциональности, но большую часть времени у меня был один боб на страницу, так как в основном одна страница обрабатывает одну функциональность. Например, на странице у меня есть ссылка register (я свяжусь с RegisterBean) и ссылка на корзину покупок (ShoopingBasketBean).

Я использую это <:> поскольку я обычно поддерживаю бобы как бобы действия, которые содержат объект данных. Я не хочу напишите оболочку в моем бэк-компоненте, чтобы получить доступ к свойствам моих объектов данных.

Мне нравится тестировать бизнес-код без представления, поэтому я рассматриваю BackingBeans как интерфейсы от представления к коду модели. Я никогда не ставил никаких правил или процессов в BackingBean. Этот код входит в службы или помощники, что позволяет использовать его повторно.

Если вы используете валидаторы, поместите их из вашего BackingBean и ссылайтесь на них из вашего метода проверки.

Если вы получаете доступ к DAOs для заполнения выбирает, Радио, флажки, делать это всегда из BackingBean.

поверьте мне!. Вы можно ввести JavaBean в BackingBean,но попробуйте ввести BackingBean в другой. Вы скоро будете в nigntmare обслуживания и понимания кода.