Mantenimiento de una tabla en Oracle con Java y JSP – 14/15 – Crear un Servlet Controlador.

Capa BD
01. Crear una BD en Oracle.
02. Crear una Tabla con clave primaria.
03. Crear un secuenciador.
04. Implementar sentencias para mantenimiento de la tabla.
05. Crear un package en la BD.
06. Crear un SP con un cursor como parametro de salida.
07. Crear un SP para devolver nombres similares de un campo.

Applicacion Web
08. Crear Un proyecto Web en Java.

Capa modelo
09. Crear Una clase Entidad (una clase simple).
10. Obtener una Conexión hacia la BD.
11. Crear un Statement simple.
12. Crear un PreparedStatement con parametros.
13. Crear un CallableStatement con un cursor como parametro de salida.

Capa Controlador
14. Crear un Servlet Controlador.

Capa Vista
15. Crear una pagina JSP con un formulario.

Anexos
01. Cadena de conexión.
02. Interface connection.
03. Clase OracleDataSource.
04. SQLException.
05. try – catch.
06. RequestDispatcher.

Crear un Servlet Controlador

Preparación:


Se debe crear un paquete en el que se colocaran los Servlets, por simplicidad se llamara servlets.

Como se hace

En Netbeans

Crear el paquete “servlets”

Clic derecho en “Source Packages”->New->Java Package
Se abrira la ventana “New Java Package”
En Package Name poner : servlets
Dar clic en el boton Finish.

Crear el Servlet “CtrLinea”

Clic derecho en el paquete servlets->New->Servlet
Aparece la pantalla “New Servlet”
En Class Name poner : CtrLinea
Dar clic en el boton Finish.

Abrir el archivo e importar las sgtes. clases :

import java.sql.SQLException;
import java.util.List;
import javax.servlet.RequestDispatcher;
import modelo.Linea;

De forma manual

Crear el paquete “servlets”

En una ventana de comandos o en el Explorador de Archivos ubicarse en el directorio src del Proyecto Web. Simplemente crear el directorio “servlets”

Crear el Servlet “CtrLinea”

De la misma forma ubicarse en el directorio “servlets” y crear un archivo CtrLinea.java
Con el sgte contenido:

package servlets;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.RequestDispatcher;
import modelo.Linea;

public class CtrLinea extends HttpServlet {

   protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

   }

   protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
   }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

}

Luego abrir el archivo “Aplicacion web”\web\WEB-INF\web.xml, que tendra una apariencia similar a lo sgte :

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>

Configuracion del Servlet CtrLinea

Dentro de la etiqueta <web-app> agregar la configuracion de nuestro Servlet.

    <servlet>
        <servlet-name>CtrLinea</servlet-name>
        <servlet-class>servlets.CtrLinea</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>CtrLinea</servlet-name>
        <url-pattern>/linea</url-pattern>
    </servlet-mapping>

Luego se hara una prueba de los metodos del objeto linea que hacen mantenimiento de la tabla Linea.
Esto se hara dentro del metodo processRequest.

