Решение архитектуры и технологий приложения JSF [дубликат]

Если вы хотите прочитать обе строки и ints, решение должно использовать два сканера:

Scanner stringScanner = new Scanner(System.in);
Scanner intScanner = new Scanner(System.in);

intScanner.nextInt();
String s = stringScanner.nextLine(); // unaffected by previous nextInt()
System.out.println(s);

intScanner.close();
stringScanner.close();
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 28 August 2018 в 10:29
поделиться

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

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

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

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

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

5
ответ дан Community 28 August 2018 в 10:29
поделиться
Другие вопросы по тегам:

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