使用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)。为此我发现我有两种方法可以做,
在Users托管bean中编写一个方法,该方法接受给定的用户,密码并调用spring服务bean方法,后者又调用DAO bean方法在DB中保存数据。但在这里我的问题是在Domain类中编写控制器类方法是一种好的做法吗?
第二种方法是定义一个新的Managed Bean,它将Spring Service对象作为属性(使用spring + jsf集成注入)和一个调用服务bean方法的方法。
我做的设计是否正确?哪里不对了?请建议我做一个更好的设计。
由于
答案 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点更好。
希望这有助于!!!!