我使用 JSF 和 EJB 3.0(无状态 session bean 和 JPA)创建了一个演示应用程序,我的持久性提供程序是 Hibernate 4,数据库是 Apache Derby。
我的类(class)流程即顺序流程如下,
ManagedBean 调用 Stateless 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 接口(interface) 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 无状态 session 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中注入(inject)了EntityManager,所以直接在这个session bean中写的方法中进行JPA操作。
不,我的问题是我可以在此流程中使用任何设计模式吗,我可以使用单独的 DAO 层吗? 因为我使用的是 EJB 3.0,所以我不必使用 ServiceLocator 模式,但是我可以使用任何其他模式来将业务逻辑与 JPA 调用分开,
还有一点, 在 JSF 托管 Bean 中,我有属性及其 getter setter 方法,它们像这样映射到 EL 中的 JSP 组件 值={stMgBean.studentList}
但在同一个托管 bean 中,我也有将由来自 JSF 的操作命令调用调用的方法, 这些方法应该写在单独的托管 bean 中吗?
请建议一个可用于具有 JSF 2.0、EJB 3.0 和 JPA 的项目的设计模式
等待回复
最佳答案
您可以使用以下概念拆分 JSF 层:
- 将所有将在 Java 端和 View 之间共享的数据放入称为“模型”的特定托管 bean 中。现在,您可以独立于其余托管 bean 的范围来管理数据范围。
- 使用命令模式,将修改模型的所有操作委托(delegate)给命令。这些命令可能会调用 EJB 层,或者只是更新模型而不进入下一层。
- 在托管 bean 中只保留在 View 中初始化 JSF 组件或管理它们的行为所需的逻辑、对模型的引用以及对将提供运行命令的委托(delegate)者的引用。
关于java - 建议使用 JSF 、 EJB 3.0 的应用程序设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9902093/