Servlet

El día de ayer fue la quinta sesión del curso de servlet en java con el profesor didier tobon cuartas de la especialización tecnológica que estoy  realizando en el SENA en el centro  de tecnología de la  manufactura avanzada.

En estos momentos decidí realizar una especie de  referencia  para tener un concepto globalizado del tema y  lograr contextualizar esta temática.

primero que todo un gráfico que nos mostrara el escenario

El servlet es un proceso que se ejecuta  los servidores web y actúan como  la capa intermedia entre un navegador  web y otra aplicación http o entre base de datos y aplicaciones http.

Su ciclo es:

metodo init()

se ejecuta una sola vez al iniciar el servlet

metodo doGet()  o doPost()

recoge peticiones de usuarios y ejecuta operaciones, manda respuesta al usuario (html).

metodo destroy()

cerra procesos en curso, libera memoria.

Su estructura es:

//Se importan los paquetes con las clases para Servlets y HttpServlets

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

// Se esta creando una clase llamada ServletEstructura que hereda de la clase HttpServlet y viene en la API de java

public class ServletEstructura extends HttpServlet {

// Declaración de variables miembro correspondientes a los campos del formulario

private String nombre=null; // ej:  En el formulario hay una caja de texto con este nombre y aquí se declara inicializando como campo vacio

private String apellidos=null; //ej: En el formulario hay una caja de texto con este nombre y aquí se declara inicializando como campo vacio

/*  Este método se ejecuta una única vez al ser inicializado el servlet, Se suelen inicializar variables y realizar operaciones  como abrir bases de datos, etc) */

public void init(ServletConfig config) throws ServletException {

//  Llamada al método init() de la superclase (GenericServlet) Así se asegura una correcta inicialización del servlet

super.init(config);

System.out.println(“Iniciando ServletEstructura…”);

}

// Método llamado mediante un HTTP POST. Este método se llama automáticamente al ejecutar un formulario HTML

public void doPost (HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {

// Adquisición de los valores del formulario a través del objeto

nombre=request.getParameter(“nombre”);apellidos=request.getParameter(“apellidos”);

// Devolver al usuario una página HTML con los valores adquiridos

devolverPagina(resp); // se esta llamando a un metodo que se llama devolverPagina

}

public void devolverPagina(HttpServletResponse resp) {

// En primer lugar se establece el tipo de contenido MIME de la respuesta

resp.setContentType(“text/html”);

// Se obtiene un PrintWriter donde escribir (sólo para mandar texto)

PrintWriter out = null;

try {

out=resp.getWriter();

}

catch (IOException io) {

System.out.println(“Se ha producido una excepcion”);}

// Se genera el contenido de la página HTML

out.println(“<html>”);   out.println(“<head>”);   out.println(“<title>Valores recogidos en el formulario</title>”);   out.println(“</head>”);             out.println(“<body>”);   out.println(“<b><font size=+2>Valores recogidos del formulario: </font></b>”);   out.println(“<p><font size=+1>           <b>Nombre: </b>”+nombre+”</font>”);    out.println(“<br><fontsize=+1><b>Apellido: </b>”+apellidos+”</font><b><font size=+1>                   </font></b>”);   out.println(“</body>”);   out.println(“</html>”);

// Se fuerza la descarga del buffer y se cierra el PrintWriter,

out.flush();

out.close();

}

/*  Este método es llamado por el servidor web al “apagarse” . Sirve para proporcionar una desconexión de una base de datos, etc. */

public void destroy() {

System.out.println(“cerrado…”);

}

}

para acceder a una base de datos:

hay un conjunto de funciones  y procedimientos (API)  de java  que nos permite ejecutar sentecias SQL,  Es  “JDBC”  las cuales nos permite:

  • establecer una conexion con una base de datos desde java
  • enviar sentencias sql desde dicha conexion
  • procesar los resultados

la API   JDBC 3.0  comprende dos paquetes:

  • java.sql
  • javax.sql

viendo un dibujo sería:

como se haría

Básicamente, los pasos a seguir son:

  • Registrar un driver:   Clase DriverManager
  • Establecer una conexión con la base de datos :Interface Connection
  • Enviar sentencias SQL a la base de datos: Interface Statement
  • Procesar los resultados de las consultas   Interface ResultSet

ALGO ASI:

Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);

// Interface Connection
Connection con = DriverManager.getConnection(ruta bd);
//Interface Statement
Statement stmt = con.createStatement();
//Interface ResultSet
ResultSet rs =    stmt.executeQuery(″SELECT a, b, c FROM Tabla″);
 
