2012-03-28 2 views
3

데모 애플리케이션을 만들었습니다. JSF & EJB 3.0 (Stateless session bean 및 JPA)을 사용하여 데모 애플리케이션을 만들었고, 내 지속성 공급자는 Hibernate 4이고 데이터베이스는 Apache Derby입니다. JSF, EJB 3.0을 사용하는 애플리케이션을위한 디자인 패턴을 제안합니다.

코드를 따르십시오

, 은 JSF가 빈 StudentMgBean.java 관리

ManagedBean은이에 우리는 JPA의 통화를, 무 상태 세션 빈을 호출

, 즉 순차적 인 흐름은 다음과 같다

내 클래스의 흐름,

@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 stateless 세션 빈 StudentServiceBean.java의 StudentServiceBean에서

@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{ 
     ........ 
    } 

} 

, 내가 EntityManager를 주입, 그래서 내가 직접 세션 빈 작성 방법에 JPA 작업을한다.

가 아니, 난이 흐름에 어떤 디자인 패턴을 사용할 수 있습니다 내 질문에, 내가 EJB 3.0을 사용하고 같은 내가 ServiceLocator 패턴을 사용하지 않아도 별도의 DAO 층에 갈 수 있지만, 다른 패턴!보다 수 나는 JPA 호출로

한 가지 더, JSF에서 는 콩 나는 특성이 값 = {stMgBean.studentList처럼 EL에서 JSP의 componenets에 매핑되는 자사 게터의 setter 메소드를 가지고 관리를 bussiness 로직을 분리해서하는 데 사용 }

동일한 관리되는 bean에서 JSF의 액션 명령 호출에 의해 invocked 될 메소드가 있습니다. 이러한 메소드를 별도의 Managed Bean으로 작성해야합니까?

응답을 기다리는 JSF 2.0, EJB 3.0 및 JPA

이 프로젝트에 사용할 수있는 디자인 패턴을 제안하십시오

+0

여러 다른 지속성 공급자가없는 경우 DAO를 사용하지 마십시오. 이것은 아키텍처를 지나치게 복잡하게 만듭니다. –

+0

OK,하지만 클래스 플로우의 큰 세트는 큰 프로젝트를 위해 충분합니까? 아니면 getter와 setter에 매핑 된 속성에 대한 별도의 클래스, Bussiness 레이어의 클래스 계층 구조가되어야합니다. 나는 응답을 기다리는 EJB를 사용했다. –

+0

컨트롤러 내부에 로직없이 데이터를 전송하는 컨트롤러 (ui 로직을 실행하고 비즈니스 레이어를 호출)와 엔티티 (jpa @Entities)의 두 가지 유형의 관리 빈이 있어야한다. 비즈니스 계층에는 계층 구조가 필요하지 않습니다. 재사용 할 항목이 있으면 별도의 구성 요소로 이동하여 여러 위치에서 사용할 수 있습니다. –

답변

0

당신은 다음 개념을 사용하여 JSF 층을 분할 할 수 있습니다 :

  • Java 사이드와 뷰간에 공유 될 모든 데이터를 "모델"이라는 특정 관리 Bean에 넣으십시오. 이제 관리 빈의 나머지 영역과 독립적으로 데이터의 범위를 관리 할 수 ​​있습니다.
  • 명령 패턴 명령에 모델을 수정합니다 대의원 모든 작업을 사용합니다. 명령은 EJB 계층을 호출하거나 다음 계층으로 진행하지 않고 모델을 업데이트 할 수 있습니다.
  • 뷰에서 JSF 구성 요소를 초기화하거나 비헤이비어, 모델에 대한 참조 및 실행할 명령을 제공 할 위임자에 대한 참조를 관리하는 데 필요한 논리 만 관리 Bean에 보관하십시오.
관련 문제