| 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.sqlque representa las Clases para conectarse a Bases de Datos,java.utilque contiene Clases utilitarias Java,javax.sqlque contiene las implementaciones más recientes para Bases de Datos (DataSource) yjavax.namingque proporciona las Clases para localizar recursos vía JNDI ("Java Naming Directory Interface").Se define la Clase(Servlet)
ActualizarServletla cual hereda("inherit") el comportamiento deHttpServletcomo lo hace cualquier otro Servlet; de la misma manera se declara el método principal del Servlet (service) que contiene los conocidos objetos de entradaHttpServletRequestyHttpServletResponse.Como primer paso dentro del método
servicese extraen los datos introducidos por el usuario en la forma HTML a través del objetorequesty 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
lookupsobrejava:/comp/env. El parámetrojava:/comp/envrepresenta 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 variabledataSourceque representará nuestra Base de Datos.Posteriormente a través del método
getConnectionde la ClaseDataSourcese 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 ClaseStatementmediantePreparedStatmentes 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
setStringdel Objetostatementes 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
ResultSetque representará los resultados de nuestra básqueda; el inicio de la búsqueda es iniciado por medio del métodoexecuteQueryperteneciente 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 denextes 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
rsque 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
integerprimitivo y en el Objetosessionestos deben ser colocados comoInteger(Objeto)."Java Beans" en
sessionEl proceso de colocar las diversas variables dentro del objeto
sessionindividualmente 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
RequestDispatcherque toma como parámetro el JSPactualizarConf.jsp.-
Se invoca el método
forwarddel Objetodispatchque 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
rechazarActualizarcon los Objetosrequestyresponseindicando el tipo de error que ocurrió (NOTA: El métodorechazarActualizarse describe posteriormente).Terminada la condicional se invoca el método
closede las ClasesPreparedStatementyResultSetpara indicar el cierre de la búsqueda.Se define la sección catch del Bloque, la cual también invoca el método
rechazarActualizaren 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
RequestDispatcherque toma como parámetro el JSPerror.jsp.Se invoca el método
forwarddel Objetodispatchque retorna el control hacia la página definida en el ObjetoRequestDispatcher, en este caso el JSPerror.jsp.
