Vea el CODIGO FUENTE del Servlet ConfirmarActualizarServlet.java |
Código Fuente ActualizarServlet.java
Debido a la longitud del Servlet, éste se encuentra dividido en cuatro 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.*; public class ActualizarServlet 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)
ActualizarServlet
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 a través del objetorequest
y seguido se definen dos variables para asignar la conexión (Connection
) y recurso (DataSource
) hacia la Base de Datos.
// Conectarse a la Base de Datos try { // Traer el Contexto JNDI Context initContext = new InitialContext(); Context ctx = (Context)initContext.lookup("java:/comp/env"); // BLOQUE try/catch/finally continua |
La sección anterior describe la parte central del Servlet ya que contiene la lógica para buscar el usuario (id) que será actualizado.
Se inicia un bloque try/catch/finally que incluirá el proceso de búsqueda en la Base de Datos.
Primeramente es generado un objeto de Contexto Inicial JNDI en el cual se realiza una búqueda vía el método
lookup
sobrejava:/comp/env
. El parámetrojava:/comp/env
representa la ruta base donde son colocados todos los recursos JNDI en un ambiente J2EE, dicho valor es definido de esta manera en la misma especificación J2EE. (NOTA: Este contexto no es lo mismo que el contexto de un Servlet utilizado en ejemplos anteriores).Una vez definido y encontrado el contexto inicial JNDI, se realiza otra búsqueda sobre esta ruta base intentando ubicar el recurso
jdbc/ConexionMySQL
, dicho recurso es asignado a la variabledataSource
que representará nuestra Base de Datos.Posteriormente a través del método
getConnection
de la ClaseDataSource
se genera una conexión hacia la Base de Datos la cual es asignada a la variableconn
.
|
Descritos los detalles de JNDI, a continuación se describe el resto del bloque try/catch/finally.
// BLOQUE try/catch/finally continuado // Verificar si existe usario por Id String sql_busca = "select * from CURSOJSP_ENCUESTA where id = ?"; PreparedStatement statement = conn.prepareStatement(sql_busca); statement.setString(1,id); ResultSet result = statement.executeQuery(); boolean rs = result.next(); if (rs) { // Si existe el usario colocar valores de la Base de Datos // en Variables String nombre = result.getString(2); String apellido = result.getString(3); int ciudadPrim = result.getInt(4); int servicioPrim = result.getInt(5); int areaPrim = result.getInt(6); String email = result.getString(7); // Los valores extraidos de la Base de Datos // son un integer primitivo. // Para que estos valores pueden ser colocados en la sesion Integer ciudad = new Integer(ciudadPrim); Integer servicio = new Integer(servicioPrim); Integer area = new Integer(areaPrim); // Llamar pagina para modificar datos // Colocar los valores extraidos de la Base de Datos // en el Objeto Session HttpSession session = request.getSession(); session.setAttribute("nombre",nombre); session.setAttribute("apellido",apellido); session.setAttribute("ciudad",ciudad); session.setAttribute("servicio",servicio); session.setAttribute("area",area); session.setAttribute("email",email); session.setAttribute("id",id); // Redireccionar directamente a JSP para modificar Datos RequestDispatcher dispatch = getServletContext().getRequestDispatcher("/servidordatos/actualizarConf.jsp"); dispatch.forward(request, response); } else { request.setAttribute("razonrechazo", "no existe el usario con el numero seleccionado"); rechazarActualizar(request,response); } statement.close(); result.close(); } 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 actualizar datos", exc); request.setAttribute("razonrechazo", "ocurrió un error en la Base de Datos"); rechazarActualizar(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"); rechazarActualizar(request,response); } finally { // Cerrar Conexion try { conn.close(); } catch (Exception exc) { getServletContext().log(" Ocurrió un error al intentar cerrar conexion hacia Base de Datos", exc); } } } // Termina Metodo Service |
Se define una secuencia de búqueda para verificar que el usuario (id) proporcionado exista; nótese que la secuencia contiene el carácter
"?"
, dicho carácter será substituido por el dato proporcionado por el usuario.Es generado un Objeto del tipo
PreparedStatement
, a diferencia de la ClaseStatement
mediantePreparedStatment
es posible modificar parámetros de la secuencia SQL que cambian cada vez que sea producida una acción, esto permite que sea realizada una búsqueda en base al dato especifico proporcionado por el usuario; dicho Objeto es asociado con la conexión definida anteriormente, lo cual ocurre de la misma manera que la ClaseStatement
.A través del método
setString
del Objetostatement
es asociada la variable a la secuencia de búqueda SQL, los parámetros de este método indican la posición y valor asignado, donde la posición es representada por el carácter"?"
.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 ClasePreparedStatement
.Debido a que la búsqueda anterior retornará un renglón o un resultado nulo, se utiliza el método
next()
para verificar si existe el usuario (id), si el resultado denext
es verdadero esto indica que fue retornado un resultado, caso contrario (falso) indica un resultado nulo; el valor de este método (next()
) es asignado a la variablers
.Es declarada una condicional en base al resultado de la variable
rs
que indica la existencia del usuario (id) en la Base de Datos, si dicho usuario (id) existe ocurre lo siguiente :Se extraen los valores de la búsqueda y son colocados en sus respectivas variables.
Posteriormente se colocan estos mismos valores en la sesión del usuario; nótese que algunos de estos valores tuvieron que ser manipulados con anterioridad debido a que ciertos valores son del tipo
integer
primitivo y en el Objetosession
estos deben ser colocados comoInteger
(Objeto)."Java Beans" en
session
El proceso de colocar las diversas variables dentro del objeto
session
individualmente puede ser un proceso muy tedioso, ante este tipo de diseños resulta ideal emplear "Java Beans", el uso de "Java Beans" en este tipo de situaciones será descrito posteriormente.Se genera un Objeto del tipo
RequestDispatcher
que toma como parámetro el JSPactualizarConf.jsp
.-
Se invoca el método
forward
del Objetodispatch
que retorna el control hacia la pagina definida en el ObjetoRequestDispatcher
, en este caso el JSPactualizarConf.jsp
.
En caso de no existir el usuario (id) en la Base de Datos:
Se invoca el método
rechazarActualizar
con los Objetosrequest
yresponse
indicando el tipo de error que ocurrió (NOTA: El métodorechazarActualizar
se describe posteriormente).Terminada la condicional se invoca el método
close
de las ClasesPreparedStatement
yResultSet
para indicar el cierre de la búsqueda.Se define la sección catch del Bloque, la cual también invoca el método
rechazarActualizar
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 rechazarActualizar(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException, ServletException { RequestDispatcher dispatch = getServletContext().getRequestDispatcher("/servidordatos/error.jsp"); dispatch.forward(request, response); } |
El método rechazarActualizar
definido anteriormente es invocado en caso de ocurrir cualquier tipo de error en la Base de 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
.