Você está na página 1de 10

Bsqueda Genrica en Filmografa Nacional

Resumen El ejercicio se conforma de una pgina JSP que recibe parmetros en una forma HTML a partir de los cules hace una bsqueda en la base de datos y presenta en una tabla los registros que contienen dichos parmetros dentro de un campo en particular o en todos. El proyecto est contenido en el archivo filna.zip. Al importar el proyecto dentro de Eclipse tenemos una estructura de dos carpetas; SRC, donde se localizan nuestras clases java separadas en paquetes y WebContent que almacena los recursos necesarios para que funcione nuestra aplicacin en el servidor web. Para este ejercicio usamos el servidor Tomcat y al exportar nuestro proyecto deber quedar dentro de la carpeta Webapps en el directorio de Tomcat. Se desarrollo bajo el patrn Modelo-Vista-Controlador de Spring, teniendo un Dispatcher Servlet que atiende todas las solicitudes del browser y escoge el controlador necesario para recibir dicha solicitud. El controlador se apoyar en los servicios del negocio para generar el modelo de datos y a su vez regresarlo al despachador para que este determine la vista que presentar al usuario como respuesta. ESTRUCTURA SRC Base de datos Para este proyecto usamos MySQL, se creo una base de datos llamada filna que consta de una sola tabla con el mismo nombre. En nuestro proyecto de Eclipse debemos configurar el build path aadiendo el .jar del conector mysql en nuestras libreras. Entidades (JavaBeans) A partir de la tabla de filna creamos nuestra primera clase BinFragmentos. Los miembros de la clase tendrn propiedades dependiendo del tipo de datos de cada campo en nuestra base de datos (cadena, numrico, booleano, etc.), declarando los mtodos get y set de cada instancia para poder acceder y modificar sus atributos. DAO(Data Acces Object) Nuestro componente DAO suministrar la interfaz entre los servicios de nuestra aplicacin y nuestra base de datos. En este ejercicio usaremos la inyeccin de dependencias de Spring Beans para lograr la conexin a la BD. Servicios Los servicios del negocio son las funciones que aceptan una llamada de los controladores y devuelve una respuesta, apoyarn el intercambio de datos entre nuestro DAO y controladores para responder a la solicitud web.

Controllers Cuando llegue una solicitud, el Dispatcher Servlet decidir que controlador debe recibirla y mediante la inyeccin de Spring Beans procesar la solicitud apoyndose en los servicios del negocio para generar el modelo de datos, notificando su vista asociada para entregar la respuesta. Los archivos .class de nuestras clases java, tienen un directorio de salida por default, debemos configurar nuestro build path para cambiarlo a la carpeta WEB-INF/classes dentro de WebContent. WEB CONTENT web.xml Este archivo es el descriptor de implementacin de nuestra aplicacin web. Describe los recursos y la configuracin de la aplicacin, as como la forma en que el servidor web los utiliza para suministrar las solicitudes web, as cuando recibe una, utiliza el descriptor de implementacin para asignar la URL de la solicitud al cdigo que debe controlar dicha solicitud. Servlet Al recibir una solicitud web, configuramos nuestro descriptor de implementacin para que nuestro servlet filnaServlet controle cualquier solicitud. Al estar configurado como nuestro Servlet distribuidor (Dispatcher Servlet) su funcin ser enviar la solicitud a un controlador de Spring MVC para procesarla. Al regresar los datos del modelo e identificada el nombre de la vista nuestro Servlet tendr configurado un solucionador de vistas para decidir cul presentar como respuesta a la solicitud. Spring Beans Dentro del directorio ./WEB-INF/, declaramos nuestros Spring Beans separndolos en archivos XML separados de acuerdo a su funcin DAO, Service y DataSource. JSPs Para nuestro ejercicio separamos nuestra pginas JSP en formas y vistas, la primera para recibir las peticiones desde el browser y la segunda para entregar los resultados obtenidos en el browser. Esto se ubica en /WEB-INF/jsp/. Lib Libreras de jars necesarios para correr nuestra aplicacin (Mysql-connector, servlet, spring, etc.). Estn ubicadas en el directorio /WEB-INF/jsp/ y pueden configurarse en el build path del proyecto.

CDIGO Web.xml Localizacin de las configuraciones de Spring beans *.xml


<context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/filna-datasource.xml,/WEB-INF/filna-dao.xml,/WEB-INF/filna-service.xml </param-value> </context-param>

Declaramos el nombre de nuestro servlet y su clase que en este caso es DispatcerServlet. El par,etro contextConfigLocation se especfica como una lista de rutas, en este caso queremos que cargue las configuraciones de nuestro archivo filnaServlet.xml.
<servlet> <servlet-name>servletFilna</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/filnaServlet.xml </param-value> </init-param> </servlet>

