Trabajo de esta manera (Struts2 + Hibernate):
My Struts Actions solo es responsable de mostrar información en el navegador web. Sin pensar.
Usuario -> Acción -> Servicio -> Repositorio -> Acceso a datos
O:
Quiero ver -> Cómo ver -> Qué hacer -> Cómo llegar -> Dónde obtener
Entonces, en la primera capa (la vista) tengo algo como:
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";
}
Como puede ver, mi "vista" no piensa. Es pedir un servicio (para administrar cursos), un curso específico. Ese servicio puede hacer muchas cosas más, como informes, seraches, etc. Los resultados son siempre una lista o un objeto específico (como el ejemplo). Los servicios son la máquina real, aplican reglas y acceden al Repositorio (para administrar los datos).
Entonces, si pongo mis Servicios, Repositorios y DAOS en diferentes bibliotecas, puedo usarlo incluso en un programa basado en texto o en un sistema de escritorio basado en Windows sin cambiar nada.
El servicio sabe qué hacer, pero no sabe cómo mostrar. La vista sabe cómo mostrar, pero no sabe qué hacer. Lo mismo con el Servicio / Repositorio: El servicio envía y solicita los datos, pero no sabe dónde están los datos y cómo llevarlos. El repositorio "inventa" los datos en bruto para crear objetos para que el Servicio pueda trabajar.
Pero el repositorio no sabe nada sobre la base de datos. El tipo de base de datos (MySQL, PostgreSQL, ...) concierne a DAO.
Puede cambiar el DAO si desea cambiar la base de datos y no debe afectar a las capas superiores. Puede cambiar el repositorio si desea actualizar su administración de datos, pero esto no debe afectar el DAO y las capas superiores. Puede cambiar los Servicios si desea cambiar su lógica, pero esto no debe interferir con las capas superiores ni inferiores.
Y puede cambiar cualquier cosa a la vista, incluso la tecnología (web, escritorio, texto), pero esto no debe implicar en contacto nada a continuación.
La lógica empresarial es el servicio. Pero cómo interactuar con esto es ver. ¿Qué botón mostrar ahora? ¿Puede el usuario ver este enlace? ¿Piensa que su sistema es un programa basado en consola: debe negar si el usuario equivocado elige #> myprogram -CourseService -option=getCourse -idCourse=234
o detiene que presione las teclas para escribir este comando?
Hablando en sistemas basados en web (Struts + JavaEE) Tengo un paquete de controlador GUI separado. En vista Acción le doy al usuario registrado y la clase me da los botones (o cualquier elemento de interfaz que desee).
<div id="userDetailSubBox">
<c:forEach var="actionButton" items="${actionButtons}" varStatus="id">
${actionButton.buttonCode}
</c:forEach>
</div>
Y
private List<ActionButton> actionButtons;
Recuerde mantener esto fuera de los servicios. Esto es VER cosas. Manténgalo en las acciones Struts. Cualquier interacción de la interfaz debe estar completamente separada del código comercial real, por lo que si transfiere su sistema, será fácil cortar lo que ya no necesitará.