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 ответов:
вы можете проверить это:проведение различий между различными видами управляемых компонентов 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, я бы счел это плохой практикой, чтобы поместить каждый кусок кода в один боб, потому что:
- боб в конце концов станет очень большим
- его легче для других людей, чтобы найти то, что они ищут, если они устраняют неполадки на странице входа, если они затем могут легко просто посмотреть loginBean.Java-файл.
- иногда у вас есть небольшие функциональные возможности, которые четко отличаются от остальной части вашего кода, отделяя это, я бы предположил, что вам будет легче переделать/расширить этот код в нечто большее, когда у вас уже есть хороший боб с хорошей структурой.
- наличие 1 большого Боба, чтобы сделать все это, сделает его более зависимым от памяти, если/когда вам нужно сделать объявления, подобные этому MyBigBean bigBean = new MyBigBean (); вместо использования funksjonality вам действительно нужно, делая LoginBean loginBean = new LoginBean (); (поправьте меня, если я ошибаюсь здесь???)
- на мой взгляд, разделение ваших бобов похоже на разделение ваших методов. Вы не хотите 1 большой метод, который работает более 100 линий, а разделить его с новыми методами обработки их конкретных задач.
- помните, скорее всего, кто-то другой, чем вы должны будете работать на ваших проектах 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 обслуживания и понимания кода.