我已经创建了一个演示应用程序,使用JSF和EJB 3.0(无状态会话Bean和JPA),我的持久性提供者是Hibernate 4,数据库是Apache Derby。
我的类流即顺序流如下所示,
ManagedBean调用无状态Session Bean,在其中我们有一个JPA调用,
请遵循以下代码, JSF管理的bean StudentMgBean.java,
在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的项目的设计模式。
等待回复。
我的类流即顺序流如下所示,
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的项目的设计模式。
等待回复。