繁体   English   中英

使用JSF,EJB 3.0为应用程序建议设计模式

[英]Suggest a design pattern for application using JSF , EJB 3.0

我创建了一个演示应用程序使用JSF和EJB 3.0(无状态会话bean和JPA),我的持久性提供程序是Hibernate 4,数据库是Apache Derby。

我的班级流程即顺序流程如下,

ManagedBean调用无状态会话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,因此我直接在此会话bean中编写的方法中执行JPA操作。

没有我的问题是我可以在此流程中使用任何设计模式,我可以选择单独的DAO层,因为我使用EJB 3.0我不必使用ServiceLocator模式,但是我可以使用任何其他模式来分离Bussiness JPA调用的逻辑,

还有一件事,在JSF托管Bean中,我有属性及其getter setter方法,这些方法映射到EL中的JSP组件,如此值= {stMgBean.studentList}

但是在同一个托管bean中,我还有一些方法可以通过JSF的动作命令调用来调用,如果这些方法是在单独的Managed bean中编写的?

请建议一个可用于具有JSF 2.0,EJB 3.0和JPA的项目的设计模式

等待回复

您可以使用以下概念拆分JSF层:

  • 将所有将在java端和视图之间共享的数据放入名为“Models”的特定托管bean中。 现在,您可以独立于其他托管bean的范围来管理数据的范围。
  • 使用命令模式将委托将修改模型的所有操作委托给命令。 这些命令可以调用EJB层,或者只是更新模型而无需转到下一层。
  • 在托管bean中保留初始化视图中的JSF组件或管理其行为所需的逻辑,对模型的引用以及对将提供运行命令的委托者的引用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM