Je travaille de cette façon (Struts2 + Hibernate):
My Struts Actions est uniquement responsable de l'affichage des informations sur le navigateur Web. Ne pas penser.
Utilisateur -> Action -> Service -> Référentiel -> Accès aux données
Ou:
Je veux voir -> Comment voir -> Que faire -> Comment obtenir -> Où trouver
Donc, dans la première couche (la vue), j'ai quelque chose comme:
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";
}
Comme vous le voyez, mon "point de vue" ne pense pas. C'est demander un service (pour gérer des cours) un cours spécifique. Ce service peut faire beaucoup plus de choses, comme des rapports, des seraches, etc. Le résultat est toujours une liste ou un objet spécifique (comme l'exemple). Les services sont la vraie machine, appliquent des règles et accèdent au référentiel (pour gérer les données).
Donc, si je place mes services, référentiels et DAOS dans différentes bibliothèques, je peux les utiliser même dans un programme texte ou un système de bureau Windows sans rien changer.
Le service sait quoi faire, mais ne sait pas montrer. La vue sait montrer, mais ne sait pas quoi faire. La même chose avec Service / Repository: Le service envoie et demande les données, mais ne sait pas où se trouvent les données et comment les prendre. Le référentiel "compose" les données brutes des objets de cuisine afin que le Service puisse travailler avec.
Mais le référentiel ne sait rien de la base de données. Le type de base de données (MySQL, PostgreSQL, ...) concerne DAO.
Vous pouvez modifier le DAO si vous souhaitez modifier la base de données et cela ne doit pas affecter les couches supérieures. Vous pouvez modifier le référentiel si vous souhaitez mettre à jour votre gestion des données, mais cela ne doit pas affecter le DAO et les couches supérieures. Vous pouvez changer les Services si vous voulez changer votre logique, mais cela ne doit pas gâcher les couches au-dessus ou en dessous.
Et vous pouvez changer quoi que ce soit en vue, même la technologie (web, bureau, texte) mais cela ne doit pas impliquer de toucher quoi que ce soit ci-dessous.
La logique métier est le service. Mais comment interagir avec cela, c'est voir. Quel bouton afficher maintenant? L'utilisateur peut-il voir ce lien? Vous pensez que votre système est un programme basé sur une console: vous devez refuser si le mauvais utilisateur choisit #> myprogram -CourseService -option=getCourse -idCourse=234
ou l'arrête d'appuyer sur les touches pour écrire cette commande?
Parler dans des systèmes basés sur le Web (Struts + JavaEE) J'ai un package de contrôleur GUI séparé. En vue Action, je donne à l'utilisateur connecté et la classe me donne les boutons (ou tout élément d'interface que je veux).
<div id="userDetailSubBox">
<c:forEach var="actionButton" items="${actionButtons}" varStatus="id">
${actionButton.buttonCode}
</c:forEach>
</div>
Et
private List<ActionButton> actionButtons;
N'oubliez pas de garder cela hors des services. Ce sont des trucs VIEW. Gardez-le dans les actions Struts. Toutes les interactions d'interface doivent être entièrement séparées du vrai code d'entreprise, donc si vous portez votre système, il sera facile de couper ce dont vous n'aurez plus besoin.