En esta entrada quiero describir una propuesta de estructura de una aplicación MVC que toma como base la que implementa Struts. Evidentemente esta solución no aporta nada si ya tienes decidido utilizar Spring o el propio Struts; pero si se desea realizar una aplicación sencilla si hacer uso de ellas, la propuesta que se describe permite tener una solución bien estructura y sencilla.
¿Qué debes saber antes de continuar? Al menos los conceptos de servlet y JSP deberías tenerlos claros; y todo lo ello conlleva: paso de parámetros, redijir a una JSP desde el servlet, paso de atributos, sesiones, etc.
Como siempre utilizaremos Apache Tomcat como contenedor J2EE y Eclipse como entorno de desarrollo.
La entrada la he dividido en tres bloques: idea general de la estructura, elementos que se necesitan y organización de los mismos.
Ideal general
La estructura que se presenta pretende separar el control de acceso a la aplicación, la lógica de negocio y la lógica de presentación. Es decir, que haya un único punto de entrada a la funcionalidad, que cada función sea independiente y se puede añadir nueva de forma dinámica y que la presentación sólo se dedique a «pintar» datos y no realice ninguna funcionalidad propia de la lógica de negocio.
Elementos de la estructura
Para lo cual vamos a utilizar tres elementos principales, acción/modelo, vista y controlador, y dos secundarios, beans (o también POJOs) y la lógica de negocio o servicios.
Controlador: esta parte será implementada por un servlet; el cual recibe todas las peticiones y las procesa para verificar que el usuario tiene permiso de acceso y puede ejecutar la acción solicitada.
Para independizar el servlet de la acción concreta a ejecutar todas las clases que implementan la funcionalidad de la aplicación deberán heredar de una clase padre Accion. De esta forma se puede declarar una variable de dicho tipo y asignarle el tiempo de ejecución el objeto correspondiente a la clase de la acción a realizar.
Accion accion = new AccionListarArticulos();
accion.ejecutar();
El listado de acciones (en realidad objetos de subclases de la clase Accion, como hemos visto) se instanciará cuando el servlet se cargue en memoria; de esta forma estará disponible para todas las peticiones que se realicen al controlador. Es decir, no creamos un objeto de la acción cada vez que el servlet recibe una petición sino que utilizamos una tabla para guardar, debidamente referenciado, un objeto de cada una de las acciones.
Al finalizar la ejecución de la acción el controlador redije la petición a la vista para que genere la página que se envía al navegador.
Acción: es la encargada de realizar la funcionalidad deseada para lo cual hará uso de la lógica de negocio o servicios que estime oportunos. En el caso de que se trate de operaciones de búsqueda creará un array con los objetos a enviar a la vista; y en general toda la información que ésta necesite.
Vista: es la encargada de generar la página HTML que se envía al navegador del cliente. Recibe la información de la acción y procede a mostrarla en la página. En ningún caso accede a la lógica de negocio o realizar alguna acción que no sea, por así decirlo, «pintar» datos. Esta parte se implementa con una JSP.
Organización y flujo de ejecución
Una vez que se han descrito los elementos de la estructura vamos a colocar cada uno de ellos y a establecer el flujo de ejecución; lo que también servirá para conocerlos.
Partamos, por ejemplo, de una página web que tiene un enlace para mostrar el listado de artículos de una tienda:
http://localhost:8080/aplicacion/ServletControl?ID_ACCION=LISTAR_ARTICULOS
Como se puede observar en dicho enlace aparecen dos elementos fundamentales, el servlet (ServletControl) y el parámetro que identifica la acción a ejecutar (ID_ACCION).
Cuando dicha petición llega al servlet este debe recuperar el objeto que se corresponde con la acción solicitada, ejecutarla y redijir a la JSP que generará la web a enviar al navegador.
Accion accion = (Accion) this.tablaAcciones.get(request.getParameter(«ID_ACCION»));
String jsp = accion.ejecutar(request, response);
this.getServletContext().getRequestDispatcher(jsp).forward(request,response);
Una vez que la petición llega a la JSP, ésta recupera los atributos que le pudieran haber pasado desde la acción y procede a generar la página HTML que se envía al navegador.
ArrayList<Item> items = (ArrayList<Item>) request.getAttribute(«LISTADO_ITEMS»);