Sie sind auf Seite 1von 12

El modelo MVC de JAVA

Las aplicaciones Web estn organizadas siguiendo una arquitectura de 3 capas, donde la capa cliente, implementada mediante pginas Web, tiene como misin la captura de datos del usuario y su envi a la capa intermedia, as como la presentacin de resultados procedentes de est. Es la capa intermedia la que constituye el verdadero nucleo de la aplicacin Web, encargndose del procesamiento de los datos del usuario y de la generacin y envo de las respuestas a la capa cliente. Durante este proceso, la capa intermedia deber interaccionr con las capa de datos para el almacenamiento y recuperacin de la informacin manejada por la aplicacin. Uno de los esquemas y, con toda seguridad , el ms utilizado por los desarrolladores que utilizn J2EE, es la arquitectura Modelo Vista Controlador(MVC), la cual proporciona una clara separacin entre las distintas responsabilidades de la aplicacin. Cuando hablamos de arquitectura Modelo Vista Controlador nos referimos a un patrn de diseo que especifica cmo deber ser estructurada una aplicacin, las capas que van a componer la misma y la funcionalidad de cada una. Segn este patrn, la capa intermedia de una aplicacin Web puede ser divididad en tres grandes bloques funcionales: 1. Controlador 2. Vista 3. Modelo CONTROLADOR Se puede decir que el controlador es el que dirige la aplicacin. Todas las peticiones a la capa intermedia que se realicen desde el cliente son dirigidas al controlador, cuya misin es determinar las acciones a realizar para cada una de estas peticiones e invocar al resto de los componentes de la aplicacin (Modelo y Vista) para que realicen las acciones requeridas en cada caso, encargndose tambin de la coordinacin de todo el proceso. Ventajas 1. Hace que el desarrollo sea ms sencillo y limpio 2. Facilita el posterior mantenimiento de la aplicacin hacindola ms escalable. 3. Facilita la deteccin de errores en el cdigo. En aplicaciones J2EE el Controlador es implementado mediante un Servlet central que, dependiendo de la cantidad de tipos de peticiones que debe gestionar, puede apoyarse de otros servlets auxiliares para procesar cada peticin. VISTA Es la encargada de generar las respuestas (XHTML) que deben ser enviadas al cliente. Cuando esta respuesta tiene que incluir datos proporcionados por el Controlador, el cdigo XHTML de la pgina no ser fijo si no que debera ser generado de forma dinmica, por lo que su implementacin correr a cargo de una pgina JSP. Las pginas JSP resultan mucho ms adecuadas para la generacin de las vistas de los servlets pues, al ser documentos de texto, resulta sencilla la inclusin de bloques estticos XHTML y pueden ser fcilmente mantenibles por diseadores Web con escasos conocimientos de programacin.

Cuando la informacin que se va a enviar es esttica, es decir, no depende de datos extraidos de un almacenamiento externo, podr ser implementada por una pgina o documento XHTML. MODELO En la arquitectura MVC la lgica de negocio de la aplicacin, incluyendo el acceso a los datos y su manipulacin, est encapsulada dentro del modelo. El Modelo lo forman una serie de componentes de negocio independenientes del Controlador y la Vista, permitiendo as su reutilizacin y el desacoplamiento entre las capas. En una aplicacin J2EE el modelo puede ser implementado mediante clases estndar Java o travs de Enterprise JavaBeans. COMO FUNCIONA UNA APLICACION MVC? Analizemos los procesos que tienen lugar en la capa intermedia desde que llega la peticin procedente de la capa cliente hasta que se genera la respuesta: 1. Captura de la peticin en el controlador: Como hemos dicho, todas las peticiones que se reciben en la aplicacin son centralizadas en el Controlador, el cual a partir de la URL de la solicitud determina el tipo de la operacin que quiere llevar a cabo el cliente. Normalmente, esto se hace analizando el valor de algn parmetro que se enva anexando a la URL de la peticin y que se utiliza con esta finalidad: url?operacion=validar Otra opcin es utilizar la propia URL para codificar la operacin a realizar, en este caso, se utilizara el path info de la direccin como indicativo del tipo de accin. En este sentido, la figura 4 nos muestra las distintas partes en las que se puede descomponer la URL completa asociada a una peticin. http://www.dominajava.net/aplicacion/url_servlet/info 1. http://www.miservidor.com: Servidor 2. aplicacion: url de la aplicacin (context path) 3. url_servlet: url del servlet (servlet path) 4. info: informacin adicional (path info) Por ejemplo, si en un servidor de nombre de dominio www.tiendaOnline.net/ tenemos desplegada una aplicacin llamada "accesorios", cuyo Controlador es un servlet que tiene como url pattern el valor "/control", la URL asociada a la operacin de validar podra ser: www.tiendaOnline.net/accesorios/control/validar Otra operacin podria ser: www.tiendaOnline.net/accesorios/control/buscaraccesorio Todas estas peticiones provocarn la ejecucin del servlet controlador, el cual utilizar el mtodo getPathInfo() del API servlet para determinar la operacin a realizar. Realizar un controlador que genere n-peticiones en una aplicacin Web dependera de mapear el servlet. Los pasos para mapear la URL de un servlet son los siguientes: Vamos a crear nuestro primer Servlet y lo vamos a llamar paqjspservlets.HolaServlet. Este Servlet va

