1

使用 JSF 和 Spring 和 Hibernate 实现一个简单的登录屏幕。我在 Spring 中编写了服务和数据层 Bean,并将它们与 Hibernate 集成。

我在 JSF 中定义了一个注册(新用户创建)屏幕,其中包含两个字段用户 ID、密码,并将它们连接到一个托管 Bean。(Bean 名称:Users)这里这个 bean 也是域类。

现在单击 JSF 视图中的创建按钮,我需要调用 Service Bean 方法(它们是 spring bean)。为此,我看到我有两种方法可以做,

  1. 在用户托管 bean 中编写一个方法,该方法采用给定的用户、密码并调用 spring 服务 bean 方法,后者又调用 DAO bean 方法以将数据保存在 DB 中。但在这里我的问题是,在域类中编写控制器类型的方法在多大程度上是一种好习惯?

  2. 第二种方法是定义一个新的托管 Bean,它具有 Spring Service 对象作为属性(使用 spring+jsf 集成注入)和一个调用服务 bean 方法的方法。

我在做正确的设计吗?哪里不对了?请建议我更好的设计。

谢谢

4

1 回答 1

2

不要将您的域类设置为 jsf 托管 bean。

通常我遵循的是我将域类和其他支持 UI 的属性封装在一个表单 bean 中(当场景很复杂时,否则直接实体作为托管 bean 中的一个属性)并将它放在托管 bean 中。

Spring 服务被注入到托管 bean 中,并且在操作表单上 bean/entity bean 被传递给 spring 服务以进行业务/用例处理和持久性(dao/repository)。

模板代码:

@ManagedBean
public class Bean{

  private Entity entity;//or
  private FormBean formBean;

  @Inject private Service service;

  public String doAction(){
    //error processing from service layer and UI message handling
    service.process(entity);//or
    service.process(formBean);
    return Navigation.Constant;
  }
}  

托管 bean 的目的应该是收集视图数据并将其传递给服务进行处理。如果您将域/实体类作为托管 bean,您将把它与不利于可重用性的 JSF 库耦合。根据设计原则 SRP(单一责任原则),类应该有一个责任,在这种情况下它会有更多的责任,因此如上所述不是好的做法。

你提到的第2点更好。

希望这可以帮助 !!!!

于 2012-03-30T05:51:37.387 回答