【问题标题】:Integrating JSF and spring集成 JSF 和 Spring
【发布时间】:2012-03-30 05:13:56
【问题描述】:

使用 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方法的方法。

    李>

我的设计是否正确?哪里不对了?请建议我更好的设计。

谢谢

【问题讨论】:

    标签: jsf ooad


    【解决方案1】:

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

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

    Spring 服务被注入到托管 bean 中,并且在操作表单上 bean/实体 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点更好。

    希望这会有所帮助!!!!

    【讨论】:

      猜你喜欢
      • 2018-11-11
      • 1970-01-01
      • 1970-01-01
      • 2012-07-21
      • 2015-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-21
      相关资源
      最近更新 更多