Declaramos un mapeo de URLs para que todas la peticiones cuyo URL termine en .html" sean atendidas por el servlet que declaramos anteriormente.
<servlet-mapping> <servlet-name>servletFilna</servlet-name> <url-pattern>*.html</url-pattern> </servlet-mapping>

FilnaServlet.xml Se declara un bean de la clase SimpleUrlHandlerMapping, que se encargar de mapear los URLs relativos a la raz de la aplicacin a su respectivo controlador para que atienda la solicitud y un bean solucionador de vistas, que cuando un controlador regresa en el ModelandView un nombre x este bean renderea la pgina en cdigo JSP llamada x.jsp y el resultado rendereado lo entrega al browser del cliente.

<bean name="mapeadorDeUrls" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/index.htm*">indexController</prop> <prop key="/main.htm*">indexController</prop> <prop key="/default.asp">indexController</prop> <prop key="/default.jsp">indexController</prop>

<prop key="/index.asp">indexController</prop> <prop key="/busqueda.html">busquedaFormController</prop> </props> </property> <property name="order" value="0" /> </bean>

<bean name="mapeadorDeVistas" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> <property name="viewClass"> <value>org.springframework.web.servlet.view.JstlView</value> </property> <property name="order" value="1" /> </bean>

Declaramos nuestro controlador indexController y su clase. Cuando la aplicacin reciba una solicitud con URL relativo a la raz index.html nuestro mapeador de URLs enviar la solicitud a este controlador.
<bean id="indexController" class="dgac.filna.controllers.IndexController" />

Declaramos la clase de nuestro controlador busquedaFormController. Cuando la aplicacin reciba una solicitud con URL relativo a la raz busqueda.html nuestro mapeador de URLs enviar la solicitud a este controlador. Tiene como propiedad la referencia al bean de servicios filnaService y a la propiedad formView de la clase SimpleFormController.
<bean id="busquedaFormController" class="dgac.filna.controllers.BusquedaFormController"> <property name="filnaService" ref="filnaService" /> <property name="formView" value="/formas/formaDeBusqueda" /> </bean>

Clase BinFilna.java Clase de bins creando las instancias de todos los campos de la base de datos con sus get y set.
package dgac.filna.entidades; public class BinFilna { private Integer idReg; private String titulo; private String realizador; private String anio; private String pais; private String duracion; private java.util.ArrayList<BinFilna> registros = null; private String cualquierCampoDeTexto; public Integer getIdReg() { return idReg; } public void setIdReg(Integer idReg) { this.idReg = idReg; } public String getCualquierCampoDeTexto() { return cualquierCampoDeTexto; } public void setCualquierCampoDeTexto(String cualquierCampoDeTexto) { this.cualquierCampoDeTexto = cualquierCampoDeTexto;

} public java.util.ArrayList<BinFilna> getRegistros() { return registros; }

filna-dataSource.xml Declaramos la ruta de un archivo de tipo properties donde se encuentran las propiedas de conexin que necesita el data source.
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location" value="/WEB-INF/jdbc.properties" /> </bean>

BasicDataSource es una clase de DataSource que trabaja en cualquier ambiente, y ofrece buen rendimiento.. Tiene 4 propiedades bsicas para hacer la conexin a la base de datos, driverClassName para especificar el controlador, url para poner la url completa para la base de datos, username y password para la autentificacin para conectarse a la BD.
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${db.driver}" /> <property name="url" value="${db.url}" /> <property name="username" value="${db.user}" /> <property name="password" value="${db.pw}" /> </bean>

Declaracin del JDBC Template para acceso a la base de datos mediante una plantilla para conexin JDBC, tiene como propiedad otro bean que es el dataSource y le dar las propiedades para conectar con la base de datos.
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource"> <ref bean="dataSource" /> </property> </bean>

Filna-dao.xml Declaramos nuestro bean del DAO con su clase y como propiedad le hacemos referencia a otro bean, el dataSource que contiene las propiedades de conexin a la base de datos.
<bean id="filnaDao" class="dgac.filna.dao.FilnaDaoImpl"> <property name="dataSource" ref="dataSource" /> </bean>

Clase filnaDaoImpl.java
Esta jerarqua de excepcin tiene como objetivo permitir que el cdigo de usuario encuentre y maneje el tipo de error encontrado sin conocer los detalles de la API de acceso a datos en particular en el uso de JDBC. As, es posible hacer reaccionar a un error sin saber que JDBC est siendo utilizado. import org.springframework.dao.DataAccessException;

Esta es la clase central en el paquete bsico de JDBC. Simplifica el uso de JDBC y ayuda a evitar errores comunes. Ejecuta el flujo de trabajo basico de JDBC, dejando el cdigo de aplicacin para ofrecer SQL y extraer resultados. Esta clase ejecuta consultas SQL o actualizaciones, inicio de la iteracin sobre conjuntos de resultados y la captura de excepciones de JDBC. import org.springframework.jdbc.core.JdbcTemplate; Una interfaz utilizada por JdbcTemplate para el procesamiento de filas de un conjunto de resultados fila por fila. Las implementaciones de esta interfaz es realizar el trabajo real de procesamiento de cada fila, el manejo de excepciones SQLExceptions, estos sern capturados y manipulados por el JdbcTemplate. En contraste con un ResultSetExtractor, un objeto RowCallbackHandler es tpicamente de estado: Se mantiene el estado de resultado en el objeto, que estar disponible para una inspeccin posterior. import org.springframework.jdbc.core.RowCallbackHandler; Clase para JDBC basada en objetos de acceso a datos. Requiere que se determine un DataSource, proporcionando un JdbcTemplate a travs del metodo getJdbcTemplate (). import org.springframework.jdbc.core.support.JdbcDaoSupport;

Override del metodo initDao de la clase jdbcDaoSupport para inicializar el DAO. Como declaramos en los beans, jdbcTemplate tiene como propiedad el bean dataSource que tiene las propiedades para conectar con la base de datos.
protected void initDao() { this.jdbcTemplate = super.getJdbcTemplate(); }

Crea una Collecccion llamada buscaRegistrosPorQuery de la clase BinFilna. De sta manera las variables atributos podrn ser accedidas y modificadas no directamente sino a travs de los getters y setters. Recibe un String con el query para realizar una consulta y regresa una lista con los registros resultantes.

public Collection <BinFilna> buscaRegistrosPorQuery(String strQuery){ try { final ArrayList <BinFilna> alResultado = new ArrayList <BinFilna>(); } return alResultado; } catch (DataAccessException e) { throw e; } }

