建议一种设计模式用于使用JSF和EJB 3.0的应用程序。

3
我已经创建了一个演示应用程序,使用JSF和EJB 3.0(无状态会话Bean和JPA),我的持久性提供者是Hibernate 4,数据库是Apache Derby。
我的类流即顺序流如下所示,
ManagedBean调用无状态Session Bean,在其中我们有一个JPA调用,
请遵循以下代码, JSF管理的bean StudentMgBean.java,
@ManagedBean(name="stMgBean")
@ViewScoped
public class StudentMgBean implements Serializable{
     private static final long serialVersionUID = 109117543434170143L;
     ...........
     @EJB
     private StudentService studentService; 
     .........
     @PostConstruct
     public void init(){
      ..........
      ........
           this.totalStudentInDB = studentService.getMaxStudent();
     }
}

我的EJB接口StudentService.java,

@Local
public interface StudentService {
    List<StudentVO> fetchStudentListOrderByStudentId(boolean flag);

    List<StudentVO> fetchStudentListOrderByStudentName(boolean flag);

    void saveStudentEntity(StudentEntity studentEntity,Integer deptId) throws Exception;

    List<DeptEntity> fetchAllDept();

    List<StudentVO> fetchStudentByDept(Integer deptId);

    void saveAllStudents(List<StudentVO> students) throws Exception;

    void deleteAllStudents(List<StudentVO> students) throws Exception;

    List<StudentVO> fetchStudentListPerPage(Integer minRow,Integer maxRow) throws Exception;

    Integer getMaxStudent() throws Exception;
}

我是一个 EJB 无状态会话 Bean,名为 StudentServiceBean.java。

@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
public class StudentServiceBean implements StudentService{
    @PersistenceContext(unitName="forPractise")
    private EntityManager entityMgr;

    @Resource
    private SessionContext sessionContext;

    @EJB
    private DeptService deptService;

    @Override
    public List<StudentVO> fetchStudentListOrderByStudentId(boolean flag){
        .........
    }

    @Override
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void saveStudentEntity(StudentEntity studentEntity,Integer deptId) throws Exception{
        ........
    }

}

在StudentServiceBean中,我注入了EntityManager,所以我直接在这个session bean中的方法中进行JPA操作。
现在我的问题是,我能否在这个流程中使用任何设计模式?我可以采用单独的DAO层吗? 由于我正在使用EJB 3.0,所以不必使用ServiceLocator模式,但是除此之外,我还能使用其他模式来将业务逻辑与JPA调用分离吗?
还有一件事, 在JSF托管的Bean中,我有属性和它的getter/setter方法,它们被映射到EL中的JSP组件,如下所示 value={stMgBean.studentList}
但是在同一个托管bean中,我也有一个将通过JSF的action command调用的方法, 这些方法应该写在单独的托管bean中吗?
请建议一个可用于具有JSF 2.0、EJB 3.0和JPA的项目的设计模式。
等待回复。

如果您没有多个不同的持久性提供程序,请不要使用DAO,这将使架构过于复杂。 - Adrian Mitev
好的,但是我的类集流程对于一个大项目来说是否足够,或者我应该将托管bean拆分为两个,一个用于操作命令方法,另一个用于getter和setter映射属性的单独类?在我使用EJB的业务层中应该是什么类层次结构?等待回复。 - Rahul Shivsharan
你应该有两种类型的托管bean - 控制器(执行UI逻辑并调用业务层)和实体(JPA @Entities),它们只是传输数据而没有内部逻辑。在业务层中不需要层次结构 - 如果您有要重用的内容,请将其移动到单独的组件中,并在多个位置使用它。 - Adrian Mitev
1个回答

0
您可以使用以下概念拆分JSF层:
  • 将所有 Java 端和视图之间共享的数据放入称为“模型”的特定托管 bean 中。现在,您可以独立地管理数据范围,而不受其余托管 bean 范围的影响。
  • 使用命令模式将修改模型的所有操作委托给命令。命令可能调用 EJB 层,或者只是更新模型而不进入下一层。
  • 在托管 bean 中保留您需要初始化视图中的 JSF 组件或管理其行为的逻辑、对模型的引用以及提供要运行的命令的委托方的引用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接