java - 建议使用 JSF 、 EJB 3.0 的应用程序设计模式

标签 java jsf jpa ejb ejb-3.0

我使用 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/

相关文章:

java - 为什么使用 JUnit 5 运行此 Spring Data JPA Repository 测试会导致 ParameterResolutionException?

java - 返回到在 jsf 中销毁的 session 的欢迎页面

css - 对齐位于另一个 PanelGrid 中的 PanelGrid

java - Spring Boot 数据存储库上的复合主外键

java - 如何使数据库更改导致 Web 客户端 View 的更新

java - 如何将数据与业务逻辑解耦

java - Spring Data JPA findAllBy ... in ... orderBy 输入列表

validation - 在客户端中删除输入时跳过验证器 - 这是否符合 JSF 规范?

mysql - 手动删除表后,Eclipselink 无法在 MySQL 数据库中创建表

java - 在 AWT Canvas 上绘制图像