Vea el CODIGO FUENTE del JSP exito.jsp |
Vea el CODIGO FUENTE del Java Bean Encuestado.java |
Vea el CODIGO FUENTE del Java Bean ListaEncuestado.java |
Código Fuente BuscarServlet.java
Debido a la longitud del Servlet, éste se encuentra dividido en cinco secciones seguido de una descripción para cada fragmento.
package com.osmosislatina.basesdedatos; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.sql.*; import javax.sql.*; import java.util.*; import javax.naming.*; import com.osmosislatina.beans.*; public class BuscarServlet extends HttpServlet {
|
En la parte superior de este Servlet como cualquier otra Clase Java se importan las librerías ("packages") que serán utilizadas :
java.sql
que representa las Clases para conectarse a Bases de Datos,java.util
que contiene Clases utilitarias Java,javax.sql
que contiene las implementaciones más recientes para Bases de Datos (DataSource
) yjavax.naming
que proporciona las Clases para localizar recursos vía JNDI ("Java Naming Directory Interface").Se define la Clase(Servlet)
BuscarServlet
la cual hereda("inherit") el comportamiento deHttpServlet
como lo hace cualquier otro Servlet; de la misma manera se declara el método principal del Servlet (service
) que contiene los conocidos objetos de entradaHttpServletRequest
yHttpServletResponse
.Como primer paso dentro del método
service
, se extraen los datos introducidos por el usuario en la forma HTML através del objetorequest
.
// Definir terminos de Busqueda String sql_busca = "select * from CURSOJSP_ENCUESTA "; if (buscar.equals("a")) { sql_busca += " where servicios = 1 "; } else if (buscar.equals("b")) { sql_busca += " where servicios = 2 "; } else if (buscar.equals("c")) { sql_busca += " where servicios = 3 "; } if (orden.equals("a")) { sql_busca += " order by servicios ,area"; } else if (orden.equals("c")) { sql_busca += " order by ciudad"; } else if (orden.equals("n")) { sql_busca += " order by apellido,nombre"; } // Definir un Arreglo de Encuestados para colocar resultados ListaEncuestado encuestados = new ListaEncuestado(); |
Se define una secuencia de búsqueda para la Base de Datos en base a los datos extraídos de la forma HTML.
Posteriormente se define una instancia de la Clase (Java Bean)
ListaEncuestado
que será utilizada para guardar los resultados de la búsqueda.
// Conectarse a la Base de Datos try { // Traer el Contexto JNDI Context initContext = new InitialContext(); Context ctx = (Context)initContext.lookup("java:/comp/env"); // Extraer Conexion del Contexto JNDI dataSource = (DataSource) ctx.lookup("jdbc/ConexionMySQL"); conn = dataSource.getConnection(); // Verificar si existe usario por Correo Electronico Statement statement = conn.createStatement(); ResultSet results = statement.executeQuery(sql_busca); while (results.next()) { String nombre = results.getString(2); String apellido = results.getString(3); int ciudad = results.getInt(4); int servicio = results.getInt(5); int area = results.getInt(6); String email = results.getString(7); // Definir Variable Descriptiva para Ciudad String ciudadDesc = new String(); switch (ciudad) { case 1: ciudadDesc = "Guadalajara" ; break; case 2: ciudadDesc = "Mexico, D.F" ; break; case 3: ciudadDesc = "Monterrey" ; break; case 4: ciudadDesc = "Tijuana" ; break; case 5: ciudadDesc = "Otra" ; break; } // Definir Variable Descriptiva para Servicio String servicioDesc = new String(); switch (servicio) { case 1: servicioDesc = "Internet" ; break; case 2: servicioDesc = "Telefonia Celular" ; break; case 3: servicioDesc = "Internet y Telefonia Celular" ; break; } // Definir Variable Descriptiva para Area String areaDesc = new String(); switch (area) { case 1: areaDesc = "Residencial" ; break; case 2: areaDesc = "Empresarial" ; break; case 3: areaDesc = "Residencial y Empresarial" ; break; } // Definir un Java Bean con los datos extraidos // Utilizar el Constructor Adecuado if (ver_email == null) { // Definido el Java Bean Colocarlo dentro del Lista de Encuestados encuestados.setMiembro(new Encuestado(nombre, apellido, ciudadDesc, servicioDesc, areaDesc)); } else { // Definido el Java Bean Colocarlo dentro del Lista de Encuestados encuestados.setMiembro(new Encuestado(nombre, apellido, ciudadDesc, servicioDesc, areaDesc, email)); } } results.close(); statement.close(); // Colocar Lista de Encuestados en la Sesion HttpSession session = request.getSession(); session.setAttribute("encuestados",encuestados); // Redireccionar a JSP de exito RequestDispatcher dispatch = getServletContext().getRequestDispatcher("/jstl/exito.jsp"); dispatch.forward(request, response); } catch (SQLException exc) { // Registrar posibles error en SQL hacia registros ("Logs") // Actualizar requisicion y llamar funcion de Rechazo getServletContext().log(" Ocurrió un error en la Base de Datos mientras se intentaba insertar datos", exc); request.setAttribute("razonrechazo", "ocurrió un error en la Base de Datos"); rechazarBusqueda(request,response); } catch (NamingException exc) { // Registrar posibles error en JNDI hacia registros ("Logs") // Actualizar requisicion y llamar funcion de Rechazo getServletContext().log(" Ocurrió un error al intentar accesar contexto JNDI", exc); request.setAttribute("razonrechazo", "ocurrió un error en la Base de Datos"); rechazarBusqueda(request,response); } finally { // Cerrar Conexion try { // Cerrar Conexión conn.close(); } catch (Exception exc) { getServletContext().log(" Ocurrió un error al intentar cerrar conexion hacia Base de Datos", exc); } } } // TERMINA Metodo Service |
La sección anterior describe la parte central del Servlet ya que contiene la lógica para realizar la búsqueda en la Base de Datos.
Se inicia un bloque try/catch/finally que incluirá el proceso de búsqueda en la Base de Datos.
Posteriormente se realiza una búsqueda JNDI por el recurso
java:/comp/env/jdbc/ConexionMySQL
que representa nuestra conexión hacia la Base de Datos, siendo asignado dicho recurso a la referenciaconn
definida anteriormente.Es generado un Objeto del tipo
Statement
, dicho Objeto es asociado con la conexión definida anteriormente.Se genera un Objeto del tipo
ResultSet
que representará los resultados de nuestra básqueda; el inicio de la búsqueda es iniciado por medio del métodoexecuteQuery
perteneciente a la ClaseStatement
.Se define un ciclo
while
para iterar sobre los resultados obtenidos de la búsqueda, en cada iteración (renglón de la Base de Datos) ocurre lo siguiente:Se extraen los valores de la búsqueda y son colocados en sus respectivas variables.
Los campos
ciudad,servicio
yarea
son representados en la Base de Datos con dígitos o caracteres individuales, por lo que se realiza una transformación hacia nombres descriptivos através de unswitch
.Se define una condicional basado en las indicaciones del usuario (sobre el despliegue de correo electrónico).
En ambos casos es generada una instancia de la Clase (Java Bean)
Encuestado
através del respectivo constructor, generada la instancia, esta misma es colocada através del métodosetMiembro
dentro de la instancia de la Clase (Java Bean)ListaEncuestado
.
Terminada la condicional y ciclo se invoca el método
close
sobre las ClasesStatement
yResultSet
para indicar el cierre de la búsqueda.Posteriormente se coloca la referencia
encuestados
en la sesión del usuario.Se genera un Objeto del tipo
RequestDispatcher
que toma como parámetro el JSPexito.jsp
.Se invoca el método
forward
del Objetodispatch
que retorna el control hacia la página definida en el ObjetoRequestDispatcher
, en este caso el JSPexito.jsp
.Se define la sección catch del Bloque, que invoca el método
rechazarBusqueda
en caso de ocurrir un error imprevisto en la conexión o en la búsqueda JNDI.Finalmente se define la sección finally que cierra la conexión hacia la Base de Datos.
/** Redirecciona Errores a un Java Server Page **/ public void rechazarBusqueda(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException, ServletException { RequestDispatcher dispatch = getServletContext().getRequestDispatcher("/jstl/error.jsp"); dispatch.forward(request, response); } |
El método rechazarBusqueda
definido anteriormente es invocado en caso de ocurrir cualquier tipo de error al momento de buscar datos, a continuación se describe:
Se genera un Objeto del tipo
RequestDispatcher
que toma como parámetro el JSPerror.jsp
.Se invoca el método
forward
del Objetodispatch
que retorna el control hacia la página definida en el ObjetoRequestDispatcher
, en este caso el JSPerror.jsp
.