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

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

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

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

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

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

1 Ответ

0 голосов
/ 25 февраля 2011

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

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

...