a pertenecer a una aplicacin o contexto llamado projspservlets. Si este Servlet est hospedado en un servidor Java EE en nuestro ordenador , y lo llamamos desde un navegador tambin desde nuestro propio ordenador escribiremos la siguiente URL. http://localhost:8084/projspservlets/paqjspservlets.HolaServlet /projspservlets es el nombre de la aplicacin o contexto /paqjspservlets.HolaServlet es la signatura completa del Servlet, es decir el nombre del Servlet juntamente con el paquete al cual pertenece Pues bien, esta forma antigua de llamar a un Servlet la vamos a modificar por esta otra forma actual http://localhost:8084/projspservlets/hola /hola en vez de escribir en el path de la URL la signatura completa del Servlet, lo que hacemos es utilizar un alias para que de esta forma la URL sea ms corta y para que podamos cambiar el nombre del Servlet y del paquete libremente en un futuro sin que los usuarios se vean afectados por el cambio de nombre, ya que ellos seguirn utilizando el alias A esta accin se le llama mapear la URL de un Servlet. Para poder llevar a cabo este mapeo los Contenedores Web continen para cada aplicacin o contexto un documento XML a modo de Descriptor de Despliegue (Deployment Descriptor) llamado web.xml. La labor del Contenedor Web es leer (parsear) el documento web.xml perteneciente a la aplicacin o contexto que se est ejecutando y realizar el mapeo entre el alias encontrado en el path de la URL y el Servlet en cuestin Este es el aspecto del fichero web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" > <servlet> <servlet-name>holaServlet</servlet-name> <servlet-class>paqjspservlets.HolaServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>holaServlet</servlet-name> <url-pattern>/hola</url-pattern> </servlet-mapping> <session-config> <session-timeout>30</session-timeout> </session-config> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app> Descripcin del fichero Web.xml

