Простой, но хороший шаблон для EJB
Что бы вы предложили в качестве хорошего и практичного, но простого шаблона для решения с:
- HTML + JSP (как представление / презентация)
- Сервлеты (контроллер, запрос, обработка сеанса)
- EJB (настойчивость, businesslogic)
- MySQL DB
И нужно ли использовать собственный слой DAO для сохранения? Я использую JPA для сохранения объектов в моей БД.
Должен ли я вывести бизнес-логику из моего EJB? Все онлайн-источники говорят мне разные вещи и смущают меня...
3 ответа
Я бы определенно поместил бизнес-логику в сессионные компоненты без состояния. Сессионные компоненты без сохранения состояния хороши тем, что они хорошо фиксируют границы транзакций. И это отделяет слой View от слоя постоянства.
Позаботьтесь о том, чтобы методы SSB соответствовали целям малого бизнеса, которых хочет достичь пользователь.
Другой момент заключается в том, что вы должны быть уверены, что возвращаемые вами данные содержат все данные в дереве объектов и что вы не полагаетесь на ленивую загрузку, чтобы получить остальное, потому что это вызывает всевозможные проблемы.
Держитесь подальше от Stateful Session Beans: это плохие новости и неработающая концепция в контексте веб-приложения.
Для длительной работы рассмотрите возможность использования управляемых сообщениями компонентов, которые вы запускаете, отправляя сообщение JMS. Это хороший способ сделать фоновую обработку, которая быстрее освобождает бизнес-логику, сокращает транзакции и быстрее возвращает управление конечному пользователю.
Что бы вы предложили в качестве хорошего и практичного, но простого шаблона для решения с JSP/Servlets + EJB + MySQL
Используйте инфраструктуру MVC по вашему выбору, Session Beans без сохранения состояния для бизнес-логики и управления транзакциями (предпочитайте локальные интерфейсы, если вам не нужно удаленное взаимодействие), Entities для персистентности.
Внедрите свои EJB-компоненты везде, где это возможно (если вы используете Java EE 6, это означает где угодно, и вы также можете пропустить интерфейс).
И нужно ли использовать собственный слой DAO для сохранения? Я использую JPA для сохранения объектов в моей БД.
Некоторые могут сказать да, я говорю нет в большинстве случаев. EntityManager
уже реализует шаблон хранилища доменов, нет необходимости защищать его за DAO для простых нужд.
Возможно, вы захотите прочитать следующие ресурсы для получения дополнительных мнений по этому вопросу:
- JPA убил DAO?,
- JPA / EJB3 убили DAO,
- и более поздние DAO не мертвы - но они либо рухнули, либо исчезли
Должен ли я вывести бизнес-логику из моего EJB?
Я бы не стал. Поместите свою бизнес-логику в свои (не имеющие состояния) сессионные компоненты. EJB3 - это POJO, они легко тестируемы, нет необходимости делегировать бизнес-логику другому уровню.
Anno 2012 Я бы не рекомендовал использовать Servlets и JSP в качестве уровня презентации. Это было в моде в 2002 году, но это было десять лет назад.
Сегодня Java EE имеет отличную сборку инфраструктуры MVC под названием JSF. Вам гораздо лучше использовать это вместо этого. Скорее всего, вы захотите получить некоторые виджеты из библиотеки компонентов PrimeFaces, так как все стандартные являются базовыми. Также полезна библиотека утилит, такая как OmniFaces.
Что касается DAOs; не заходите так далеко, как напрямую используя сущностный менеджер в (JSF) компонентах поддержки, но если вы уже используете классы Service (транзакционные границы) для своей бизнес-логики, использование DAO также может оказаться излишним.
Есть все еще некоторые небольшие преимущества DAO, такие как dao.findByName(...) выглядит немного яснее, чем загрузка именованного запроса, установка параметра и получение (одиночного) результата, но цена заключается в том, что вам придется поддерживать отдельный DAO для каждого субъекта, возможно, в дополнение к какой-либо службе.