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
Verwenden Sie keine DAOs, wenn Sie nicht mehrere verschiedene Persistenzanbieter haben. Dies wird die Architektur überkompensieren. –
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 –
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 –