gpt4 book ai didi

JSF Controller 、服务和 DAO

转载 作者:行者123 更新时间:2023-12-03 08:34:23 25 4
gpt4 key购买 nike

我正在尝试习惯 JSF 在访问数据方面的工作方式(来自 Spring 背景)

我正在创建一个维护用户列表的简单示例,我有类似的东西

<h:dataTable value="#{userListController.userList}" var="u">
<h:column>#{u.userId}</h:column>
<h:column>#{u.userName}</h:column>
</h:dataTable>

然后“ Controller ”有类似的东西
@Named(value = "userListController")
@SessionScoped
public class UserListController {
@EJB
private UserListService userListService;

private List<User> userList;

public List<User> getUserList() {
userList = userListService.getUsers();
return userList;
}
}

而“服务”(虽然它看起来更像是一个 DAO)有
public class UserListService {

@PersistenceContext
private EntityManager em;

public List<User> getUsers() {
Query query = em.createQuery("SELECT u from User as u");
return query.getResultList();
}
}

这是正确的做事方式吗?我的术语对吗? “服务”感觉更像是一个 DAO? Controller 感觉它正在做一些服务的工作。

最佳答案

Is this the correct way of doing things?


除了在托管 bean getter 方法中以低效的方式执行业务逻辑以及使用过于广泛的托管 bean 范围之外,它看起来还不错。如果将服务调用从 getter 方法移到 @PostConstruct方法并使用 @RequestScoped@ViewScoped而不是 @SessionScoped ,会更好看。
也可以看看:
  • Why JSF calls getters multiple times
  • How to choose the right bean scope?

  • Is my terminology right?


    没关系。只要您与它保持一致并且代码以合理的方式可读。只有你命名类和变量的方式有点尴尬(不合逻辑和/或重复)。例如,我个人会使用 users而不是 userList , 并使用 var="user"而不是 var="u" , 并使用 idname而不是 userIduserName .此外,“UserListService”听起来只能处理用户列表,而不是一般用户。我宁愿使用“UserService”,这样你也可以用它来创建、更新和删除用户。
    也可以看看:
  • JSF managed bean naming conventions

  • The "service" feels more like a DAO?


    它不完全是一个 DAO。基本上,JPA 是这里真正的 DAO。以前,当 JPA 不存在时,每个人都自己开发 DAO 接口(interface),以便服务方法即使在底层实现(“plain old” JDBC,或“good old” Hibernate 等)发生变化时也可以继续使用它们。服务方法的真正任务是透明地管理事务。这不是 DAO 的责任。
    也可以看看:
  • I found JPA, or alike, don't encourage DAO pattern
  • DAO and JDBC relation?
  • When is it necessary or convenient to use Spring or EJB3 or all of them together?

  • And the controller feels like it's doing some of the job of the service.


    我可以想象它在这个相对简单的设置中做到了这一点。但是, Controller 实际上是前端的一部分,而不是后端。该服务是后端的一部分,其设计方式应使其可在所有不同的前端重用,例如 JSF、JAX-RS、“普通”JSP+Servlet,甚至 Swing 等。此外,前端特定的 Controller (也称为“backing bean”或“presenter”)允许您以特定于前端的方式处理成功和/或异常结果,例如在 JSF 的情况下,在服务抛出异常的情况下显示面部消息。
    也可以看看:
  • JSF Service Layer
  • What components are MVC in JSF MVC framework?

  • 总而言之,正确的方法如下:
    <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 .
    也可以看看:
  • Creating master-detail pages for entities, how to link them and which bean scope to choose
  • Passing a JSF2 managed pojo bean into EJB or putting what is required into a transfer object
  • Filter do not initialize EntityManager
  • javax.persistence.TransactionRequiredException in small facelet application
  • 关于JSF Controller 、服务和 DAO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30639785/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com