<web-app version="2.4" .... este es el elemento raz del documento XML a partir de la versin 2.4 de los Servlets este fichero en vez de ser validado por una DTD pblica de Sun, es validado por un XML Schema pblico tambin de Sun <servlet> una aplicacin puede tener cero o ms Servlets <servlet-name>holaServlet</servlet-name> este subelemento del elemento <servlet> tambin se encuentra como subelemento del elemento <servlet-mapping> para que as de esta forma el contenedor Web pueda realcionarlos a la hora de realizar el mapeo <servlet-class>paqjspservlets.HolaServlet</servlet-class> indica el Servlet que se va a ejecutar en el Contenedor Web una vez se ha realizado el mapeo <servlet-mapping> una aplicacin puede tener cero o ms mapeos de Servlets <url-pattern>/hola</url-pattern> el Contenedor Web busca en el fichero web.xml en este caso el alias /hola y cuando lo encuentra lee el valor del subelemento <servlet-name> que en este caso es holaServlet entonces se encarga de buscar el mismo contenido, en este caso holaServlet en el subelemento <servlet-name> del elemento <servlet> 2. Procesamiento de la peticin Una vez que el Controlador determine la operacin a realizar, procedee a ejecutar las acciones pertinentes, invocando para ello a los diferentes mtodos expuestos por el Modelo. Dependiendo de las acciones a realizar (por ejemplo, un alta de un usuario en el sistema), el Modelo necesitar manejar los datos enviados por el cliente en la peticin, datos que le sern proporcionados por el controlador. De la misma manera, los resultados generados por el Modelo (por ejemplo la informacin resultante de una bsqueda sern entregados directamente al controlador). Para facilitar este intercambio de datos entre el Controlador y Modelo y, posteriormente, entre Controlador y Vista, las aplicaciones MVC suelen hacer uso de JavaBeans. Un JavaBean no es ms que una clase que encapsula un conjunto de datos con mtodos de tipo set/get para proporcionar un acceso a los mismos desde el exterior. El siguiente listado representa un JavaBean de ejemplo que permite encapsular una serie de datos asocioados a una persona. public class Persona { private String nombre; private String apellido; private int edad; public void setNombre(String nombre) { this.nombre = nombre; } public String getNombre() { return this.nombre; } public void setApellido(String apellido) { this.apellido = apellido; }

public String getApellido() { return this.apellido; } public void setEdad(String edad) { this.edad = edad; } public int getEdad() { return this.edad; } 3. Generacin de respuestas Los resultados devueltos por el Modelo al Controlador son depositados por ste en una variable de peticin, sesin o aplicacin, segn el alcance que deban tener. A continuacin, el Controlador invoca a la pgina JSP que debe encargarse de generar la vista correspondiente, est pgina acceder a la variable de mbito donde estn depositados los resultados y los utilizar para generar dinmicamente la respuesta XHTML que ser enviada al cliente. CASO PRCTICO Se desarrollar una aplicacin Web que consistir en un sencillo sistema de envo y visualiacin de mensajes a travs de la Web, cuyas pginas se mostrarn en una navegador Web. Cada mensaje estar formado por un destinatario, un remitente y un texto. La pgina de inicio muestra dos enlaces con las opciones del usuario, la de visualizacin de mensajes le llevar a otra pgina ("mostrar.htm"), donde se le solicitar el nombre del destinatario cuyos mensajes quiere vizualizar. En caso de tener mensajes asociados se le enviar a una pgina donde se le mostrar una tabla con todos sun mensajes, indicando para cada uno de ellos el remitente y el contenido del mensaje. Por otro lado, la opcin de envo de mensajes le llevar a una pgina en la que se le solicitarn los datos del mensaje que quiere enviar, devolvindolo despus a la pgina de inicio una vez que el mensaje ha sido almacenado. DESARROLLO Los mensajes manejados por la aplicacin sern almacenados en una tabla cuya estructura se indica. Nombre del campo remitente destinatario texto Tipo de datos cadena de texto cadena de texto cadena de texto

El desarrollo de esta aplicacin se realizar siguiendo el patrn MVC, donde tendremos un servlet llamado "controlador" en el que se centralizarn todas las peticiones procedentes desde el cliente.

El Modelo estar implementado mediante una clase a la que llamaremos Operaciones que dispondr de dos mtodos: grabarMensaje(), encargado de almacenar en la base de datos los datos de un mensaje, y obtenerMensajes(), cuya funcin ser la de recuperar la lista de mensajes asociados al destinatario que se proporciona como parmetro. Los mensajes sern manipulados mediante una clase JavaBean llamada Mensaje, que encapsular los tres datos asociados a un determinado mensaje. En cuanto a la vistas, sern implementadas mediante cinco pginas, dos XHTML(inicio.htm y mostrar.htm), y tres JSP(envio.jsp, ver.jsp, nomensajes.jsp). Utilizando el parmetro "operacin" insertando en la URL, la pgina inicio.htm, mostrar.htm y envio.jsp indicarn al servlet controlador el tipo de accin que se debe llevar a cabo en cada peticin. Listados - A continuacin se presenta el cdigo de cada uno de los elementos de la aplicacin. Clase Mensaje package javabeans; public class Mensaje { private String remite; private String destino; private String texto; public Mensaje(){} //constructor que permite crear un objeto //Mensaje a partir de los datos del mismo public Mensaje(String remite, String destino, String texto){ this.remite=remite; this.destino=destino; this.texto=texto; } public void setRemite(String remite){ this.remite=remite; } public String getRemite(){ return this.remite; } public void setDestino(String destino){ this.destino=destino; } public String getDestino(){ return this.destino; } public void setTexto(String texto){ this.texto=texto; } public String getTexto(){ return this.texto;

} } Clase controlador package servlets; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.util.*; import javabeans.*; import modelo.*; public class Controlador extends HttpServlet { public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String op=request.getParameter("operacion"); //acceso a la pgina de envo de mensajes if(op.equals("envio")) response.sendRedirect("envio.jsp"); //grabacin de un mensaje if(op.equals("grabar")){ Mensaje men=(Mensaje)request.getAttribute("mensa"); Operaciones oper=new Operaciones(); oper.grabaMensaje(men); response.sendRedirect("inicio.htm"); } //acceso a la pgina de solicitud de mensajes if(op.equals("muestra")) response.sendRedirect("mostrar.htm"); //acceso a la lista de mensajes del usuario if(op.equals("ver")){ Operaciones oper=new Operaciones(); ArrayList mensajes=oper.obtenerMensajes(request.getParameter("nombre")); request.setAttribute("mensajes",mensajes); RequestDispatcher rd=request.getRequestDispatcher("/ver.jsp"); rd.forward(request,response); } } } Clase Operaciones package modelo; import java.sql.*; import javabeans.*; import java.util.*; public class Operaciones {

//mtodo comn para la obtencin //de conexiones public Connection getConnection(){ Connection cn=null; try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); cn=DriverManager.getConnection("jdbc:odbc:mensajes"); } catch(Exception e){e.printStackTrace();} return cn; } public ArrayList obtenerMensajes(String destino){ Connection cn=null; ArrayList mensajes=null; Statement st; ResultSet rs; try{ cn=getConnection(); st=cn.createStatement(); String tsql; tsql="select * from mensajes where destinatario='"+destino+"'"; rs=st.executeQuery(tsql); mensajes=new ArrayList(); //para cada mensaje encontrado crea un objeto //Mensaje y lo aade a la coleccin ArrayList while(rs.next()){ Mensaje m=new Mensaje(rs.getString("remitente"),rs.getString("destinatario"),rs.getString("texto")); mensajes.add(m); } cn.close(); } catch(Exception e){e.printStackTrace();} return(mensajes); } public void grabaMensaje(Mensaje m){ Connection cn; Statement st; ResultSet rs; try{ cn=getConnection(); st=cn.createStatement(); String tsql; //a partir de los datos del mensaje construye //la cadena SQL para realizar su inserin tsql="Insert into mensajes values('"; tsql+=m.getDestino()+"','"+m.getRemite()+"','"+m.getTexto()+"')"; st.execute(tsql); cn.close();

} catch(Exception e){e.printStackTrace();} } }

