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 -> Cosa fare -> Come arrivare -> Dove andare
Quindi, nel primo livello (la vista) ho qualcosa di simile:
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. Richiede un servizio (per gestire i corsi) un corso specifico. Tale servizio può fare molte più cose, come report, serache e così via. Il risultato è sempre un elenco o un oggetto specifico (come nell'esempio). I servizi sono la vera macchina, applicano le regole e accedono al repository (per gestire i dati).
Quindi, se inserisco i miei servizi, repository e DAOS in librerie diverse, posso usarlo anche in un programma basato su testo o in un sistema desktop basato su Windows senza cambiare 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 portarli. Il repository "compone" i dati grezzi in oggetti buisines in modo che il servizio possa funzionare.
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. È possibile modificare i Servizi se si desidera modificare la logica, ma ciò non deve interferire con i livelli sopra o sotto.
E puoi cambiare qualsiasi cosa in vista, anche la tecnologia (web, desktop, testo) ma ciò non implica in contatto nulla di seguito.
La logica aziendale è il servizio. Ma come interagire con questo è vedere. Quale pulsante mostrare ora? L'utente può vedere questo link? Pensi che il tuo sistema sia un programma basato su console: devi negare se l'utente sbagliato sceglie #> myprogram -CourseService -option=getCourse -idCourse=234
o fermalo per premere i tasti per scrivere questo comando?
Parlando in sistemi basati sul web (Struts + JavaEE) ho un pacchetto controller GUI separato. Nella vista Azione do l'utente registrato e la classe mi dà 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;
Ricordati di tenerlo fuori dai servizi. Questa è roba VISUALIZZA. Tienilo nelle azioni Struts. Qualsiasi interazione di interfaccia deve essere completamente separata dal vero codice aziendale, quindi se porti il tuo sistema, sarà facile tagliare ciò che non ti servirà più.