Lavoro in questo modo (Struts2 + Hibernate):
My Struts Actions è responsabile solo per mostrare le informazioni sul browser web. Non pensare.
Utente - > Azione - > Servizio - > Repository - > Accesso ai dati
o
Voglio vedere - > Come vedere - > Che cosa fare - > Come ottenere - > Dove ottenere
Quindi, nel primo livello (la vista) ho qualcosa del tipo:
public String execute () {
try {
CourseService cs = new CourseService();
Course course = cs.getCourse(idCourse);
} catch (NotFoundException e) {
setMessageText("Course not found.");
} catch (Exception e) {
}
return "ok";
}
Come vedi, la mia "vista" non pensa. Sta chiedendo un servizio (per gestire i corsi) un corso specifico. Quel servizio può fare molte altre cose, come report, seraches e così via. Il risultato è sempre un elenco o un oggetto specifico (come nell'esempio).
I servizi sono la macchina reale, applicano le regole e accedono al repository (per gestire i dati).
Quindi, se metto i miei servizi, i miei repository e DAOS in diverse librerie, posso usarlo anche in un programma basato su testo o in un sistema desktop basato su Windows senza modificare nulla.
Il servizio sa cosa fare, ma non sa come mostrare.
La vista sa come mostrare, ma non sa cosa fare.
Lo stesso con Service / Repository: il servizio invia e richiede i dati, ma non sa dove sono i dati e come prenderli. Il repository "compone" i dati grezzi per creare oggetti con cui il Servizio può lavorare.
Ma il repository non sa nulla del database. Il tipo di database (MySQL, PostgreSQL, ...) riguarda DAO.
È possibile modificare il DAO se si desidera modificare il database e non deve influire sui livelli superiori.
È possibile modificare il repository se si desidera aggiornare la gestione dei dati, ma ciò non deve influire sul DAO e sui livelli superiori.
Puoi cambiare i Servizi se vuoi cambiare la tua logica, ma questo non deve rovinare i livelli sopra o sotto.
E puoi cambiare qualsiasi cosa in vista, anche la tecnologia (web, desktop, testo), ma questo non deve implicare nulla di sotto.
La logica aziendale è Servizio.
Ma come interagire con questo è vedere. Quale pulsante mostrare ora? L'utente può vedere questo link?
Pensa che il tuo sistema sia un programma basato su console: devi negare se l'utente sbagliato sceglie #> myprogram -CourseService -option=getCourse -idCourse=234
o gli impedisci di premere i tasti per scrivere questo comando?
Parlando nei sistemi basati sul web (Struts + JavaEE) Ho un pacchetto di controller GUI separato. In vista Azione, fornisco all'utente registrato e la classe mi fornisce i pulsanti (o qualsiasi elemento dell'interfaccia che desidero).
<div id="userDetailSubBox">
<c:forEach var="actionButton" items="${actionButtons}" varStatus="id">
${actionButton.buttonCode}
</c:forEach>
</div>
E
private List<ActionButton> actionButtons;
Ricorda di tenerlo fuori dai servizi. Questa è la roba di VIEW. Tenerlo nelle azioni Struts. Qualsiasi interazione dell'interfaccia deve essere completamente separata dal codice aziendale reale, quindi se porti il tuo sistema, sarà facile tagliare ciò di cui non avrai più bisogno.