Académique Documents
Professionnel Documents
Culture Documents
El patrn Modelo-Vista-Controlador
El patrn Modelo-Vista-Controlador se origin en la comunidad Smalltalk para implementar interfaces de usuario en los que las responsabilidades estn bien distribuidas entre distintas partes (componentes) del diseo. As, se decidi, distintas:
distinguir
tres
responsabilidades
Modelo
Datos
Vista
Evento
Evento
Controlador
Evento
Interfaz Usuario
Modelo
(beans)
Datos
(Propiedades de los Beans)
Vista
(JSPs)
Mostrar Vista
Evento
(Peticin)
Evento
(forward)
(HTML), jsp:getProperty
Controlador
(servlet)
Evento
(Peticin)
(Navegador)
Interfaz Usuario
El modelo representa la lgica de negocio de la aplicacin. Encapsular el modelo de una aplicacin en componentes facilita la depuracin, mejora la calidad y favorece la reutilizacin de cdigo. Puede dividirse en dos tipos de componentes:
De estado. De accin.
Los componentes de estado encapsulan el estado de la aplicacin y exponen mtodos para el acceso y cambio de ste. Al estar una capa por debajo de la capa de accin, los componentes de estado deben ser completamente independientes del protocolo. As, podrn ser reutilizados en otro tipo de aplicaciones (RMI, IIOP, etc).
La capa de componentes de accin define los cambios permisibles del estado en respuesta a los eventos. Los componentes de accin no pueden ser completamente independientes del protocolo, pero, an as, se debe intentar reducir el acoplamiento al mximo o incluso construir dos subcapas, una dependiente del protocolo que transforme los eventos y delegue el procesamiento a otra capa de componentes de accin independientes del protocolo.
Accin
Estado
El controlador es responsable de recibir los eventos, determinar el procesador del evento, invocar al procesador y finalmente provocar la generacin de la vista apropiada. En una aplicacin web java la tecnologa ms adecuada para implementar los controladores son los Servlets. Estos servlets actan como direccionadores (dispatchers) de las peticiones.
10
Control de la seguridad. Identificacin de eventos. Preparar el modelo. Procesar el evento. Manejar los errores. Provocar la generacin de la respuesta.
11
La vista representa la lgica de presentacin de la aplicacin. Los componentes de la vista extraen el estado actual del sistema del modelo y proporcionan la interfaz de usuario para el protocolo que se est usando. Como parte de la generacin la vista debe presentar al usuario el conjunto de eventos que puede generar en ese momento concreto. La tecnologa Java indicada para la generacin de vistas en aplicaciones web son las JSPs. Separar el modelo y la vista permite la construccin de interfaces con diferentes apariencias.
12
Al construir un aplicacin web suele ser necesario delegar el procesamiento de una peticin a otros Servets (o JSPs), o incluir la salida de otros Servlets en la respuesta (para generacin modulada de la respuesta). Para este tipo de procesamiento el API Servlet proporciona la interfaz javax.servlet.RequestDispatcher.
14
15
req,
ServletResponse
res)
throws
req,
ServletResponse
res)
throws
16
El mtodo forward delega la peticin en el servlet destino. El servlet origen no debe haber escrito nada en la respuesta, es decir, se supone que toda la generacin de la respuesta la va a llevar a cabo el servlet destino.
17
El servlet destino tiene acceso a todos los mtodos de la peticin, pero tiene ciertas limitaciones a la hora de interactuar con la respuesta (el objeto ServletResponse), ya que cualquier intento de modificar o establecer cabeceras en la respuesta sern ignorados.
A no ser que el RequestDispatcher haya sido recuperado por medio del mtodo getNamedDispatcher los siguientes atributos sern aadidos al objeto ServletRequest:
18
Si durante una llamada a forward o a include se produce una excepcin, la especificacin indica que:
Si la excepcin es de tipo IOException o ServletException se propagar hacia el servlet origen. Si la excepcin es de otro tipo se envolver en una ServletException y el servlet origen podr recuperar la excepcin por medio del mtodo Throwable getRootCause() de ServletException.
19
21
public class ServletControlador extends HttpServlet { private static final String INICIALIZADOR = "inicializador"; //Debe coincidir con el DD. private static final String PREFIJO_EVENTO = "evento."; //Debe coincidir con el DD. private static final String NOM_TABLA_EVENTOS = "tablaEventos"; public void init(ServletConfig config) throws ServletException { super.init(config); try { //Recuperar la clase inicializadora de la aplicacin (ver DD). String inicializador = config.getInitParameter(INICIALIZADOR); Inicializador ini = (Inicializador)Class.forName(inicializador).newInstance(); ini.init(config);
23
24
package contweb.mvc; import javax.servlet.*; public interface Inicializador { public void init(ServletConfig cfg) throws ServletException; }
26
El servlet anterior se ha implementado como un controlador reutilizable (ya que no incluye cdigo propio de la aplicacin). El diseo se basa en las dos interfaces Inicializador y Evento. Para usar el servlet como controlador de una aplicacin, se debe implementar la interfaz Inicializador con el cdigo necesario para inicializar la aplicacin y una implementacin de la interfaz Evento por cada evento que se produzca en la aplicacin. Se debe declarar el mapeo de los eventos y el inicializador en el descriptor de despliegue de la aplicacin, aunque una aplicacin ms robusta debera declarar los mapeos en un archivo de configuracin aparte, posiblemente en un archivo XML.
27
Durante la inicializacin del Servlet se instancia la clase que implementa la interfaz Inicializador y se invoca su mtodo init. Tambin se instancian las clases que implementan la interfaz Evento y se guardan en una tabla usando como ndices los nombres de los eventos. Durante la gestin de las peticiones (mtodo doPost) se busca la clase controladora en funcin de un parmetro que debe aparecer en la peticin y se delega la gestin del evento en la clase correspondiente, invocando el mtodo procesar que debe devolver el nombre del recurso al que se delegar la generacin de la vista (generalmente una JSP). Las clases controladoras deben comprobar las peticiones y preparar el modelo para la generacin de la vista.
28
29
30
Archivo de Libros (Libros.txt): 1@El Guardin Entre el Centeno@10 2@La Conjura de los Necios@10 3@1984@10
31
32
Las clases Almacn y Libro forman los componentes de estado del modelo de la aplicacin. La clase Almacn lee un archivo de texto y recupera los datos de los libros usando un separador (ambos parmetros deben ser proporcionados en el constructor). Puede observarse que ninguna de estas clases contiene cdigo especifico del protocolo y que podran ser reutilizadas fcilmente en otro contexto.
33
La clase contweb.mvc.init.InicializadorLibros es la clase inicializadora de la aplicacin. Implementa la interfaz contweb.mvc.Inicializador. Est declarada (mapeada) en el descriptor de despliegue.
Recupera del contexto los parmetros necesarios para instanciar el Almacn, en concreto, el archivo de libros y el separador.
Si alguno de estos parmetros no est presente, o no tiene valor se lanza una excepcin (as como si hay problemas al leer el archivo).
34
35
Las clases controladoras de eventos son, junto con la clase inicializadora, los componentes de accin del modelo. Al no haber mucha lgica no se han creado dos capas de componentes de accin, slo hay una capa y es dependiente del protocolo.
Estas clases (EventoReserva y EventoConsulta), comprueban el estado del modelo y deciden el componente que generar la vista.
Al igual que la clase inicializadora, son declaradas en el DD.
37
<% Almacen almacen = (Almacen)application.getAttribute(InicializadorLibros.NOM_ALMACEN); Libro libro = almacen.getLibro(request.getParameter(EventoConsulta.NOM_LIBRO)); int cantidad = Integer.parseInt(request.getParameter(EventoReserva.NOM_CANTIDAD)); out.println("<h2> Libro: " + libro.getNombre() + "<br/> Stock: " + libro.getStock() + " <br/> Cantidad solicitada: " + cantidad + "</h2>"); %>
<form action="controlador" method="POST"> <input type="submit" value="Volver a Consultar" /> <input type="hidden" name="<%= Evento.NOM_EVENTO %>" value="<%= EventoConsulta.NOMBRE %>" /> </form> </body> </html>
39
40
41
Las JSP son la vista de la aplicacin. Se conectan al modelo para recuperar los datos necesarios para la presentacin. Para generar otro tipo de interfaz simplemente habra que aadir nuevas JSPs que generasen otro tipo de vista (aunque presentasen los mismos datos). La vista siempre est acoplada al modelo, ya que usa las clases de ste para presentar los datos.
42
43
44
45
46