Java EE: отделение логики представления от бизнес-логики с помощью bean-компонентов

Я разрабатывал свое первое приложение Java EE, в котором есть несколько классов сущностей JPA, каждый из которых имеет соответствующий класс EJB для работы с бизнес-логикой. Что я сделал, так это изменил один из этих bean-компонентов с Stateless на SessionScoped, поэтому я могу использовать его, чтобы позволить пользователю работать с рядом полей формы, все из которых отображаются в форме JSF.

Однако я начинаю думать, что это явно неправильно, так как я делаю такие вещи, как реализация таких методов, как "submitStep1" и "goBackToStep2" в моем EJB. Эти методы устанавливают индикаторы, которые используются элементами рендеринга различных тегов на странице JSF, поэтому они явно являются «логикой представления».

Мой вопрос в том, как мне реструктурировать мой код? Я думаю, что у меня должен быть только один компонент SessionScoped (или он должен иметь состояние?), который имеет дело с логикой представления моей страницы JSF и может использовать все остальные ejbs (и, соответственно, мои классы JPA). Этот bean-компонент будет находиться на уровне уровня представления моего приложения, что означает, что моему уровню бизнес-логики не потребуются никакие сеансовые Bean-компоненты с областью действия сеанса.

Теперь все это имеет смысл для меня, и это то, что я, вероятно, собираюсь сделать. Однако причина моего вопроса заключается в том, что на моих страницах JSF xhtml я часто использую теги JSF EL для ссылки на содержимое EJB. Есть ли какие-либо подводные камни, связанные с JPA, которых мне нужно остерегаться при написании классов уровня представления?

Я знаю, что мой вопрос довольно расплывчатый и не связан с конкретным примером. И хотя я довольно много узнал о bean-компонентах Stateful v Stateless на этом и других сайтах, я просто хочу знать, что предполагаемая структура является лучшей.


person JohnHailey    schedule 24.02.2011    source источник
comment
Возможный дубликат JSF Controller, Service и DAO   -  person Kukeltje    schedule 10.07.2017


Ответы (1)


Почему бы вам не использовать bean-компоненты поддержки для целей презентации, поскольку они предназначены для этого, и вы можете легко настроить его область действия и оставить EJB для бизнес-уровня?

При использовании сущностей непосредственно на уровне представления вы должны знать об области транзакции, особенно в отношении ленивых отношений. То есть обычно используется одна транзакция на запрос, что будет означать, что среди разных запросов объекты будут отсоединены, поэтому вам нужно будет повторно их прикрепить, чтобы иметь возможность загружать ленивые отношения. Вы можете использовать фильтр, который делает это автоматически при каждом запросе или обрабатывает его вручную. Вы также можете сохранить одну и ту же транзакцию во время разных запросов, но длинная транзакция обычно не является хорошей идеей, особенно если во время этой транзакции в БД происходят обновления/создания.

person Pau    schedule 25.02.2011
comment
Спасибо за ответ. Да, я понимаю, что вы имеете в виду по поводу объема транзакции. Как бы то ни было, мне удалось переместить логику представления в вспомогательный компонент, а EJB теперь имеют дело только с бизнес-уровнем. В целом, это был довольно хороший опыт разработки моего первого приложения Java EE. - person JohnHailey; 28.03.2011