Insercion de un registro

        PrintWriter out = response.getWriter();
        int idLinea;
        String nombre;
        int estado;
        int oper;
        String filtro = "";
        Linea objLinea = new Linea();
        try {
                 idLinea=1;
                 nombre="Linea1";
                 estado=1;

                  System.out.println("Insertando");
                  objLinea.insertar(idLinea, nombre, estado);

        } catch (SQLException e) {
            // Check for and return connection error or SQL error.
            if (e.getSQLState() == null) {
                System.out.println(
                        new SQLException("Oracle Thin Client Net8 Connection Error.",
                        "ORA-" + e.getErrorCode()
                        + ": Incorrect Net8 thin client arguments:nn", e.getErrorCode()).getSQLState());

            } else {
                System.out.println(e.getMessage());
            }
         finally {
                 //block finally usado para cerrar recursos
            try {
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException se) {
                se.printStackTrace();
            }//fin finally try
        }

Actualizacion de un registro

        PrintWriter out = response.getWriter();
        int idLinea;
        String nombre;
        int estado;
        int oper;
        String filtro = "";
        Linea objLinea = new Linea();
        try {
                 idLinea=1;
                 nombre="Linea_1";
                 estado=1;
                  System.out.println("Modicando");
                  objLinea.modificar(idLinea, nombre, estado);

        } catch (SQLException e) {
            // Check for and return connection error or SQL error.
            if (e.getSQLState() == null) {
                System.out.println(
                        new SQLException("Oracle Thin Client Net8 Connection Error.",
                        "ORA-" + e.getErrorCode()
                        + ": Incorrect Net8 thin client arguments:nn", e.getErrorCode()).getSQLState());

            } else {
                System.out.println(e.getMessage());
            }
         finally {
                 //block finally usado para cerrar recursos
            try {
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException se) {
                se.printStackTrace();
            }//fin finally try
        }

Eliminación de un registro

        PrintWriter out = response.getWriter();
        int idLinea;
        String nombre;
        int estado;
        int oper;
        String filtro = "";
        Linea objLinea = new Linea();
        try {
                 idLinea=1;
                 nombre="Linea_1";
                 estado=1;
                  System.out.println("Eliminando");
                  objLinea.eliminar(idLinea);

        } catch (SQLException e) {
            // Check for and return connection error or SQL error.
            if (e.getSQLState() == null) {
                System.out.println(
                        new SQLException("Oracle Thin Client Net8 Connection Error.",
                        "ORA-" + e.getErrorCode()
                        + ": Incorrect Net8 thin client arguments:nn", e.getErrorCode()).getSQLState());

            } else {
                System.out.println(e.getMessage());
            }
         finally {
                 //block finally usado para cerrar recursos
            try {
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException se) {
                se.printStackTrace();
            }//fin finally try
        }

Busqueda de un registro por id

        PrintWriter out = response.getWriter();
        int idLinea;
        String nombre;
        int estado;
        int oper;
        String filtro = "";
        Linea objLinea = new Linea();
        try {
                  idLinea=1;
                  nombre="Linea_1";
                  estado=1;
                  System.out.println("Buscando x id");
                  String[][] resLinea = objLinea.selectLineaSP(idLinea);
                  //Mostramos el contenido del arreglo
                  for (int i = 0; i < resLinea.length; i++) {
                      if (resLinea[i]==null)
                          break;
                      for (int j = 0; j < resLinea[i].length; j++) {
                          out.println(resLinea[i][j]);
                      }
                  }
        } catch (SQLException e) {
            // Check for and return connection error or SQL error.
            if (e.getSQLState() == null) {
                System.out.println(
                        new SQLException("Oracle Thin Client Net8 Connection Error.",
                        "ORA-" + e.getErrorCode()
                        + ": Incorrect Net8 thin client arguments:nn", e.getErrorCode()).getSQLState());

            } else {
                System.out.println(e.getMessage());
            }
         finally {
                 //block finally usado para cerrar recursos
            try {
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException se) {
                se.printStackTrace();
            }//fin finally try
        }

Busqueda de nombres similares en la columna Descripcion

        PrintWriter out = response.getWriter();
        int idLinea;
        String nombre;
        int estado;
        int oper;
        String filtro = "";
        Linea objLinea = new Linea();
        try {
                  idLinea=1;
                  nombre="Linea_1";
                  estado=1;
                  System.out.println("Buscando nombres similares");
                  List<String[]> resLinea = objLinea.selectLineaSP3(filtro);

                  if (resLinea != null && resLinea .size() > 0) {
                      for (int i = 0; i < resLinea .size(); i++) {
                          if (resLinea .get(i) != null) {
                              nroCols = resLinea .get(i).length;
                              for (int j = 0; j < nroCols; j++) {
                                  out.print(rsLista.get(i)[j]);
                              }
                          }
                      }
                  }//fin de if

        } catch (SQLException e) {
            // Check for and return connection error or SQL error.
            if (e.getSQLState() == null) {
                System.out.println(
                        new SQLException("Oracle Thin Client Net8 Connection Error.",
                        "ORA-" + e.getErrorCode()
                        + ": Incorrect Net8 thin client arguments:nn", e.getErrorCode()).getSQLState());

            } else {
                System.out.println(e.getMessage());
            }
         finally {
                 //block finally usado para cerrar recursos
            try {
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException se) {
                se.printStackTrace();
            }//fin finally try
        }

Crear el formulario

        <form action="linea" method="POST">
            Id Linea : <input type="text" name="idLinea">
            Nombre : <input type="text" name="nombre">
            Estado : <input type="text" name="estado"><br>
            Oper :   <input type="text" name="oper" value="1">
            <input type="Submit" name="guardar" id="idguardar" value="Guardar">
        </form>

Cambios en bloque try para manejar datos del Formulario index.jsp

                //Si el boton pulsado ha sido Guardar
                if (request.getParameter("guardar") != null) {

                    nombre = request.getParameter("nombre").toString();
                    estado = Integer.parseInt(request.getParameter("estado").toString());

                    //Si el parametro oper es 2 indica una actualizacion
                    if (request.getParameter("oper") != null && request.getParameter("oper").equals("2")) {
                        idLinea = Integer.parseInt(request.getParameter("idLinea").toString());
                        //Cambiar un dato en la tabla

                        objLinea.modificar(idLinea, nombre, estado);
                        System.out.println("Modicando");

                        //Sino oper es 1 e indica una insercion
                    } else {
                        //objLinea.insertar(idLinea, nombre, estado);
                        System.out.println("Insertando");
                        objLinea.insertar(-1, nombre, estado);
                    }
                }

Modificacion en CtrLinea e index.jsp para mostrar resultados de busquedas

//Agregar antes de finalizar el if de "guardar"
//Volvemos a mostrar la lista de productos
filtro = request.getParameter("filtro").toString();
List<String[]> resLinea = objLinea.selectLineaSP3(filtro);

request.setAttribute("rsLinea", resLinea);


<%@page import="java.io.IOException"%>
<%@page import="java.util.List"%>
<%!    String idLinea = "";
    String nombre = "";
    String estado = "";
    String oper = "1";
    String filtro = "";
%>

<%!    public void mostrarDatosLista(JspWriter out, List<String[]> rsLista) throws IOException {
        int nroCols = 0;
        if (rsLista != null && rsLista.size() > 0) {
            for (int i = 0; i < rsLista.size(); i++) {
                if (rsLista.get(i) != null) {
                    nroCols = rsLista.get(i).length;
                    //Por cada fila se crea una tr nueva

                    if (i % 2 == 0) {
                        out.print("<tr>");
                    } else {
                        out.print("<tr class="odd">");
                    }
                    for (int j = 0; j < nroCols; j++) {
                        out.print("<td>");
                        out.print(rsLista.get(i)[j]);
                        out.print("</td>");
                    }
                }
                out.print("</tr>");
            }

        } else {
            out.println("<tr><td colspan="3">El estado de la conexion a la BD NO es OK </td></tr>");
        }
    }
%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
        <form action="linea" method="POST">
            <input type="hidden" name="idLinea">
            Nombre : <input type="text" name="nombre">
            Estado : <input type="text" name="estado"><br>
            <input type="hidden" name="oper" value="1">
            Buscar : <input type="text" name="filtro">

            <input type="Submit" name="guardar" id="idguardar" value="Guardar">
            <input type="Submit" name="buscar" value="Buscar">
        </form>

        <% List<String[]> rsLista = (List<String[]>) request.getAttribute("rsLinea");
        %>
        <table>
            <th>*</th><th>Descripcion</th><th>Estado</th>
            <%
                mostrarDatosLista(out, rsLista);
            %>
        </table>

Como funciona :

El servlet es una clase cuyo ciclo de vida es gestionado por el contenedor, no tiene constructor para ser usado explicitamente, porque el encargado de instanciarlo es el contenedor de Servlets.

En el archivo CtrLinea.java, la Clase CtrLinea es declarada como subclase de HttpServlet y ubicada dentro del paquete servlets.

Se importaran las sgtes clases :

java.io.IOException : que maneja las excepciones de IO

java.io.PrintWriter : la clase HttpServletResponse contiene una
referencia a esta clase que es usada para contener el texto de
 respuesta enviado al cliente.

java.sql.SQLException : maneja las excepciones de JDBC.

java.util.List : clase usada para contener los datos resultSets
para poder usarlos en la vista.

javax.servlet.ServletException : maneja las excepciones de los
Servlets.

javax.servlet.http.HttpServlet : clase que representa un Servlet Http.

javax.servlet.http.HttpServletRequest : representa una peticion
hecha por un cliente.

javax.servlet.http.HttpServletResponse : representa la respuesta
enviada al cliente.

javax.servlet.RequestDispatcher : es una clase que se encarga de
redireccionar las respuestas a un determinado objeto, es la que
ayuda a direccionar el flujo en el modelo MVC.

modelo.Linea : es nuestra clase que interactua con la BD mediante JDBC.

Configuracion del Servlet CtrLinea

Para instanciar un Servlet, el contenedor necesita cierta informacion sobre el mismo, por eso provee un archivo llamado web.xml en el que se hara una descripcion del Servlet.
La raiz del documento XML es <web-app> y dentro de el vamos a colocar la configuracion del Servlet :
En la etiqueta servlet
servlet-name identificara al Servlet en el contenedor.
servlet-class es el nombre calificado completo de la clase Servlet que hemos creado.

En la etiqueta servlet-mapping
servlet-name es el mismo identificador de la etiqueta servlet.
url-pattern es el formato de url que esta asociado a nuestro Servlet, en el ejemplo al comenzar con / indica que es un url absoluto, y que el / equivale al url de la aplicacion web.

Insercion un registro

Obtenemos el objeto PrintWriter que forma parte del objeto HttpServletResponse.
Declaramos idLinea, nombre, estado que corresponden a los campos de la tabla Linea.
Declaramos el filtro que se usara en consultas y oper que se usara cuando se tenga que diferenciar operaciones con la BD.
Creamos un objeto Linea.
Agregamos los bloques try – catch – finally.
El catch se encargara del manejo de las SQLException.
El bloque finally se encarga de limpiar las conexiones si se produce alguna excepcion.
Dentro del bloque try se llevará a cabo la insercion.
Usando las variable idLinea, nombre y estado llamamos al metodo insertar del objeto objLinea que creara un nuevo registro en la BD.

Actualizacion de un registro

La variacion que se hace es en las variables que idLinea, nombre y estado que se usaran para llamar al metodo modificar del objeto objLinea.

Eliminacion de un registro

El funcionamiento de una eliminacion se hace colocando la variable idLinea en el metodo eliminar del objeto objLinea.

Busqueda de un registro x id

El funcionamiento de una busqueda x id se hace colocando la variable idLinea en el metodo selectLineaSP del objeto objLinea.
Este metodo retornara un array de Strings de dos dimensiones que se asignara al array resLinea de tipo String[][].
Usando un for para las filas y un for para las columnas iremos mostrando cada campo de cada registro, pero antes de cada iteracion a traves de las columnas se validara si existen todavia registros que mostrar, si no los hubiera se sale del bucle con break;.

Busqueda de nombres similares en la columna Descripcion

El funcionamiento de una busqueda de nombres similares se hace colocando la variable filtro en el metodo selectLineaSP3 del objeto objLinea.
Este metodo retornara una Lista de array de Strings que se asignara al objeto resLinea de tipo List<String[]>.
Una Lista tiene la ventaja de ser de tamaño variable a diferencia de los arrays que son declarados con tamaño fijo.
Antes de iterar sobre los resultados validamos el resultado con estas dos posibilidades : si es nulo y si no contiene datos.
Usando un for para las filas y un for para las columnas iremos mostrando cada campo de cada registro, pero antes de cada iteracion a traves de las columnas se validara si existen todavia registros que mostrar, esto es solo por convencion puesto que en la forma que hemos creado esta lista, esta no almacenara arrays de Strings nulos.

Crear el formulario

Este formulario tiene como action al controlador CtrLinea, porque usa el URL “linea” designado para usar a este controlador.
El formulario consta de 4 inputs de tipo text para el idlinea, el nombre, el estado y el valor oper respectivamente, el valor por defecto de oper es 1 que indica una operacion de insercion, el valor 2 indica una modificacion y el valor 3 indica una eliminacion, por ultimo tiene un boton tipo submit llamado “guardar”.

Cambios en bloque try para manejar datos del Formulario index.jsp

Si el parametro guardar es diferente de null, significa que ha sido pulsado y se hara lo sgte :
Obtener los parametros nombre y estado y asignarlos a sus respectivas variables en este bloque de codigo.
Luego evaluar si el parametro “oper” no es nulo y tiene el valor 2 , lo que indicaria que se hara una modificacion, si ese es el caso, se obtiene el parametro idlinea y se asigna su respectiva variable.
Con este ultimo dato se invoca al metodo modificar del objeto objLinea con lo que se finalizara el proceso de actualizacion.
Si el parametro oper tiene el valor de 1, indica una insercion. Esta insercion se hace invocando al metodo insertar del objto objLinea en donde el primer al argumento tiene el valor de -1 porque no se usara ya que para insertar usamos un secuenciador que obtiene el sgte indice correcto para la clave primaria de la tabla.

Modificacion en CtrLinea e index.jsp para mostrar resultados de busquedas

En el controlador CtrLinea,se hara uso de atributos para “pasar” datos hacia el servidor.
Obtenemos el parametro filtro y lo asignamos a su variable respectiva, luego con esta variable invocamos al metodo selectLineaSP3(filtro) para obtener una Lista de array de Strings. Esta lista la asignamos a la variable resLinea de tipo List<String[]>
Por ultimo para agregar un atributo a la peticion se usa el metodo setAttribute(nombre, valor) del objeto HttpServletRequest. Como nombre le pondremos rsLinea y como valor la lista resLinea.

En la pagina index.jsp haciendo uso de la directiva page importamos java.util.List y java.io.IOException.
En un bloque de declaraciones se coloca las variables de tipo String idLinea, nombre, estado, nombre y filtro, la variable oper la inicializamos con “1” para indicar que de forma predeterminada se hace una insercion de registros en la BD con los datos del formulario.

Declaramos tambien el metodo mostrarDatosLista con dos argumentos : uno de tipo JspWriter y otro de tipo List<String[]>
Este metodo se encargara de agregar filas <tr> a la pagina jsp conforme a la cantidad de elementos de la Lista.

En el formulario se modifico los campos idLinea y oper al tipo “hidden”, se agrego el input con name filtro de tipo text y el boton con name “buscar” de tipo Submit.

Para obtener la lista de items de la tabla Linea se usa el metodo getAttribute(nombre) del objeto request, que esta todavia en el ambito del servidor (“esta de paso”) y obtenemos el atributo “rsLinea”. A este atributo se le hace una cast a List<String[]> y lo asignamos a la variable rsLista del mismo tipo.
Se coloca una tabla con tres columnas, una para cada campo de la tabla Linea e invocamos al metodo mostrarDatosLista de esta pagina con estos argumentos out (miembro de la pagina jsp) y rsLista.

Anuncios

Un comentario en “Mantenimiento de una tabla en Oracle con Java y JSP – 14/15 – Crear un Servlet Controlador.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s