VISTAS DE LA APLICACION inicio.htm <html> <body> <center> <br/><br/> <a href="controlador?operacion=envio"> Enviar mensaje </a><br/><br/> <a href="controlador?operacion=muestra"> Leer mensajes </a> </center> </body> </html> mostrar.htm <html> <body> <center> <br/><br/> <form action="controlador?operacion=ver" method="post"> Introduzca su nombre:<input type="text" name="nombre"><br><br> <input type="submit"> </form> </center> </body> </html> envio.jsp <html> <head> <title>envio</title> </head> <!--captura de datos e insercin en el Javabean--> <jsp:useBean id="mensa" scope="request" class="javabeans.Mensaje" /> <jsp:setProperty name="mensa" property="*"/> <%if(request.getParameter("texto")!=null){%>

<jsp:forward page="controlador?operacion=grabar"/> <%}%> <body> <center> <h1>Generacin de mensajes</h1> <form method="post"> <br/><br/> <b>Datos del mensaje:</b><br/><br/> Introduzca destinatario: <input type="text" name="destino"><br/> <br/> Introduzca remitente : <input type="text" name="remite"><br/> <br/> Introduzca texto : <br/> <textarea name="texto"> </textarea> <hr/><br/> <input type="submit" name="Submit" value="Enviar"> <input type="reset" value="Reset"> </form> </center> </body> </html>

ver.jsp <%@ page import="javabeans.*,java.util.*"%> <html> <head> <title>ver</title> </head> <body> <center> <%String nombre=request.getParameter("nombre");%> <h1> Mensajes para <%=nombre%> </h1> <table border=1> <tr><th>Remitente</th><th>Mensaje</th></tr> <%boolean men=false; ArrayList mensajes=(ArrayList)request.getAttribute("mensajes"); if(mensajes!=null) //si existen mensajes para ese destinatario //se generar una tabla con los mismos for(int i=0;i<mensajes.size();i++){ Mensaje m=(Mensaje)mensajes.get(i); if((m.getDestino()).equalsIgnoreCase(nombre)){

men=true;%> <tr><td><%=m.getRemite()%></td><td><%=m.getTexto()%></td></tr> <%} } if(!men){%> <!--si no hay mensajes se enva al usuario a la pgina nomensajes.jsp--> <jsp:forward page="nomensajes.jsp"/> <%}%> </table> <br/><br/> <a href="inicio.htm">Inicio</a> </center> </body> </html> nomensajes.jsp <html> <head> <title>nomensajes</title> </head> <body> <center> <h2> Lo siento, <%=request.getParameter("nombre")%> no tiene mensajes </h2> <br/><br/><br/><br/> <a href="inicio.htm">Inicio</a> </center> </body> </html> Por ltimo pongo el web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/webapp_2_4.xsd"> <servlet> <servlet-name>Controlador</servlet-name> <servlet-class>servlets.Controlador</servlet-class> </servlet> <servlet-mapping> <servlet-name>Controlador</servlet-name> <url-pattern>/controlador</url-pattern> </servlet-mapping>

<session-config> <session-timeout> 30 </session-timeout> </session-config> <welcome-file-list> <welcome-file> index.jsp </welcome-file> </welcome-file-list> </web-app>

Bibliografa 1. STRUTS, Antonio J. Martn Sierra, Editorial Alfaomega RA-MA, Ao 2008. 2. Manual de Referencia JSP, Phil Hanna, Mc Graw Hill, Osborne Media.

Das könnte Ihnen auch gefallen