filna-service.xml Declaramos el bean de Servicios que tiene como propiedad la referencia al bean del DAO.
<bean id="filnaService" class="dgac.filna.servicios.FilnaServiceImpl"> <property name="filnaDao"> <ref bean="filnaDao" /> </property> </bean>

filnaServiceImpl.java

Arma el query en trminos de valores no nulos restringido a campos presentados en la FormaDeBusqueda.jsp , por medio de la inyeccin de beans de Spring regresa los resultados del query utilizando el mtodo del DAO buscaRegistrosPorQuery().
public java.util.Collection<BinFilna> leeBuscaRegistrosPorQuery( dgac.filna.entidades.BinFilna binFilna) { StringBuffer strBuffQuery = null; try { /* * */ strBuffQuery = armaQueryDeBusquedaConjuntiva(binFilna, "filna"); // ejecuta query resultante return filnaDao.buscaRegistrosPorQuery(strBuffQuery.toString()); } catch (RuntimeException e) { throw e; } }

Esta utilera es utilizada por leeBuscaRegistrosPorQueryConjuntivo para armar un query evaluando que no haya cadenas vacas y procesando asteriscos al principio o al final de la cadena.
private StringBuffer armaQueryDeBusquedaConjuntiva( dgac.filna.entidades.BinFilna r, String strTabla) { }

CONTROLADORES IndexController.java Este archivo utiliza los siguientes paquetes:


Clases de para manejar la peticin del usuario y enviarle la respuesta en http import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; Contenedor del Model and View, permite que un controlador los devuelva como un solo valor de retorno import org.springframework.web.servlet.ModelAndView; Superclase para implementacin de controladores import org.springframework.web.servlet.mvc.AbstractController; Vista que permite redirigir a una URL import org.springframework.web.servlet.view.RedirectView;

Si el usuario pide la url /index.html esta controlador usa RedirectView para que el navegador pida la pgina /busqueda.html. Al buscar esta direccin nuestro bean mapeadorDeUrls definido en filnaServlet.xml mapea hacia la formaDeBusqueda.jsp.
public class IndexController extends AbstractController { public ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {

RedirectView rv = new RedirectView("/busqueda.html"); rv.setContextRelative(true rv.setHttp10Compatible(true); return new ModelAndView(rv); } }

BusquedaFormController.java Importa las clases :


Entidad que llevar consigo los campos para consulta y los campos de un registro de resultados import dgac.filna.entidades.BinFilna; Clase con los servicios que podr utilizar o mandar llamar el controlador, en este caso leeBuscaRegistrosPorQuery import dgac.filna.servicios.FilnaServiceFace;

Este controlador extiende el SimpleFormController, que soporta command objects y es capaz de unir valores de los campos de formas a objetos con propiedas del mismo nombre. Primero asignamos un nombre a nuestro Comand Object, este nombre servir para acceder a nuestro objeto con ayuda del Spring Tag Form.

public class BusquedaFormController extends SimpleFormController { public BusquedaFormController() { setCommandName("binDeFilna"); }

Creamos un objeto de tipo BinFilna con el nombre de nuestro commandObject que ser el request y el response. Este contendr tanto los parmetros de la consulta de la forma html como los resultados de la misma.
protected Object formBackingObject(HttpServletRequest request) { BinFilna binDeFilna = new BinFilna(); return binDeFilna; }

Mediante el mtodo onSubmit del SimpleFormControlles se hace el modelo de lo que vamos a entregar para que el DispatcherServlet entregue la vista. Primero hacemos el cast de command que es tipo Object a tipo BinFilna que contiene los parmetros de la consulta. Se crea una lista que por medio de la inyeccin de Spring Beans recibir los resultados del query que el servicio leeBuscaRegistrosPorQuery recibi del DAO. Por ltimo regresa la vista, el nombre del modelo y el objeto que contiene la lista de registros encontrados.
protected ModelAndView onSubmit(Object command, org.springframework.validation.BindException errors) { BinFilna binDeFilna = (BinFilna) command java.util.Collection<BinFilna> listaDeBinFilna = null; try { listaDeBinFilna = filnaService .leeBuscaRegistrosPorQuery(binDeFilna); } catch (Exception e) { } return new ModelAndView("vistas/vistaDeRegistrosEncontrados", "listaDeRegistros", listaDeBinFilna);

} private FilnaServiceFace filnaService; public void setFilnaService(FilnaServiceFace a) { this.filnaService = a; }

FORMAS
formaDeBusqueda.jsp Extiende la interfaz ServletRequest para proporcionar informacin solicitud de servlets HTTP. El contenedor de servlets crea un objeto HttpServletRequest y lo pasa como un argumento a los mtodos de servicio del servlet (doGet, doPost, etc.).
<%@ page import="javax.servlet.http.HttpServletRequest" %>

Importa el java bean "binFilna" que es donde se se encuentran todas las intancias para el acceso a los registros de la base de datos.
<%@ page import="dgac.filna.entidades.BinFilna" %>

Contiene las clases heredadas de recogida, el modelo de evento, fecha y hora en las instalaciones,la internacionalizacin, y las clases de diversos servicios pblicos.
<%@ page import="java.util.*" %>

Etiqueta de Spring MVC que proporciona una biblioteca de etiquetas JSP para hacer ms fcil el enlace de un formulario con los datos del modelo.
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

Se incluye la pagina jsp con el menu principal


<%@ include file="/WEB-INF/jsp/menu.jsp" %>

La etiqueta de spring form:form enviara los datos por el mtodo post; commandName llama al controlador
<form:form method="POST" commandName="recibeDeFormaDeBusqueda" onsubmit="" > </form:form>

La etiqueta de spring form:input especifica la variable a travs del atributo path que tiene que llamarse igual que en BinFilna para poder accesar a su valor.
<form:input path="titulo"/>

VISTA
vistaDeRegistrosEncontrados.jsp Este archivo muestra los registros encontrados en forma de tabla. El primer rengln de la tabla nos muestra el nmero de registros encontrados.
<td colspan="5" align="center">nmero de registros encontrados: ${fn:length(listaDeRegistros) } </td> </tr> <tr>

Despus colocamos el nombre de los diferentes campos que contienen nuestros registros en columnas.
<th>&nbsp;</th> <th>T&iacute;tulo</th> <th>Realizador</th> <th>Ao</th> <th>Pas</th> <th>Duracin</th> </tr> <%! int renglon = 1; %> <% renglon = 1; %> <!-- Numero del registo encontrado (NO es su id dentro de la base de datos)--> <!-- Titulo -->

Utilizamos el tag de Spring c:forEach que hace una iteracin sobre la lista de registros encontrados por el query y va colocando cada registro en la tabla en un rengln diferente.
<c:forEach items="${listaDeRegistros}" var="registro"> <!-- para cada registro de listaDeRegistros --> <tr> <td><%= renglon++ %></td> <!-- renglon o registro actual --> <td>${registro.titulo}</td> <!-- muestra titulo --> <td>${registro.realizador}</td> <!-- muestra realizador --> <td>${registro.anio}</td> <!-- muestra ao --> <td>${registro.pais}</td> <!-- muestra pais --> <td>${registro.duracion}</td> <!-- muestra duracion --> </tr> </c:forEach> </table>

Você também pode gostar