集成JSF和spring

时间:2012-03-30 05:13:57

标签: jsf ooad

使用JSF和Spring以及Hibernate实现一个简单的登录屏幕。我在Spring编写了Service and Data Layer Beans,并将它们与Hibernate集成在一起。

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

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

  1. 在Users托管bean中编写一个方法,该方法接受给定的用户,密码并调用spring服务bean方法,后者又调用DAO bean方法在DB中保存数据。但在这里我的问题是在Domain类中编写控制器类方法是一种好的做法吗?

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

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

    由于

1 个答案:

答案 0 :(得分:2)

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

一般来说,我遵循的是在表单bean中封装域类和其他UI支持属性(当场景是复杂的,其他直接实体作为托管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点更好。

希望这有助于!!!!