While(rs.next()){

int i = rs.getInt(”  a”);

String s = rs.getString(“b”  );

Float f = rs.getFloat(“c”);

System.out.println(“ROW= ” + i + ” ” + s +     ”  “+ f);

}

ahora bien  la estructura anterior se le añadirá otras lineas de codigo quedando:

//Se importan los paquetes con las clases

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

import java.sql.*;

public class ServletEstructuraBd extends HttpServlet {

// Declaración de variables miembro

private String nombre = null;

private String apellidos = null;

// Referencia a un objeto de la interface java.sql.Connection

Connection con = null;

/*  Este método se ejecuta una única vez al ser inicializado el servlet, Se suelen inicializar variables y realizar operaciones  como abrir bases de datos, etc) */

public void init (ServletConfig config) throws ServletException {

super.init(config);

// dsn (Data Source Name) de la base de datos

String dsn = new String(“jdbc:odbc:comosellamoDsn”);

// si es exitoso se hace lo de try sino el catch

try {

Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);

}

catch(ClassNotFoundException ex) {

System.out.println(“Error al cargar el driver”);

System.out.println(ex.getMessage());

}

// Establecimiento de la conexión con la base de datos

try {

con = DriverManager.getConnection(dsn, “”, “”);

}

catch (SQLException sqlEx) {

System.out.println(“Se ha producido un error al establecer la conexión con: ”  + dsn);

System.out.println(sqlEx.getMessage());

}

System.out.println(“Iniciando ServletEstructuraBd…”);

}

//———————————————————-o—————————————————

// Método de llamada mediante un HTTP POST

public void doPost (HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {

boolean hayError = false;

// adquisición de los valores del formulario

if(req.getParameter(“nombre”)!=null)

nombre = req.getParameter(“nombre”);

else

hayError=true;

if(req.getParameter(“apellidos”)!=null)

apellidos = req.getParameter(“apellidos”);

else

hayError=true;

// Mandar al usuario los valores adquiridos (Si no se ha producido error)

if(!hayError) {

if (actualizarBaseDeDatos() == 0)

devolverPagina(resp);

else

resp.sendError(500, “Se ha producido un error”+” al actualizar la base de datos”);

}

else

resp.sendError(500, “Se ha producido un error”+” en la adquisición de parámetros”);

}

public int actualizarBaseDeDatos() {

// crear un statement de SQL

Statement stmt=null;

int numeroFilasActualizadas=0;

// Ejecución del query de actualización de la base de datos

try {

stmt = con.createStatement();

numeroFilasActualizadas = stmt.executeUpdate(“INSERT INTO”+” tabla” VALUES”+”(‘”+nombre+”‘,'”+apellidos”‘)”);

if(numeroFilasActualizadas!=1) return -1;

}catch (SQLException sql) {

System.out.println(“Se produjo un error creando Statement”);

System.out.println(sql.getMessage());

return -2;

}

finally {

// Se cierra el Statement

if(stmt!=null)

try {

stmt.close();

}

catch(SQLException e){

System.out.println(“Error cerrando Statement”);

System.out.println(e.getMessage());

return -3;

}

}return 0;

}

}

public void devolverPagina(HttpServletResponse resp) {

// Se obtiene un PrintWriter donde escribir (sólo para mandar texto)

PrintWriter out=null;

try {

out=resp.getWriter();

} catch (IOException io) {

System.out.println(“Se ha producido una excepcion”);

}

// Se establece el tipo de contenido MIME de la respuesta

resp.setContentType(“text/html”);

// Se mandan los valores

out.println(“<html>”);out.println(“<head>”);out.println(“<title>Valores recogidos en el formulario</title>”);out.println(“</head>”);out.println(“<body>”);out.println(“<b><font size=+2>Valores recogidos del”);out.println(“formulario: </font></b>”);out.println(“<p><font size=+1><b>Nombre: </b>”+nombre+”</font>”);out.println(“<br><fontsize=+1><b>Apellido : </b>”+apellidos+”</font><b><font size=+1></font></b>”);oout.println(“<P><HR><CENTER><H2>Valores actualizados “+”con éxito</CENTER>”);out.println(“</body>”);out.println(“</html>”);

// Se fuerza la descarga del buffer y se cierra el PrintWriter

out.flush();

out.close();

}

//————————————————-o———————————————————————————–

// Este método es llamado por el servidor web al “apagarse” . Sirve para proporcionar una correcta desconexión de una base de datos,etc.

public void destroy () {

super.destroy();

System.out.println(“Cerrando conexion…”);

try {

conn.close();

}catch(SQLException ex){

System.out.println(“No se pudo cerrar la conexion”);

System.out.println(ex.getMessage());

}

}

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s