2012-03-28 3 views
3

Ich habe eine Demo-Anwendung mit JSF & EJB 3.0 (Stateless Session Bean und JPA) erstellt, ist meine Persistenz Provider Hibernate 4, und die Datenbank ist Apache Derby.Schlagen Sie ein Design-Muster für die Anwendung mit JSF, EJB 3.0

Meine Klasse Strömung dh sequentiellen Ablauf wird wie folgt,

ManagedBean ruft Stateless Session Bean, in dieser wir ein JPA Anrufe haben,

bitte den Code, die JSF Managed Bean StudentMgBean.java folgen,

@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(); 
    } 
} 

Meine EJB-Schnittstelle 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; 
} 

Meine EJB Stateless 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{ 
     ........ 
    } 

} 

Im StudentServiceBean, ich habe EntityManager injiziert, so dass ich direkt in den Verfahren in dieser Session Bean geschrieben JPA Operation tun.

Nein, meine Frage ist, kann ich jedes Design-Muster in diesem Fluss zu verwenden, kann ich für eine separate DAO Schicht gehen, als i 3.0 i nicht Servicelocator Muster sind mit EJB müssen verwenden, aber als jedes anderes Muster kann ich benutze Bussiness-Logik mit der PPV Anruf zu trennen,

Eine weitere Sache, in JSF Managed Bean ich habe Eigenschaften und seine Getter Setter-Methoden, die auf die JSP componenets in EL wie dieser Wert = {stMgBean.studentList abgebildet werden }

aber in der gleichen verwalteten Bean habe ich auch Methode, die durch Aktion Befehl Aufruf von JSF,invocked werdensollte diese Methode in die separate Managed Bean geschrieben werden?

Bitte legen nahe, ein Design-Muster, das für Projekte verwendet werden, die JSF haben 2.0, EJB 3.0 und JPA

für die Antwort warten

+0

Verwenden Sie keine DAOs, wenn Sie nicht mehrere verschiedene Persistenzanbieter haben. Dies wird die Architektur überkompensieren. –

+0

OK, aber ist mein Klassenfluss für ein großes Projekt ausreichend, oder sollte ich mani in zwei für Aktionsbefehlsmethoden und separate Klasse für Getter- und Setter-Eigenschaften aufteilen, was sollte die Klassenhierarchie in Bussiness-Layer sein? Ich habe EJBs verwendet und auf die Antwort gewartet –

+0

Sie sollten 2 Arten von verwalteten Beans haben - Controller (führen Sie ui Logik und Anruf Business-Schicht) und Entitäten (jpa @Entities), die nur die Daten ohne jede Logik innerhalb zu transportieren. In der Business-Schicht sind keine Hierarchien erforderlich. Wenn Sie etwas wiederverwenden möchten, verschieben Sie es in einer separaten Komponente und verwenden Sie es an mehreren Stellen –

Antwort

0

Sie können die JSF-Schicht spalten die nächsten Konzepte mit:

  • Legen Sie alle Daten, die zwischen der Java-Seite und der Ansicht freigegeben werden, in bestimmte verwaltete Beans namens "Models". Jetzt können Sie den Umfang der Daten unabhängig vom Umfang der übrigen verwalteten Beans verwalten.
  • Verwenden Sie das Befehlsmuster, das alle Aktionen delegiert, die das Modell an die Befehle anpassen. Die Befehle können die EJB-Ebene aufrufen oder nur die Modelle aktualisieren, ohne zur nächsten Ebene zu wechseln.
  • Behalten Sie in den verwalteten Beans nur die Logik bei, die Sie zum Initialisieren der JSF-Komponenten in den Ansichten oder zum Verwalten ihres Verhaltens, einen Verweis auf das Modell und einen Verweis auf einen Delegator benötigen, der den auszuführenden Befehl bereitstellt.