Разделение проблем JSF ManagedBeans и EntityBeans [duplicate]

class Foo(object):
     bar = 1
     def bah(self):
         print Foo.bar

f = Foo() 
f.bah()
26
задан BalusC 4 June 2015 в 10:31
поделиться

2 ответа

Правильно ли это делается?

Помимо выполнения бизнес-логики неэффективный способ в методе управляемых компонентов боба и использование слишком широкая область управления, она выглядит нормально. Если вы переместите вызов службы из метода getter в метод @PostConstruct и используйте @RequestScoped или @ViewScoped вместо @SessionScoped, он будет выглядеть лучше.

См. Также:


Правильно ли моя терминология?

Все в порядке. Пока вы согласны с этим, и код читается разумным образом. Только ваш способ именования классов и переменных несколько неудобен (нелогично и / или дублирование). Например, я лично использовал бы users вместо userList и использовал var="user" вместо var="u" и использовал id и name вместо userId и userName. Кроме того, «UserListService» звучит так, что он может обрабатывать только списки пользователей, а не пользователей в целом. Я бы предпочел использовать «UserService», чтобы вы могли также использовать его для создания, обновления и удаления пользователей.

См. Также:


«Служба» больше похожа на DAO?

It не является точно DAO. В принципе, JPA является настоящим DAO здесь. Раньше, когда JPA не существовало, все домашние интерфейсы DAO, так что методы обслуживания могут продолжать использовать их, даже когда базовая реализация («простой старый» JDBC или «старый добрый» Hibernate и т. Д.) Изменяется. Реальная задача метода сервиса - прозрачное управление транзакциями. Это не является обязанностью DAO.

См. Также:


И контроллер чувствует, что выполняет некоторую работу службы.

Я могу представить, что он делает это в этой относительно простой установке. Однако контроллер фактически является частью интерфейса, а не бэкэнд. Служба является частью бэкэнд, которая должна быть сконструирована таким образом, что она может использоваться повторно во всех разных интерфейсах, таких как JSF, JAX-RS, «простой» JSP + Servlet, даже Swing и т. Д. Кроме того, контроллер, специфичный для интерфейса (например, также называемый «поддерживающим bean-компонентом» или «презентатором») позволяет вам иметь дело с конкретным интерфейсом с успехом и / или исключительными результатами, например, в случае JSF, отображающем сообщение лиц в случае исключения, вызванного службой.

См. также:


В общем, правильный подход будет следующим:

<h:dataTable value="#{userBacking.users}" var="user">
    <h:column>#{user.id}</h:column>
    <h:column>#{user.name}</h:column>
</h:dataTable>
@Named
@RequestScoped // Use @ViewScoped once you bring in ajax (e.g. CRUD)
public class UserBacking {

    private List<User> users;

    @EJB
    private UserService userService;

    @PostConstruct
    public void init() {
        users = userService.listAll();
    }

    public List<User> getUsers() {
        return users;
    }

}
@Stateless
public class UserService {

    @PersistenceContext
    private EntityManager em;

    public List<User> listAll() {
        return em.createQuery("SELECT u FROM User u", User.class).getResultList();
    }

}

Вы можете найти здесь настоящий мир здесь используется каноническая практика Java EE / JSF / CDI / EJB / JPA: Java EE kickoff app .

См. также:

54
ответ дан BalusC 22 August 2018 в 15:33
поделиться
  • 1
    « JPA является настоящим DAO здесь ». дает моему мозгу глубокое влияние, чтобы понять это утверждение. :) Является ли это чем-то, что обеспечивает абстракцию некоторого механизма сохранения, например БД, и позволяет извлекать и сохранять объекты домена в БД и из него, не подвергая внутренние детали базовой БД, как говорят, ДАО? Это несколько запутывает по сравнению с более старыми вопросами / ответами / блогами / учебниками / статьями в другом месте. – Tiny 28 June 2015 в 12:01
  • 2
    @Tiny: возможно, этот ответ полезен для понимания первоначального намерения по шаблону DAO: stackoverflow.com/questions/7070467/dao-and-jdbc-relation – BalusC 28 June 2015 в 12:06
  • 3
    @BalusC Почему Session Scope слишком широк? Используя область просмотра, список нужно будет создавать каждый раз, когда пользователь загружает страницу, не так ли? Разве это не так? Или это то, что мы просто предпочитаем это, больше, чем сохранение боба для всей сессии и потребления памяти? – LyK 10 September 2015 в 08:32
  • 4
    @LyK: нажмите & quot; Как выбрать правильную область бобов? & Quot; для объяснения. – BalusC 10 September 2015 в 08:51
  • 5
    @LyK: вы не должны кэшировать результаты DB во всех сеансах в интерфейсе. Вы должны кэшировать их в одном месте в бэкэнд. JPA предлагает возможность кэширования второго уровня. Дополнительное преимущество, он точно знает, когда нужно аннулировать кэшированный объект. – BalusC 10 September 2015 в 09:00

Это дао, ну и фактически репозиторий , но не слишком беспокоиться об этой разнице, поскольку он обращается к базе данных, используя контекст persistence.

Вы должны создайте класс обслуживания, который обертывает этот метод и где вызывается транзакция.

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

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

Это добавляет дополнительный уровень абстракции, делая будущий рефакторинг более гибким.

5
ответ дан Community 22 August 2018 в 15:33
поделиться
  • 1
    спасибо, я, наверное, просто добавлю этот дополнительный слой. С точки зрения JSF делает то, что я делаю, выглядит как правильный путь? – PDStat 4 June 2015 в 09:26
  • 2
    Выглядит хорошо, это должно быть сеансовое - использование сеансов делает кластеризацию несколько более сложной (но также широко используемой). Не используется сам jsf, я предпочитаю anglular, vanilla html и rest api. – NimChimpsky 4 June 2015 в 09:28
  • 3
    Я добавлю некоторые страницы результатов, говоря такие вещи, как «user x added» или «user x removed», поэтому я предполагаю, что на самом деле не совсем уверен, что просто играю. – PDStat 4 June 2015 в 09:31
Другие вопросы по тегам:

Похожие вопросы: