universidaddonbosco ......desarrollo de aplicaciones con web frameworks guía de laboratorio no. 01...

48
1 UNIVERSIDADDONBOSCO FACULTADDEESTUDIOSTECNOLÓGICOS COORDINACIÓNDECOMPUTACIÓN Y MÓVILES Ciclo II Desarrollo de aplicaciones con Web Frameworks Guía de Laboratorio No. 01 Introducción al modelo MVC con el IDE Eclipse I.OBJETIVOS. Que el alumno comprenda el patrón de diseño MVC y pueda implementarlo en una aplicación web. II. INTRODUCCIÓN. Las aplicaciones Web están organizadas siguiendo una arquitectura de tres capas, donde la capa cliente, implementada mediante páginas web, tiene como misión la captura de datos de usuario y su envío a la capa intermedia, así como la presentación de resultados procedentes de ésta. Es la capa intermedia la que constituye el verdadero núcleo de la aplicación web, encargándose del procesamiento de los datos de usuario y la generación y envío de las respuestas a la capa cliente. Durante este proceso, la capa intermedia deberá interaccionar con la capa de datos para el almacenamiento y recuperación de información manejada por la aplicación. Son muchas las tecnologías y lenguajes que los programadores tienen a su disposición para acometer el desarrollo de la capa intermedia de una aplicación Web(Java/J2EE,PHP,ASP.NET,etc.). No obstante, de cara a afrontar con éxito su implementación, se hace necesario establecer un modelo o esquema que permita estructurar esta capa en una serie de bloques o componentes, de modo que cada uno de estos bloques tenga unas funciones bien definidas dentro de la aplicación y pueda desarrollarse de manera independiente al resto. Uno de estos patrones de diseño(con toda seguridad el más utilizado por los desarrolladores que utilizan J2EE), es la arquitectura Modelo Vista Controlador (MVC), la cual proporciona una clara separación entre las distintas responsabilidades de la aplicación.

Upload: others

Post on 22-May-2020

7 views

Category:

Documents


0 download

TRANSCRIPT

1

UNIVERSIDADDONBOSCO

FACULTADDEESTUDIOSTECNOLÓGICOS

COORDINACIÓNDECOMPUTACIÓN Y MÓVILES

Ciclo II

Desarrollo de aplicaciones con Web Frameworks

Guía de Laboratorio No. 01

Introducción al modelo MVC con el IDE Eclipse

I.OBJETIVOS.

Que el alumno comprenda el patrón de diseño MVC y pueda implementarlo en una aplicación web.

II. INTRODUCCIÓN.

Las aplicaciones Web están organizadas siguiendo una arquitectura de tres capas, donde la capa

cliente, implementada mediante páginas web, tiene como misión la captura de datos de usuario y su

envío a la capa intermedia, así como la presentación de resultados procedentes de ésta. Es la capa

intermedia la que constituye el verdadero núcleo de la aplicación web, encargándose del

procesamiento de los datos de usuario y la generación y envío de las respuestas a la capa cliente.

Durante este proceso, la capa intermedia deberá interaccionar con la capa de datos para el

almacenamiento y recuperación de información manejada por la aplicación.

Son muchas las tecnologías y lenguajes que los programadores tienen a su disposición para

acometer el desarrollo de la capa intermedia de una aplicación Web(Java/J2EE,PHP,ASP.NET,etc.).

No obstante, de cara a afrontar con éxito su implementación, se hace necesario establecer un

modelo o esquema que permita estructurar esta capa en una serie de bloques o componentes, de

modo que cada uno de estos bloques tenga unas funciones bien definidas dentro de la aplicación y

pueda desarrollarse de manera independiente al resto.

Uno de estos patrones de diseño(con toda seguridad el más utilizado por los desarrolladores que

utilizan J2EE), es la arquitectura Modelo Vista Controlador (MVC), la cual proporciona una clara

separación entre las distintas responsabilidades de la aplicación.

2

EL PATRÓN MVC

Cuando hablamos de arquitectura Modelo Vista Controlador nos referimos a un patrón de diseño

que especifica cómo debe ser estructurada una aplicación, las capas que van a componer la misma y

la funcionalidad de cada una.

Según este patrón, la capa intermedia de una aplicación Web puede ser dividida en tres grandes

bloques funcionales:

• Modelo

• Vista

• Controlador

El Modelo:

En la arquitectura MVC la lógica de negocio de la aplicación, incluyendo el acceso a los datos y su

manipulación, está encapsulada dentro del modelo. El Modelo lo forman una serie de componentes

de negocio independientes del controlador y la vista, permitiendo así su reutilización y el

desacoplamiento entre las capas.

En una aplicación J2EE el modelo puede ser implementado mediante clases estándares Java o a

través de Enterprise JavaBeans.

Resumiendo el modelo:

• Representa las entidades de negocio o los datos y encapsula en ellos el estado de la aplicación.

• Responde a preguntas sobre su estado.

• Notifica a la vista sus cambios.

La Vista:

Tal y como se puede deducir de su nombre, la vista es la encargada de generar las respuestas que

debe ser enviadas al cliente.

Cuando ésta respuesta tiene que incluir datos proporcionados por el controlador, el código HTML

de la página no será fijo si no que deberá ser generado de forma dinámica, por lo que su

implementación correrá a cargo de un página JSP.

Las páginas JSP resultan mucho más adecuadas para la generación de las vistas que los servlets

pues, al ser documentos de texto, es más sencilla la inclusión de bloques estáticos HTML y pueden

ser fácilmente mantenible por diseñadores Web con escasos conocimientos de programación.

Resumiendo la vista:

• Visualiza el modelo. Es su representación gráfica.

• Se encarga de la interacción con el usuario. Envía la información necesaria al controlador.

• Recibe notificación de las modificaciones del modelo, para que la vista pueda ser actualizada.

• Permite al controlador seleccionar la vista, ya que puede haber varias.

El Controlador:

Se puede decir que el Controlador es el “cerebro” de la aplicación. Todas las peticiones a la capa

intermedia que se realicen desde el cliente son dirigidas al Controlador, cuya misión es

determinar las acciones a realizar para cada una de estas peticiones e invocar al resto de los

componentes de la aplicación (Modelo y Vista) para que realicen las acciones requeridas en cada

caso, encargándose también de la coordinación de todo el proceso

3

Por ejemplo, en el caso de que una petición requiera enviar como respuesta al cliente determinada

información existente en una base de datos, el Controlador solicitará los datos necesarios al modelo

y una vez recibidos, se los proporcionará a la Vista para que ésta les aplique el formato de

presentación correspondiente y envíe la respuesta al cliente.

La centralización del flujo de peticiones en el controlador proporciona varias ventajas al

programador, entre ellas:

Hace que el desarrollo sea más sencillo y limpio.

Facilite el posterior mantenimiento de la aplicación haciéndola más escalable.

Facilita la detección de errores en el código.

En aplicaciones J2EE el controlador es implementado mediante un servlet central que, dependiendo

de la cantidad de tipos de peticiones que debe gestionar, puede apoyarse en otros servlets auxiliares

para procesar cada petición.

Despacho de la gestión de peticiones entres distintos servlets

Resumiendo el controlador:

• Encaminan las peticiones del usuario.

• Define el comportamiento de la aplicación.

• Convierte las acciones del usuario en modificaciones del modelo.

• Selecciona la vista a devolver.

El diagrama de interacción entre los tres componentes es el siguiente

4

La relación entre el Controlador y el Modelo es la siguiente: el controlador recibe una orden y

decide quién la lleva a cabo en el modelo. Una vez que el modelo (la lógica de negocio) termina sus

operaciones devuelve el flujo al controlador. Éste se encarga de enviar el resultado a la capa de

presentación. El controlador en cierta forma debe tener un registro de la relación entre órdenes que

le pueden llegar y la lógica de negocio que le corresponde.

En la relación entre el Modelo y la Vista se debe cumplir que, por un lado, el modelo no debe

conocer nada de la vista. La vista, por otro lado, es la representación visual del modelo y depende

de él. La vista tiene una referencia a la instancia del modelo, al igual que el control.

A diferencia de la relación entre el modelo y la vista, la vista y el controlador tienen una relación

más estrecha. Normalmente, una vista se pasa como referencia al objeto controlador.

Antes de existir el patrón MVC estas tres partes residían en una única clase, lo que hacía a las

aplicaciones no flexibles y difíciles de reutilizar. Si el cliente está en relación directa con el modelo,

cualquier cambio en el cliente afectará al modelo.

La independencia de la presentación, lógica de negocio y acceso a datos se considera fundamental

para el desarrollo de arquitecturas consistentes, reutilizables y más sencillas de mantener, genera un

ahorro de tiempo en el desarrollo de posteriores proyectos.

La arquitectura MVC aporta las siguientes ventajas:

Separación total entre lógica de negocio y presentación.

Se puede aplicar multilenguaje, distintos diseños de presentación, etc. sin alterar la lógica de

negocio.

Desarrollo de arquitecturas consistentes, reutilizables y más fáciles de mantener, y como

consecuencia de esto, ahorro de tiempo.

Funcionamiento de una aplicación MVC

Una vez analizados los distintos bloques MVC resulta sencillo comprender el funcionamiento de

este tipo de aplicaciones. Para ello, analizaremos los procesos que tienen lugar en la capa

intermedia desde que llega la petición procedente de la capa cliente hasta que se genera la respuesta.

Captura de la petición en el controlador

5

Como hemos dicho, todas las peticiones que se reciben en la aplicación son centralizadas en el

controlador, el cual a partir de la URL de la solicitud determina el tipo de la operación que quiere

llevar a cabo el cliente. Normalmente, esto se hace analizando el valor de algún parámetro que se

envía anexado a la URL de la petición y que se utiliza con esta finalidad:

url?operacion=validar

Otra opción es utilizar la propia URL para codificar la operación a realizar, en este caso, se utilizaría

el path info de la dirección como indicativo del tipo de acción. En este sentido, la siguiente figura

nos muestra las distintas partes en las que se puede descomponer la URL completa asociada a una

petición.

http://www.miservidor.com/aplicacion/url_servlet/info

1 2 3 4

1. Servidor

2. url de la aplicación (contex path)

3. url del servlet (servlet path) 4. Información adicional (path info)

Por ejemplo, si en en servidor de nombre de dominio www.libros.com tenemos desplegada

una aplicación llamada “biblioteca”, cuyo controlador es un servlet que tiene como url

pattern el valor “/control”, la url asociada a la operación de validar podría ser.

www.libros.com/biblioteca/control/validar

Mientras que otra operación, por ejemplo registrar, tendría como url:

www.libros.com/biblioteca/control/registrar

Todas estas peticiones provocarán la ejecución del servlet controlador, el cual utilizará el

método getPathInfo() del API servlet para determinar la operación a realizar.

Procesamiento de la petición

Una vez que el controlador determina la operación a realizar, procede a ejecutar las acciones

pertinentes, invocando para ello a los diferentes métodos expuestos por el Modelo.

Dependiendo de las acciones a realizar (por ejemplo, un alta de un usuario en un sistema), el

modelo necesitara manejar los datos enviados por el cliente en la petición, datos que le serán

proporcionados por el controlador. De la misma manera, los resultados generados por el modelo

(por ejemplo, la información resultante de una búsqueda) serán entregados directamente al

controlador.

Para facilitar este intercambio de datos entre controlador y modelo y, posteriormente, entre

controlador y vista, las aplicaciones MVC suelen hacer uso de JavaBeans no es más que una clase

que encapsula un conjunto de datos con métodos de tipo set/get para proporcionar un acceso a los

mismos desde el exterior.

El siguiente listado representa un JavaBean de ejemplo que permite encapsular una serie de datos

asociados a una persona:

6

Generación de respuestas:

Los resultados devueltos por el modelo al controlador son depositados por éste en un variable de

petición, sesión o aplicación según el alcance que deban tener. A continuación, el controlador

invoca a la página JSP que debe encargase de generar la vista correspondiente, esta página accederá

a la variable de ámbito donde estén depositados los resultados y los utilizará para generar

dinámicamente la respuesta HTML que será enviada al cliente.

III. PROCEDIMIENTO.

Descripción

Para comprender la importancia de esta arquitectura, se desarrollara una aplicación Web siguiendo

el patrón MVC. La aplicación consistirá en un sencillo sistema de control de libros para una

biblioteca.

La página de inicio, permite el acceso a todo el sistema, el cual tendrá todos los mantenimientos

para poder realizar las siguientes acciones:

Listar Autores, Registrara Autores y Eliminar Autores.

Listar Género, Registrar Género y Eliminar Género.

Listar Libros, Registrar Libros y Eliminar Libros.

Listar Editorial, Registrar Editorial y Eliminar Editorial.

Se darán cuenta de algo muy interesante, que para la lógica de negocio que concierne a trabajar con

los datos realizando acciones de consulta, inserción y eliminación, serán invocadas desde la

aplicación ya que estos serán procedimientos almacenados creados en la Base De Datos.

7

Desarrollo

Crear la base de datos llamada “inventario_libros”, luego ejecutar el archivo sql proporcionado

que se encuentra dentro de la carpeta “bd” proporcionada por su docente, el esquema de entidad

relación se debe ver como se muestra en la siguiente imagen.

Parte A

Conociendo el IDE de eclipse para generar un proyecto web y agregar un servidor de aplicaciones.

Para esta guía utilizaremos el IDE de eclipse en su versión “2019-03 (4.11.0)” que será proporcionado

por el docente en un archivo zip, que deberá descomprimir en la ruta que usted más prefiera.

1. Ingresar a la carpeta obtenida de eclipse y buscar dentro de ella un archivo ejecutable llamado

“eclipse.exe”, proceder a dar doble clic, aparecerá una ventana como la siguiente en la cual se nos

pide seleccionar la carpeta en la cual quedaran almacenadas nuestros proyectos, proceder a

seleccionar la que usted quiera.

index

Autores

Genero

Libros

Editoriales

Registrar

Libros

Listar

Libros

8

Nota: Chequear la opción “Use this as the default and not ask again”, eso permitirá que al iniciar

el IDE no pregunte cual workspace que va a utilizar.

2. Si eclipse no ha detectado ningún problema aparecerá una imagen con la siguiente en la cual se

observa cómo va cargando el IDE

3. Ya con el IDE cargado procederemos a crear nuestro proyecto web para ello ir a “File->New-

>Dinamic Web Proyect” tal y como se muestra en la siguiente figura:

4. El siguiente paso consiste en dar un nombre al proyecto para nuestro caso

“InventarioLibros_MVC”, en la opción Target Rutime se debe seleccionar el servidor con el cual

correrá nuestro proyecto. Si no se ha agregado ninguno lo dejaremos así, proceder a dar click en

finalizar.

9

Si observamos el explorador de proyectos nos damos cuenta que aparece el proyecto creado

5. Para correr una aplicación se necesita un servidor de aplicaciones, para ello procederemos a

buscar la ventana de server que se encuentra en la parte inferior del IDE, seleccionar la pestaña y

luego dar click derecho sobre la parte blanca, aparecerá la opción NEW y si la seleccionamos

aparecerá la opción Sever a la cual le daremos click.

10

6. Al dar click sobre la opción Server aparece una ventana en la cual deberemos seleccionar el

servidora utilizar (preferentemente tomcat 8 o superior) dar click en siguiente.

Dar click en “Browse…” y buscar la ruta del servidor de aplicaciones, para este caso de Apache

Tomcat.

11

7. Para terminar aparece una ventana en la cual debemos indicar qué proyectos correrán con éste

servidor, si en caso tenemos sólo uno agregarlo y dar click en finalizar.

Parte B

Creación de la aplicación utilizando el modelo MVC.

El desarrollo de esta aplicación se realizará siguiendo el patrón Modelo Vista Controlador, donde se

tendrán varios servlets con el sufijo “Controller” en el que se centralizarán todas las peticiones

procedentes desde el cliente ejemplo “AutoresController”.

El Modelo estará implementado mediante varias clases con el sufijo “Model” las cuales realizaran

la invocación a los procedimientos almacenados un ejemplo seria “AutoresModel”.

La transferencia de información se realiza mediante JavaBeans por ejemplo “Autor”.

En cuanto a las vistas, serán implementadas mediante paginas JSP, las cuales serán nuestro punto de

comunicación entre el usuario y el sistema.

1. Crear los siguientes 4 paquetes en

la carpeta “src”

12

2. Crear cada una de las clases que nos permiten el almacenamiento de información “JavaBeans”,

para ello dar click derecho sobre “Java Resources: src”, seleccionar New->Class, tal y como se

muestra en la imagen.

2. Al seleccionar Class aparecerá una ventana como la siguiente, en la cual pondremos el nombre

del paquete y el nombre de la clase

Package: sv.edu.udb.www.beans

Name: Autor

3. Agregar a la clase los siguiente atributos de clase: private String codigoAutor; private String nombreAutor; private String nacionalidad;

4. Se necesita crear los métodos set y get, para ello dar click derecho en cualquier parte dentro de la

clase y seleccionar Source->Generate Getters and Setters... ver la siguiente imagen.

13

5. Aparecerá una ventana como la siguiente en la cual seleccionaremos los atributos de los

cuales necesitamos generar los métodos set y get, para nuestro caso dar click en Select All.

6. Si observamos la clase ahora ésta ya posee los métodos set y get, pero aun necesitamos crear

un constructor con tres parámetros los cuales son los valores a pasar a las propiedades.Se

apoyara de la ayuda del IDE:dar click derecho en la zona del código después de las

propiedades y antes de los métodos, seleccionar Source->Generate Constructor usign

Fields..., ver la siguiente imagen.

14

7. Al igual que para la generación de los métodos set y get, ahora seleccionamos todos los campos

de los cuales deseamos generar el constructor con parámetros, también omitiremos el constructor

super(), para esto checkear la opción Omit Call to default constructor super().

Nota: Ya que éste es un javabeans debe de poseer un constructor sin parámetros, no olvidar

agregarlo, también sera necesario un constructor que reciba únicamente el nombre del autor.

8. Ahora el bean ya está completo y debe de quedar como se muestra a continuación.

Quitar el constructor super()

15

package sv.edu.udb.www.beans; public class Autor { private String codigoAutor; private String nombreAutor; private String nacionalidad; public Autor(){ this.codigoAutor =""; this.nacionalidad=""; this.nombreAutor=""; } public Autor(String codigoAutor, String nombreAutor, String nacionalidad) { this.codigoAutor = codigoAutor; this.nombreAutor = nombreAutor; this.nacionalidad = nacionalidad; } public Autor(String nombreAutor) { this.nombreAutor = nombreAutor; } public String getCodigoAutor() { return codigoAutor; } public void setCodigoAutor(String codigoAutor) { this.codigoAutor = codigoAutor; } public String getNombreAutor() { return nombreAutor; } public void setNombreAutor(String nombreAutor) { this.nombreAutor = nombreAutor; } public String getNacionalidad() { return nacionalidad; } public void setNacionalidad(String nacionalidad) { this.nacionalidad = nacionalidad; } }

9. Realizar este mismo proceso para las clases Editorial, Genero y Libro. A continuación se

muestran cada uno de las propiedades que debe tener cada uno y su constructor sin parametros.

Editorial Genero Libro private String codigoEditorial; private String nombreEditorial; private String contacto; private String telefono;

private int idGenero; private String nombreGenero; private String descripcion;

private String codigoLibro; private String nombreLibro; private int existencias; private double precio; private Autor autor; private Editorial editorial; private Genero genero; private String descripcion; private String codigoAutor; private String codigoEditorial; private int idGenero;

Constructores Editorial Constructores Genero Constructor Libro public Editorial(){ this.codigoEditorial =""; this.nombreEditorial=""; this.contacto=""; this.telefono="";

public Genero(){ this.idGenero = 0; this.nombreGenero = ""; this.descripcion = ""; }

public Libro(){ this.codigoLibro =""; this.nombreLibro =""; this.existencias =0; this.precio=0;

16

} public Editorial(String nombreEdi-torial) { this.nombreEditorial = nombreEdi-torial; }

public Genero(String nombreGenero) { this.nombreGenero = nombreGenero; }

this.autor =null; this.editorial = null; this.genero = null; this.descripcion= ""; this.codigoAutor =""; this.codigoEditorial="";

this.idGenero =0; }

Al finalizar la creación de los beans, estos deberán de verse la siguiente manera.

10. Ahora pasaremos a crear la conexión con la base de datos, para ellos deberá de copiar el archivo

“context.xml” que se encuentra en la carpeta context que le proporcionara su docente, además se le

proporciona la clase “Conexion.java” que deberá de agregarla en el paquete

“sv.edu.udb.www.model”, adicional deberá de copiar las librerías proporcionadas en la carpeta

“lib” y deberá de ubicarlas en la carpeta con el mismo nombre, dentro del directorio WEB-INF.

11. Se procederá a crear la clase que realizara la lógica de negocio, que para este caso es la

invocación de los procedimientos almacenados de la BD, esta clase será llamada “AutoresModel”.

package sv.edu.udb.www.model; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import sv.edu.udb.www.beans.Autor; public class AutoresModel extends Conexion{ public List<Autor> listarAutores() throws SQLException{ try {

17

List<Autor> lista = new ArrayList<>(); String sql = "CALL sp_listarAutores()"; this.conectar(); cs = conexion.prepareCall(sql); rs = cs.executeQuery(); while(rs.next()){ Autor autor = new Autor(); autor.setCodigoAutor(rs.getString("codigo_autor")); autor.setNombreAutor(rs.getString("nombre_autor")); autor.setNacionalidad(rs.getString("nacionalidad")); lista.add(autor); } this.desconectar(); return lista; } catch (SQLException ex) { Logger.getLogger(AutoresModel.class.getName()).log(Level.SEVERE, null, ex); this.desconectar(); return null; } } public int insertarAutor(Autor autor) throws SQLException{ try { int filasAfectadas=0; String sql = "CALL sp_insertarAutor(?,?,?)"; this.conectar(); cs = conexion.prepareCall(sql); cs.setString(1, autor.getCodigoAutor()); cs.setString(2, autor.getNombreAutor()); cs.setString(3, autor.getNacionalidad()); filasAfectadas = cs.executeUpdate(); this.desconectar(); return filasAfectadas; } catch (SQLException ex) { Logger.getLogger(AutoresModel.class.getName()).log(Level.SEVERE, null, ex); this.desconectar(); return 0; } } public int eliminarAutor(String codigo) throws SQLException{ try { int filasAfectadas=0; String sql = "CALL sp_eliminarAutor(?)"; this.conectar(); cs = conexion.prepareCall(sql); cs.setString(1, codigo); filasAfectadas = cs.executeUpdate(); this.desconectar(); return filasAfectadas; } catch (SQLException ex) { Logger.getLogger(AutoresModel.class.getName()).log(Level.SEVERE, null, ex); this.desconectar(); return 0; } } public int modificarAutor(Autor autor) throws SQLException{ try { int filasAfectadas=0; String sql = "CALL sp_modificarAutor(?,?,?)"; this.conectar(); cs = conexion.prepareCall(sql); cs.setString(1, autor.getNombreAutor()); cs.setString(2, autor.getNacionalidad());

18

cs.setString(3, autor.getCodigoAutor()); filasAfectadas = cs.executeUpdate(); this.desconectar(); return filasAfectadas; } catch (SQLException ex) { Logger.getLogger(AutoresModel.class.getName()).log(Level.SEVERE, null, ex); this.desconectar(); return 0; } } public Autor obtenerAutor(String codigo) throws SQLException{ try { String sql = "CALL sp_obtenerAutor(?)"; this.conectar(); cs = conexion.prepareCall(sql); cs.setString(1, codigo); rs = cs.executeQuery(); if(rs.next()){ Autor autor = new Autor(); autor.setCodigoAutor(rs.getString("codigo_autor")); autor.setNombreAutor(rs.getString("nombre_autor")); autor.setNacionalidad(rs.getString("nacionalidad")); this.desconectar(); return autor; } this.desconectar(); return null; } catch (SQLException ex) { Logger.getLogger(AutoresModel.class.getName()).log(Level.SEVERE, null, ex); this.desconectar(); return null; } } public int totalAutores() throws SQLException{ try { int totalaut=0; String sql = "SELECT COUNT(codigo_autor) as totalaut FROM autores"; this.conectar(); st = conexion.prepareStatement(sql); rs = st.executeQuery(); while(rs.next()){ totalaut = rs.getInt("totalaut"); } return totalaut; } catch (SQLException ex) { Logger.getLogger(AutoresModel.class.getName()).log(Level.SEVERE, null, ex); return 0; }finally{ this.desconectar(); } } }

12. Se procederá a crear el controlador, para el cual se utilizaran los servlets, para que este no

genere ningún error se creara primero una clase de validaciones, esta clase deberá de estar en el

paquete “sv.edu.udb.www.utils”, la clase se encuentra dentro de los recursos brindados y se

llamada “Validaciones.java”, proceder a copiarla en el paquete mencionado anteriormente.

19

13. Como se menciono en el punto anterior, se necesita crear el Servlet controlador, para ellos dar

click derecho sobre el paquete “sv.edu.udb.www.controllers”, seleccionar New->Servlet

Aparecerá la siguiente ventana, donde colocaremos el nombre del servlet “AutoresController”

20

Sustituir el código que tiene la clase, por el proporcionado a continuación, esto implica borrar el

anterior y pegar el que se pasa a continuación.

/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package sv.edu.udb.www.controllers; import java.io.IOException; import java.io.PrintWriter; import java.sql.SQLException; import java.util.ArrayList; import java.util.logging.Level; import java.util.logging.Logger; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import sv.edu.udb.www.beans.Autor; import sv.edu.udb.www.model.AutoresModel; import sv.edu.udb.www.utils.Validaciones; /** * * @author Rafael Torres */ @WebServlet(name = "AutoresController", urlPatterns = {"/autores.do"}) public class AutoresController extends HttpServlet { ArrayList<String> listaErrores = new ArrayList<>(); AutoresModel modelo = new AutoresModel(); protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); try (PrintWriter out = response.getWriter()) { if(request.getParameter("op")==null){ listar(request, response); return; } String operacion = request.getParameter("op"); switch (operacion) { case "listar": listar(request, response); break; case "nuevo": request.getRequestDispatcher("/autores/nuevoAutor.jsp").forward(request, response); break; case "insertar": insertar(request, response); break; case "obtener": obtener(request, response); break; case "modificar": modificar(request, response); break; case "eliminar": eliminar(request, response); break; } } } // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code."> /** * Handles the HTTP <code>GET</code> method. * * @param request servlet request * @param response servlet response * @throws ServletException if a servlet-specific error occurs * @throws IOException if an I/O error occurs

21

*/ @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } /** * Handles the HTTP <code>POST</code> method. * * @param request servlet request * @param response servlet response * @throws ServletException if a servlet-specific error occurs * @throws IOException if an I/O error occurs */ @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } /** * Returns a short description of the servlet. * * @return a String containing servlet description */ @Override public String getServletInfo() { return "Short description"; }// </editor-fold> private void listar(HttpServletRequest request, HttpServletResponse response) { try { request.setAttribute("listaAutores", modelo.listarAutores()); request.getRequestDispatcher("/autores/listaAutores.jsp").forward(request, response); } catch (SQLException | ServletException | IOException ex) { Logger.getLogger(GenerosController.class.getName()).log(Level.SEVERE, null, ex); } } private void insertar(HttpServletRequest request, HttpServletResponse response) { try { listaErrores.clear(); Autor miAutor = new Autor(); miAutor.setCodigoAutor(request.getParameter("codigo")); miAutor.setNombreAutor(request.getParameter("nombre")); miAutor.setNacionalidad(request.getParameter("nacionalidad")); if (Validaciones.isEmpty(miAutor.getCodigoAutor())) { listaErrores.add("El codigo del autor es obligatorio"); } else if (!Validaciones.esCodigoAutor(miAutor.getCodigoAutor())) { listaErrores.add("El codigo de la autor debe tener el formato correcto AUT000"); } if (Validaciones.isEmpty(miAutor.getNombreAutor())) { listaErrores.add("El nombre del autor es obligatorio"); } if (Validaciones.isEmpty(miAutor.getNacionalidad())) { listaErrores.add("La nacionalidad es obligatoria"); } if (listaErrores.size() > 0) { request.setAttribute("listaErrores", listaErrores); request.setAttribute("autor", miAutor); request.getRequestDispatcher("autores.do?op=nuevo").forward(request, response); } else { if (modelo.insertarAutor(miAutor) > 0) { request.getSession().setAttribute("exito", "autor registrado exitosamente"); response.sendRedirect(request.getContextPath() + "/autores.do?op=listar"); } else { request.getSession().setAttribute("fracaso", "El autor no ha sido ingresado" + "ya hay un autor con este codigo"); response.sendRedirect(request.getContextPath() + "/autores.do?op=listar"); } } } catch (IOException | SQLException | ServletException ex) { Logger.getLogger(GenerosController.class.getName()).log(Level.SEVERE, null, ex); } }

22

private void obtener(HttpServletRequest request, HttpServletResponse response) { try { String codigo = request.getParameter("id"); Autor miAutor = modelo.obtenerAutor(codigo); if (miAutor != null) { request.setAttribute("autor", miAutor); request.getRequestDispatcher("/autores/editarAutor.jsp").forward(request, response); } else { response.sendRedirect(request.getContextPath() + "/error404.jsp"); } } catch (SQLException | IOException | ServletException ex) { Logger.getLogger(GenerosController.class.getName()).log(Level.SEVERE, null, ex); } } private void modificar(HttpServletRequest request, HttpServletResponse response) { try { listaErrores.clear(); Autor miAutor = new Autor(); miAutor.setCodigoAutor(request.getParameter("codigo")); miAutor.setNombreAutor(request.getParameter("nombre")); miAutor.setNacionalidad(request.getParameter("nacionalidad")); if (Validaciones.isEmpty(miAutor.getCodigoAutor())) { listaErrores.add("El codigo del autor es obligatorio"); } else if (!Validaciones.esCodigoAutor(miAutor.getCodigoAutor())) { listaErrores.add("El codigo de la autor debe tener el formato correcto AUT000"); } if (Validaciones.isEmpty(miAutor.getNombreAutor())) { listaErrores.add("El nombre del autor es obligatorio"); } if (Validaciones.isEmpty(miAutor.getNacionalidad())) { listaErrores.add("La nacionalidad es obligatoria"); } if (listaErrores.size() > 0) { request.setAttribute("listaErrores", listaErrores); request.setAttribute("autor", miAutor); request.getRequestDispatcher("autores.do?op=obtener").forward(request, response); } else { if (modelo.modificarAutor(miAutor) > 0) { request.getSession().setAttribute("exito", "autor modificado exitosamente"); response.sendRedirect(request.getContextPath() + "/autores.do?op=listar"); } else { request.getSession().setAttribute("fracaso", "El autor no ha sido modificado" + "ya hay un autor con este codigo"); response.sendRedirect(request.getContextPath() + "/autores.do?op=listar"); } } } catch (IOException | SQLException | ServletException ex) { Logger.getLogger(GenerosController.class.getName()).log(Level.SEVERE, null, ex); } } private void eliminar(HttpServletRequest request, HttpServletResponse response) { try { String codigo = request.getParameter("id"); if (modelo.eliminarAutor(codigo) > 0) { request.setAttribute("exito", "Autor eliminado exitosamente"); } else { request.setAttribute("fracaso", "No se puede eliminar este autor"); } request.getRequestDispatcher("/autores.do?op=listar").forward(request, response); } catch (SQLException | ServletException | IOException ex) { Logger.getLogger(GenerosController.class.getName()).log(Level.SEVERE, null, ex); } } }

23

14. Si todo ha salido correctamente, aparecerá nuestro servlet creado, sin embargo se puede dar el

caso de que los import de javax.servlet se identifique como error. Si muestra errores en dichas

importaciones agregaremos el api del servlet del tomcat. Si no muestran errores, no es

necesario incluir la Api debido a que ya se debe encontrar disponible. De click derecho sobre el

proyectos y buscar la opción Build Path->Configure Build Path..., ver la siguiente imagen.

Aparecerá una nueva pantalla en la cual seleccionáramos del panel izquierdo la opción Java Build

Path, y del panel derecho buscaremos la pestaña Libraries, dar click sobre Add External JARs..., y

buscar dentro de la carpeta lib del tomcat el jar servlet-api.jar, dar click en aceptar en la pantalla de

búsqueda y ok en la pantalla principal. (Recuerde: Si los servlets no muestran errores, no es

necesario incluir la Api debido a que ya se debe encontrar disponible).

14. Ahora se creara la vista, por media de la cual el usuario tendrá acceso a manipular el sistema en

lo que concierne al modulo de autores, para ello se le proporcionan los archivos que están marcados

en el recuadro rojo, y que deberá de copiarlos dentro de la carpeta “WebContent” y para el caso de

los recuadros en azul, deberá de crear esas carpetas, las cuales contendrá todas las paginas jsp que

corresponden a cada modulo.

24

15. Crear las paginas jsp, dando click derecho sobre la carpeta “autores” que se encuentra en

“WebContent”, crear las siguientes paginas jsp: editarAturo.jsp, listarAutres.jsp y nuevoAutor.jsp

New->Jsp File

Paginas JSP

16. Abrir la pagina “listarAutor.jsp” y eliminar el código que esta contenga y sustituirla por el que

se muestra a continuación.

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <title>Lista de autores</title> <%@ include file='/cabecera.jsp' %> </head> <body> <jsp:include page="/menu.jsp"/> <div class="container"> <div class="row"> <h3>Lista de autores</h3> </div> <div class="row"> <div class="col-md-10"> <a type="button" class="btn btn-primary btn-md" href="${contextPath}/autores.do?op=nuevo"> Nuevo autor</a> <br/><br/> <table class="table table-striped table-bordered table-hover" id="tabla"> <thead> <tr> <th>Codigo del autor</th> <th>Nombre del autor</th> <th>Nacionalidad</th>

25

<th>Operaciones</th> </tr> </thead> <tbody> <c:forEach items="${requestScope.listaAutores}" var="autores"> <tr> <td>${autores.codigoAutor}</td> <td>${autores.nombreAutor}</td> <td>${autores.nacionalidad}</td> <td> <a class="btn btn-primary" href="${contextPath}/autores.do?op=obtener&id=${autores.codigoAutor}"><span class="glyphicon glyphicon-edit"></span> Editar</a> <a class="btn btn-danger" href="javascript:eliminar('${autores.codigoAutor}')"><span class="glyphicon glyphicon-trash"></span> Eliminar</a> </td> </tr> </c:forEach> </tbody> </table> </div> </div> </div> <script> $(document).ready(function(){ $('#tabla').DataTable(); }); <c:if test="${not empty exito}"> alertify.success('${exito}'); <c:set var="exito" value="" scope="session" /> </c:if> <c:if test="${not empty fracaso}"> alertify.error('${fracaso}'); <c:set var="fracaso" value="" scope="session" /> </c:if> function eliminar(id){ alertify.confirm("¿Realmente decea eliminar este Autor?", function(e){ if(e){ location.href="autores.do?op=eliminar&id="+ id; } }); } </script> </body> </html>

17. Abrir la pagina “nuevoAutor.jsp” y eliminar el código que esta contenga y sustituirla por el que

se muestra a continuación.

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <title>Nuevo autor</title> <%@ include file='/cabecera.jsp' %> </head> <body> <jsp:include page="/menu.jsp"/>

26

<div class="container"> <div class="row"> <h3>Nuevo autor</h3> </div> <div class="row"> <div class=" col-md-7"> <c:if test="${not empty listaErrores}"> <div class="alert alert-danger"> <ul> <c:forEach var="errores" items="${requestScope.listaErrores}"> <li>${errores}</li> </c:forEach> </ul> </div> </c:if> <form role="form" action="${contextPath}/autores.do" me-thod="POST"> <input type="hidden" name="op" value="insertar"> <div class="well well-sm"><strong><span class="glyphicon gly-phicon-asterisk"></span>Campos requeridos</strong></div> <div class="form-group"> <label for="codigo">Codigo del autor</label> <div class="input-group"> <input type="text" class="form-control" name="codigo" id="codigo" value="${autor.codigoAutor}" placeholder="Ingresa el codigo del autor" > <span class="input-group-addon"><span class="glyphicon glyphicon-asterisk"></span></span> </div> </div> <div class="form-group"> <label for="nombre">Nombre del autor</label> <div class="input-group"> <input type="text" class="form-control" name="nombre" id="nombre" value="${autor.nombreAutor}" placeholder="Ingresa el nombre del autor" > <span class="input-group-addon"><span class="glyphicon glyphicon-asterisk"></span></span> </div> </div> <div class="form-group"> <label for="contacto">Nacionalidad del autor:</label> <div class="input-group"> <input type="text" class="form-control" id="contacto" value="${autor.nacionalidad}" name="nacionalidad" placeholder="Ingresa la nacionali-dad del autor"> <span class="input-group-addon"><span class="glyphicon glyphicon-asterisk"></span></span> </div> </div> <input type="submit" class="btn btn-info" value="Guardar" name="Guardar"> <a class="btn btn-danger" href="${contextPath}/autores.do?op=listar">Cancelar</a> </form> </div> </div> </div> </body> </html>

27

18. Abrir la pagina “editarAutor.jsp” y eliminar el código que esta contenga y sustituirla por el que

se muestra a continuación.

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <title>Modificar autor</title> <%@ include file='/cabecera.jsp' %> </head> <body> <jsp:include page="/menu.jsp"/> <div class="container"> <div class="row"> <h3>Modificar autor</h3> </div> <div class="row"> <div class=" col-md-7"> <c:if test="${not empty listaErrores}"> <div class="alert alert-danger"> <ul> <c:forEach var="errores" items="${requestScope.listaErrores}"> <li>${errores}</li> </c:forEach> </ul> </div> </c:if> <form role="form" action="${contextPath}/autores.do" me-thod="POST"> <input type="hidden" name="op" value="modificar"/> <div class="well well-sm"><strong><span class="glyphicon gly-phicon-asterisk"></span>Campos requeridos</strong></div> <div class="form-group"> <label for="codigo">Codigo del autor</label> <div class="input-group"> <input type="text" class="form-control" name="codigo" id="codigo" value="${autor.codigoAutor}" readonly placeholder="Ingresa el codigo del autor" > <span class="input-group-addon"><span class="glyphicon glyphicon-asterisk"></span></span> </div> </div> <div class="form-group"> <label for="nombre">Nombre del autor</label> <div class="input-group"> <input type="text" class="form-control" name="nombre" id="nombre" value="${autor.nombreAutor}" placeholder="Ingresa el nombre del autor" > <span class="input-group-addon"><span class="glyphicon glyphicon-asterisk"></span></span> </div> </div> <div class="form-group"> <label for="contacto">Nacionalidad del autor:</label> <div class="input-group"> <input type="text" class="form-control" id="contacto" value="${autor.nacionalidad}" name="nacionalidad" placeholder="Ingresa la nacionali-

28

dad del autor"> <span class="input-group-addon"><span class="glyphicon glyphicon-asterisk"></span></span> </div> </div> <input type="submit" class="btn btn-info" value="Guardar" name="Guardar"> <a class="btn btn-danger" href="${contextPath}/autores.do?op=listar">Cancelar</a> </form> </div> </div> </div> </body> </html>

19. Proceder a ver el resultado, dando click derecho sobre la página index.jsp y seleccionar

Run As -> Run on Server…

Aparecerá una ventana como la siguiente, la cual solicitara la autorización para ejecutar el proyecto

en el servidor de aplicaciones.

29

Se podrá ver la página index.jsp ejecutada en el navegador interno que tiene el IDE, para sus

pruebas puede utilizar este navegador o verlo en el navegador de su preferencia.

Si damos click en la opción de “Ver autores”, aparecerá una ventana como la siguiente, en la cual

se puede crear un Nuevo autor, Editar o Eliminar.

Si seleccionamos la opción nuevo autor se mostrar una ventana similar a la siguiente.

30

Si agregamos un autor con un codigo existente genera el siguiente error.

Si el autor se ingresa con éxito, aparecerá una ventana con el siguiente mensaje.

Si buscamos el autor en la lista, tendremos la posibilidad de Editarlo o Eliminarlo.

19. El siguiente punto será crear el mantenimiento para libros, el cual es el mas complejo ya que

necesita tener la lógica de negocio de Autores (ya fue realizada en los pasos anteriores) y las de

Editoriales y Géneros las cuales no se tiene implementada hasta el momentos, es por ellos que se

creara las clases “EditorialesModel y GenerosModel”, dentro del paquete

sv.edu.udb.www.model.

Código para la clase EditorialesModel. package sv.edu.udb.www.model; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import sv.edu.udb.www.beans.Editorial; public class EditorialesModel extends Conexion { public List<Editorial> listarEditoriales() throws SQLException{ try { List<Editorial> lista = new ArrayList<>(); String sql = "SELECT * FROM editoriales ORDER BY nombre_editorial"; this.conectar(); st= conexion.prepareStatement(sql); rs= st.executeQuery(); while(rs.next()){ Editorial editorial = new Editorial(); editorial.setCodigoEditorial(rs.getString("codigo_editorial")); editorial.setNombreEditorial(rs.getString("nombre_editorial")); editorial.setContacto(rs.getString("contacto")); editorial.setTelefono(rs.getString("telefono")); lista.add(editorial); } this.desconectar(); return lista;

31

} catch (SQLException ex) { Logger.getLogger(EditorialesModel.class.getName()).log(Level.SEVERE, null, ex); this.desconectar(); return null; } } public int isertarEditorial(Editorial editorial) throws SQLException{ try { int filasAfectadas=0; String sql = "INSERT INTO editoriales VALUES(?,?,?,?)"; this.conectar(); st = conexion.prepareStatement(sql); st.setString(1, editorial.getCodigoEditorial()); st.setString(2, editorial.getNombreEditorial()); st.setString(3, editorial.getContacto()); st.setString(4, editorial.getTelefono()); filasAfectadas = st.executeUpdate(); this.desconectar(); return filasAfectadas; } catch (SQLException ex) { Logger.getLogger(EditorialesModel.class.getName()).log(Level.SEVERE, null, ex); this.desconectar(); return 0; } } public Editorial obtenerEditorial(String codigo) throws SQLException{ try { String sql = "SELECT * FROM editoriales WHERE codigo_editorial=?"; this.conectar(); st = conexion.prepareStatement(sql); st.setString(1, codigo); rs= st.executeQuery(); if(rs.next()){ Editorial editorial = new Editorial(); editorial.setCodigoEditorial(rs.getString("codigo_editorial")); editorial.setNombreEditorial(rs.getString("nombre_editorial")); editorial.setContacto(rs.getString("contacto")); editorial.setTelefono(rs.getString("telefono")); this.desconectar(); return editorial; } this.desconectar(); return null; } catch (SQLException ex) { Logger.getLogger(EditorialesModel.class.getName()).log(Level.SEVERE, null, ex); this.desconectar(); return null; } } public int modificarEditorial(Editorial editorial) throws SQLException{ try { int filasAfectadas=0; String sql = "UPDATE editoriales SET nombre_editorial = ?, contacto = ?, telefono = ? WHERE codigo_editorial = ?"; this.conectar(); st = conexion.prepareStatement(sql); st.setString(1, editorial.getNombreEditorial()); st.setString(2, editorial.getContacto()); st.setString(3, editorial.getTelefono()); st.setString(4, editorial.getCodigoEditorial()); filasAfectadas = st.executeUpdate(); this.desconectar(); return filasAfectadas; } catch (SQLException ex) { Logger.getLogger(EditorialesModel.class.getName()).log(Level.SEVERE, null, ex); this.desconectar(); return 0; } } public int eliminarEditorial(String codigo) throws SQLException{ try { int filasAfectadas=0; String sql = "DELETE FROM editoriales WHERE codigo_editorial=?"; this.conectar(); st = conexion.prepareStatement(sql); st.setString(1,codigo);

32

filasAfectadas = st.executeUpdate(); this.desconectar(); return filasAfectadas; } catch (SQLException ex) { Logger.getLogger(EditorialesModel.class.getName()).log(Level.SEVERE, null, ex); this.desconectar(); return 0; } } public int totalEditoriales() throws SQLException{ try { int total=0; String sql = "SELECT COUNT(codigo_editorial) as totaledit FROM editoriales"; this.conectar(); st = conexion.prepareStatement(sql); rs = st.executeQuery(); while(rs.next()){ total = rs.getInt("totaledit"); } this.desconectar(); return total; } catch (SQLException ex) { Logger.getLogger(AutoresModel.class.getName()).log(Level.SEVERE, null, ex); this.desconectar(); return 0; } } }

Código para la clase GenerosModel. package sv.edu.udb.www.model; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import sv.edu.udb.www.beans.Genero; public class GenerosModel extends Conexion{ public List<Genero> listarGeneros() throws SQLException{ try { List<Genero> lista = new ArrayList<>(); String sql = "CALL sp_listarGeneros()"; this.conectar(); cs = conexion.prepareCall(sql); rs = cs.executeQuery(); while(rs.next()){ Genero genero = new Genero(); genero.setIdGenero(rs.getInt("id_genero")); genero.setNombreGenero(rs.getString("nombre_genero")); genero.setDescripcion(rs.getString("descripcion")); lista.add(genero); } this.desconectar(); return lista; } catch (SQLException ex) { Logger.getLogger(GenerosModel.class.getName()).log(Level.SEVERE, null, ex); this.desconectar(); return null; } } public int insertarGeneros(Genero genero) throws SQLException{ try { int filasAfectadas =0; String sql ="CALL sp_insertarGenero(?,?)"; this.conectar(); cs = conexion.prepareCall(sql); cs.setString(1, genero.getNombreGenero()); cs.setString(2, genero.getDescripcion()); filasAfectadas = cs.executeUpdate(); this.desconectar(); return filasAfectadas; } catch (SQLException ex) { Logger.getLogger(GenerosModel.class.getName()).log(Level.SEVERE, null, ex); this.desconectar(); return 0;

33

} } public Genero obtenerGenero(String id) throws SQLException{ try { String sql = "CALL sp_obtenerGenero(?)"; this.conectar(); cs = conexion.prepareCall(sql); cs.setString(1, id); rs = cs.executeQuery(); if(rs.next()){ Genero genero = new Genero(); genero.setIdGenero(rs.getInt("id_genero")); genero.setNombreGenero(rs.getString("nombre_genero")); genero.setDescripcion(rs.getString("descripcion")); this.desconectar(); return genero; } this.desconectar(); return null; } catch (SQLException ex) { Logger.getLogger(AutoresModel.class.getName()).log(Level.SEVERE, null, ex); this.desconectar(); return null; } } public int modificarGenero(Genero genero) throws SQLException{ try { int filasAfectadas =0; String sql ="CALL sp_modificarGenero(?,?,?)"; this.conectar(); cs = conexion.prepareCall(sql); cs.setString(1, genero.getNombreGenero()); cs.setString(2, genero.getDescripcion()); cs.setInt(3, genero.getIdGenero()); filasAfectadas = cs.executeUpdate(); this.desconectar(); return filasAfectadas; } catch (SQLException ex) { Logger.getLogger(GenerosModel.class.getName()).log(Level.SEVERE, null, ex); this.desconectar(); return 0; } } public int eliminarGenero(String id) throws SQLException{ try { int filasAfectadas=0; String sql = "CALL sp_eliminarGenero(?)"; this.conectar(); cs = conexion.prepareCall(sql); cs.setString(1, id); filasAfectadas = cs.executeUpdate(); this.desconectar(); return filasAfectadas; } catch (SQLException ex) { Logger.getLogger(AutoresModel.class.getName()).log(Level.SEVERE, null, ex); this.desconectar(); return 0; } } public int totalGeneros() throws SQLException{ try { int total=0; String sql = "SELECT COUNT(id_genero) as total FROM generos"; this.conectar(); st = conexion.prepareStatement(sql); rs = st.executeQuery(); while(rs.next()){ total = rs.getInt("total"); } this.desconectar(); return total; } catch (SQLException ex) { Logger.getLogger(AutoresModel.class.getName()).log(Level.SEVERE, null, ex); this.desconectar(); return 0; } } }

34

20. Ahora se procederá a crear la clase Modelo para los libros, para ello crear la clase LibrosModel

,dentro del paquete “sv.edu.udb.www.model”, como se puede observar esta clase necesita los

javabeans que fueron creados anteriormente para Autor, Editoral, Genero y Libro.

package sv.edu.udb.www.model; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import sv.edu.udb.www.beans.Autor; import sv.edu.udb.www.beans.Editorial; import sv.edu.udb.www.beans.Genero; import sv.edu.udb.www.beans.Libro; public class LibrosModel extends Conexion { public List<Libro> listarLibros() throws SQLException{ try { List<Libro> lista = new ArrayList<>(); String sql = "CALL sp_listarLibros()"; this.conectar(); cs = conexion.prepareCall(sql); rs = cs.executeQuery(); while(rs.next()){ Libro libro = new Libro(); libro.setCodigoLibro(rs.getString("codigo_libro")); libro.setNombreLibro(rs.getString("nombre_libro")); libro.setPrecio(rs.getDouble("precio")); libro.setExistencias(rs.getInt("existencias")); libro.setAutor(new Autor(rs.getString("nombre_autor"))); libro.setEditorial(new Editorial(rs.getString("nombre_editorial"))); libro.setGenero(new Genero(rs.getString("nombre_genero"))); lista.add(libro); } this.desconectar(); return lista; } catch (SQLException ex) { Logger.getLogger(LibrosModel.class.getName()).log(Level.SEVERE, null, ex); this.desconectar(); return null; } } public int insertarLibro(Libro libro) throws SQLException{ try { int filasAfectadas =0; String sql = "CALL sp_insertarLibro(?,?,?,?,?,?,?,?)"; this.conectar(); cs = conexion.prepareCall(sql); cs.setString(1, libro.getCodigoLibro()); cs.setString(2, libro.getNombreLibro()); cs.setInt(3, libro.getExistencias()); cs.setDouble(4, libro.getPrecio()); cs.setString(5, libro.getCodigoAutor()); cs.setString(6,libro.getCodigoEditorial()); cs.setInt(7, libro.getIdGenero()); cs.setString(8, libro.getDescripcion()); filasAfectadas = cs.executeUpdate(); this.desconectar(); return filasAfectadas; } catch (SQLException ex) { Logger.getLogger(LibrosModel.class.getName()).log(Level.SEVERE, null, ex); this.desconectar(); return 0; } } public int eliminarLibro(String codigo) throws SQLException{ try { int filasAfectadas=0; String sql = "CALL sp_eliminarLibro(?)"; this.conectar(); cs = conexion.prepareCall(sql); cs.setString(1, codigo); filasAfectadas = cs.executeUpdate(); this.desconectar();

35

return filasAfectadas; } catch (SQLException ex) { Logger.getLogger(LibrosModel.class.getName()).log(Level.SEVERE, null, ex); this.desconectar(); return 0; } } public Libro obtenerLibro(String codigo) throws SQLException{ try { String sql = "CALL sp_obtenerLibro(?)"; this.conectar(); cs = conexion.prepareCall(sql); cs.setString(1, codigo); rs = cs.executeQuery(); if(rs.next()){ Libro libro = new Libro(); libro.setCodigoLibro(rs.getString("codigo_libro")); libro.setNombreLibro(rs.getString("nombre_libro")); libro.setPrecio(rs.getDouble("precio")); libro.setExistencias(rs.getInt("existencias")); libro.setDescripcion(rs.getString("descripcion")); libro.setCodigoAutor(rs.getString("codigo_autor")); libro.setCodigoEditorial(rs.getString("codigo_editorial")); libro.setIdGenero(rs.getInt("id_genero")); this.desconectar(); return libro; } this.desconectar(); return null; } catch (SQLException ex) { Logger.getLogger(AutoresModel.class.getName()).log(Level.SEVERE, null, ex); this.desconectar(); return null; } } public int modificarLibro(Libro libro) throws SQLException{ try { int filasAfectadas =0; String sql = "CALL sp_modificarLibro(?,?,?,?,?,?,?,?)"; this.conectar(); cs = conexion.prepareCall(sql); cs.setString(1, libro.getCodigoLibro()); cs.setString(2, libro.getNombreLibro()); cs.setInt(3, libro.getExistencias()); cs.setDouble(4, libro.getPrecio()); cs.setString(5, libro.getCodigoAutor()); cs.setString(6,libro.getCodigoEditorial()); cs.setInt(7, libro.getIdGenero()); cs.setString(8, libro.getDescripcion()); filasAfectadas = cs.executeUpdate(); this.desconectar(); return filasAfectadas; } catch (SQLException ex) { Logger.getLogger(LibrosModel.class.getName()).log(Level.SEVERE, null, ex); this.desconectar(); return 0; } } public Libro detalleLibro(String codigo) throws SQLException{ try { String sql = "CALL sp_detalleLibro(?)"; this.conectar(); cs = conexion.prepareCall(sql); cs.setString(1, codigo); rs = cs.executeQuery(); if(rs.next()){ Libro libro = new Libro(); libro.setCodigoLibro(rs.getString("codigo_libro")); libro.setNombreLibro(rs.getString("nombre_libro")); libro.setPrecio(rs.getDouble("precio")); libro.setExistencias(rs.getInt("existencias")); libro.setDescripcion(rs.getString("descripcion")); libro.setAutor(new Autor(rs.getString("nombre_autor"))); libro.setEditorial(new Editorial(rs.getString("nombre_editorial"))); libro.setGenero(new Genero(rs.getString("nombre_genero"))); this.desconectar(); return libro; }

36

this.desconectar(); return null; } catch (SQLException ex) { Logger.getLogger(AutoresModel.class.getName()).log(Level.SEVERE, null, ex); this.desconectar(); return null; } } public int totalLibros() throws SQLException{ try { int total=0; String sql = "SELECT COUNT(codigo_libro) as total FROM libros"; this.conectar(); st = conexion.prepareStatement(sql); rs = st.executeQuery(); while(rs.next()){ total = rs.getInt("total"); } this.desconectar(); return total; } catch (SQLException ex) { Logger.getLogger(AutoresModel.class.getName()).log(Level.SEVERE, null, ex); this.desconectar(); return 0; } } }

21. Ahora proceder a crear el servlet “LibrosController”, dentro del paquete

“sv.edu.udb.www.controllers”, el cual será el controlador para este modulo.

/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package sv.edu.udb.www.controllers; import java.io.IOException; import java.io.PrintWriter; import java.sql.SQLException; import java.util.ArrayList; import java.util.logging.Level; import java.util.logging.Logger; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.json.simple.JSONObject; import sv.edu.udb.www.beans.Editorial; import sv.edu.udb.www.beans.Libro; import sv.edu.udb.www.model.AutoresModel; import sv.edu.udb.www.model.EditorialesModel; import sv.edu.udb.www.model.GenerosModel; import sv.edu.udb.www.model.LibrosModel; import sv.edu.udb.www.utils.Validaciones; /** * * @author Rafael Torres */ @WebServlet(name = "LibrosController", urlPatterns = {"/libros.do"}) public class LibrosController extends HttpServlet { ArrayList<String> listaErrores = new ArrayList<>(); LibrosModel modelo = new LibrosModel(); EditorialesModel editorial = new EditorialesModel(); AutoresModel autor = new AutoresModel(); GenerosModel genero = new GenerosModel(); protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); try (PrintWriter out = response.getWriter()) { if(request.getParameter("op")==null){ listar(request, response); return; }

37

String operacion = request.getParameter("op"); switch(operacion){ case "listar": listar(request, response); break; case "nuevo": nuevo(request, response); break; case "insertar": insertar(request, response); break; case "obtener": obtener(request, response); break; case "modificar": modificar(request, response); break; case "eliminar": eliminar(request, response); break; case "detalles": detalles(request, response); break; default: request.getRequestDispatcher("/error404.jsp").forward(request, response); break; } } } // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code."> /** * Handles the HTTP <code>GET</code> method. * * @param request servlet request * @param response servlet response * @throws ServletException if a servlet-specific error occurs * @throws IOException if an I/O error occurs */ @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } /** * Handles the HTTP <code>POST</code> method. * * @param request servlet request * @param response servlet response * @throws ServletException if a servlet-specific error occurs * @throws IOException if an I/O error occurs */ @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } /** * Returns a short description of the servlet. * * @return a String containing servlet description */ @Override public String getServletInfo() { return "Short description"; }// </editor-fold> private void listar(HttpServletRequest request, HttpServletResponse response) { try { request.setAttribute("listaLibros", modelo.listarLibros()); request.getRequestDispatcher("/libros/listaLibros.jsp").forward(request, response); } catch (SQLException ex) { Logger.getLogger(EditorialesController.class.getName()).log(Level.SEVERE, null, ex);

38

} catch (ServletException ex) { Logger.getLogger(EditorialesController.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(EditorialesController.class.getName()).log(Level.SEVERE, null, ex); } } private void insertar(HttpServletRequest request, HttpServletResponse response) { try{ listaErrores.clear(); Libro miLibro = new Libro(); miLibro.setCodigoLibro(request.getParameter("codigo")); miLibro.setNombreLibro(request.getParameter("nombre")); miLibro.setExistencias(Integer.parseInt(request.getParameter("existencias"))); miLibro.setPrecio(Double.parseDouble(request.getParameter("precio"))); miLibro.setCodigoAutor(request.getParameter("codigoAutor")); miLibro.setCodigoEditorial(request.getParameter("codigoEditorial")); miLibro.setIdGenero(Integer.parseInt(request.getParameter("idGenero"))); miLibro.setDescripcion(request.getParameter("descripcion")); if(Validaciones.isEmpty(miLibro.getCodigoLibro())){ listaErrores.add("El codigo del libro es obligatorio"); }else if(!Validaciones.esCodigoLibro(miLibro.getCodigoLibro())){ listaErrores.add("El codigo del libro debe tener el formato correcto LIB000"); } if(Validaciones.isEmpty(miLibro.getNombreLibro())){ listaErrores.add("El nombre del libro es obligatorio"); } if(!Validaciones.esEnteroPositivo(request.getParameter("existencias"))){ listaErrores.add("existencias deben ser enteros positivos"); } if(!Validaciones.esDecimalPositivo(request.getParameter("precio"))){ listaErrores.add("El precio deber ser un numero mayor o igual a 0"); } if(listaErrores.size() >0){ request.setAttribute("libro", miLibro); request.setAttribute("listaErrores", listaErrores); request.getRequestDispatcher("libros.do?op=nuevo").forward(request, response); }else{ if(modelo.insertarLibro(miLibro)>0){ request.getSession().setAttribute("exito", "libro registrado exitosamente"); response.sendRedirect(request.getContextPath() +"/libros.do?op=listar"); }else{ request.getSession().setAttribute("fracaso", "El libro no ha sido ingresado"+ "ya hay un libro con este codigo"); response.sendRedirect(request.getContextPath() +"/libros.do?op=listar"); } } } catch (ServletException ex) { Logger.getLogger(EditorialesController.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(EditorialesController.class.getName()).log(Level.SEVERE, null, ex); } catch (SQLException ex) { Logger.getLogger(EditorialesController.class.getName()).log(Level.SEVERE, null, ex); } } private void obtener(HttpServletRequest request, HttpServletResponse response) { try { String codigo = request.getParameter("id"); Libro miLibro = modelo.obtenerLibro(codigo); if(miLibro != null){ request.setAttribute("libro", miLibro); request.setAttribute( "listaEditoriales", editorial.listarEditoriales()); request.setAttribute("listaAutores", autor.listarAutores()); request.setAttribute("listaGeneros", genero.listarGeneros()); request.getRequestDispatcher("/libros/editarLibros.jsp").forward(request, response); }else{ response.sendRedirect(request.getContextPath() + "/error404.jsp"); } } catch (SQLException | ServletException | IOException ex) { Logger.getLogger(EditorialesController.class.getName()).log(Level.SEVERE, null, ex); } }

39

private void modificar(HttpServletRequest request, HttpServletResponse response) { try{ listaErrores.clear(); Libro miLibro = new Libro(); miLibro.setCodigoLibro(request.getParameter("codigo")); miLibro.setNombreLibro(request.getParameter("nombre")); miLibro.setExistencias(Integer.parseInt(request.getParameter("existencias"))); miLibro.setPrecio(Double.parseDouble(request.getParameter("precio"))); miLibro.setCodigoAutor(request.getParameter("codigoAutor")); miLibro.setCodigoEditorial(request.getParameter("codigoEditorial")); miLibro.setIdGenero(Integer.parseInt(request.getParameter("idGenero"))); miLibro.setDescripcion(request.getParameter("descripcion")); if(Validaciones.isEmpty(miLibro.getCodigoLibro())){ listaErrores.add("El codigo del libro es obligatorio"); }else if(!Validaciones.esCodigoLibro(miLibro.getCodigoLibro())){ listaErrores.add("El codigo del libro debe tener el formato correcto LIB000"); } if(Validaciones.isEmpty(miLibro.getNombreLibro())){ listaErrores.add("El nombre del libro es obligatorio"); } if(!Validaciones.esEnteroPositivo(request.getParameter("existencias"))){ listaErrores.add("existencias deben ser enteros positivos"); } if(!Validaciones.esDecimalPositivo(request.getParameter("precio"))){ listaErrores.add("El precio deber ser un numero mayor o igual a 0"); } if(listaErrores.size() >0){ request.setAttribute("libro", miLibro); request.setAttribute("listaErrores", listaErrores); request.getRequestDispatcher("libros.do?op=obtener").forward(request, response); }else{ if(modelo.modificarLibro(miLibro)>0){ request.getSession().setAttribute("exito", "libro modificado exitosamente"); response.sendRedirect(request.getContextPath() +"/libros.do?op=listar"); }else{ request.getSession().setAttribute("fracaso", "El libro no ha sido modificado"+ "ya hay un libro con este codigo"); response.sendRedirect(request.getContextPath() +"/libros.do?op=listar"); } } } catch (ServletException ex) { Logger.getLogger(EditorialesController.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(EditorialesController.class.getName()).log(Level.SEVERE, null, ex); } catch (SQLException ex) { Logger.getLogger(EditorialesController.class.getName()).log(Level.SEVERE, null, ex); } } private void eliminar(HttpServletRequest request, HttpServletResponse response) { try { String codigo = request.getParameter("id"); if(modelo.eliminarLibro(codigo) > 0){ request.setAttribute("exito","Libro eliminado exitosamente"); }else{ request.setAttribute("fracaso", "No se puede eliminar este libro"); } request.getRequestDispatcher("/libros.do?op=listar").forward(request, response); } catch (SQLException | ServletException | IOException ex) { Logger.getLogger(EditorialesController.class.getName()).log(Level.SEVERE, null, ex); } } private void nuevo(HttpServletRequest request, HttpServletResponse response) { try { request.setAttribute( "listaEditoriales", editorial.listarEditoriales()); request.setAttribute("listaAutores", autor.listarAutores()); request.setAttribute("listaGeneros", genero.listarGeneros()); request.getRequestDispatcher("/libros/nuevoLibro.jsp").forward(request, response); } catch (SQLException | ServletException | IOException ex) { Logger.getLogger(LibrosController.class.getName()).log(Level.SEVERE, null, ex); } }

40

private void detalles(HttpServletRequest request, HttpServletResponse response) { try { PrintWriter out = response.getWriter(); String codigo = request.getParameter("id"); Libro libro = modelo.detalleLibro(codigo); JSONObject json = new JSONObject(); json.put("codigo", libro.getCodigoLibro()); json.put("nombre", libro.getNombreLibro()); json.put("existencias", libro.getExistencias()); json.put("precio", libro.getPrecio()); json.put("editorial", libro.getEditorial().getNombreEditorial()); json.put("autor",libro.getAutor().getNombreAutor()); json.put("genero", libro.getGenero().getNombreGenero()); json.put("descripcion", libro.getDescripcion()); out.print(json); } catch (SQLException ex) { Logger.getLogger(LibrosController.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(LibrosController.class.getName()).log(Level.SEVERE, null, ex); } } }

22. Crear las siguientes paginas JSP y sustituirlas con el código que aparecerá a continuación, que

serán las vistas para el modulo de libros.

Código para editarLibros.jsp <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <title>Nuevo libro</title> <%@ include file='/cabecera.jsp' %> <link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/css/select2.min.css" rel="stylesheet" /> <script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/js/select2.min.js"></script> </head> <body> <jsp:include page="/menu.jsp"/> <div class="container"> <div class="row"> <h3>Nuevo libro</h3> </div> <div class="row"> <div class=" col-md-7"> <c:if test="${not empty listaErrores}"> <div class="alert alert-danger"> <ul> <c:forEach var="errores" items="${requestScope.listaErrores}"> <li>${errores}</li> </c:forEach> </ul> </div> </c:if> <form role="form" action="${contextPath}/libros.do" method="POST"> <input type="hidden" name="op" value="modificar"> <div class="well well-sm"><strong><span class="glyphicon glyphicon-asterisk"></span>Campos requeridos</strong></div> <div class="form-group"> <label for="codigo">Codigo del libro:</label> <div class="input-group">

41

<input type="text" readonly class="form-control" name="codigo" id="codigo" value="${libro.codigoLibro}" placeholder="Ingresa el codigo del libro" > <span class="input-group-addon"><span class="glyphicon glyphicon-asterisk"></span></span> </div> </div> <div class="form-group"> <label for="nombre">Nombre del libro:</label> <div class="input-group"> <input type="text" class="form-control" name="nombre" id="nombre" va-lue="${libro.nombreLibro}" placeholder="Ingresa el nombre del libro" > <span class="input-group-addon"><span class="glyphicon glyphicon-asterisk"></span></span> </div> </div> <div class="form-group"> <label for="existencias">existencias:</label> <div class="input-group"> <input type="text" class="form-control" id="existencias" va-lue="${libro.existencias}" name="existencias" placeholder="Ingresa las existencias del libro"> <span class="input-group-addon"><span class="glyphicon glyphicon-asterisk"></span></span> </div> </div> <div class="form-group"> <label for="precio">precio:</label> <div class="input-group"> <input type="number" step="0.1" min="0" class="form-control" id="precio" value="${libro.precio}" name="precio" placeholder="Ingresa el precio del libro" > <span class="input-group-addon"><span class="glyphicon glyphicon-asterisk"></span></span> </div> </div> <div class="form-group"> <label for="codigoEditorial">Editorial:</label> <div class="input-group"> <select name="codigoEditorial" id="codigoEditorial" class="form-control"> <c:forEach items="${requestScope.listaEditoriales}" var="editorial"> <option val-ue="${editorial.codigoEditorial}">${editorial.nombreEditorial}</option> </c:forEach> </select> <span class="input-group-addon"><span class="glyphicon glyphicon-asterisk"></span></span> </div> </div> <div class="form-group"> <label for="codigoAutor">Autor:</label> <div class="input-group"> <select name="codigoAutor" id="codigoAutor" class="form-control"> <c:forEach var="autor" items="${requestScope.listaAutores}"> <option value="${autor.codigoAutor}">${autor.nombreAutor}</option> </c:forEach> </select> <span class="input-group-addon"><span class="glyphicon glyphicon-asterisk"></span></span> </div> </div> <div class="form-group"> <label for="codigoGenero">Genero:</label> <div class="input-group"> <select name="idGenero" id="codigoGenero" class="form-control"> <c:forEach var="genero" items="${requestScope.listaGeneros}"> <option value="${genero.idGenero}">${genero.nombreGenero}</option> </c:forEach> </select> <span class="input-group-addon"><span class="glyphicon glyphicon-asterisk"></span></span> </div> </div> <div class="form-group"> <label for="descripcion">descripcion del libro:</label> <div class="input-group col-md-12"> <textarea class="form-control" name="descripcion"> ${libro.descripcion} </textarea> </div> </div> <input type="submit" class="btn btn-info" value="Guardar" name="Guardar">

42

<a class="btn btn-danger" href="${contextPath}/libros.do?op=listar">Cancelar</a> </form> </div> </div> </div> <script> $("#codigoAutor option[value="+ '${libro.codigoAutor}' +"]").attr("selected",true); $("#codigoEditorial option[value="+ '${libro.codigoEditorial}' +"]").attr("selected",true); $("#codigoGenero option[value="+ '${libro.idGenero}' +"]").attr("selected",true); </script> </html>

Codigo para nuevoLibro.jsp <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <title>Nuevo libro</title> <%@ include file='/cabecera.jsp' %> <link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/css/select2.min.css" rel="stylesheet" /> <script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/js/select2.min.js"></script> </head> <body> <jsp:include page="/menu.jsp"/> <div class="container"> <div class="row"> <h3>Nuevo libro</h3> </div> <div class="row"> <div class=" col-md-7"> <c:if test="${not empty listaErrores}"> <div class="alert alert-danger"> <ul> <c:forEach var="errores" items="${requestScope.listaErrores}"> <li>${errores}</li> </c:forEach> </ul> </div> </c:if> <form role="form" action="${contextPath}/libros.do" method="POST"> <input type="hidden" name="op" value="insertar"> <div class="well well-sm"><strong><span class="glyphicon glyphicon-asterisk"></span>Campos requeridos</strong></div> <div class="form-group"> <label for="codigo">Codigo del libro:</label> <div class="input-group"> <input type="text" class="form-control" name="codigo" id="codigo" val-ue="${libro.codigoLibro}" placeholder="Ingresa el codigo del libro" > <span class="input-group-addon"><span class="glyphicon glyphicon-asterisk"></span></span> </div> </div> <div class="form-group"> <label for="nombre">Nombre del libro:</label> <div class="input-group"> <input type="text" class="form-control" name="nombre" id="nombre" va-lue="${libro.nombreLibro}" placeholder="Ingresa el nombre del libro" > <span class="input-group-addon"><span class="glyphicon glyphicon-asterisk"></span></span> </div> </div> <div class="form-group"> <label for="existencias">existencias:</label> <div class="input-group"> <input type="text" class="form-control" id="existencias" va-lue="${libro.existencias}" name="existencias" placeholder="Ingresa las existencias del libro"> <span class="input-group-addon"><span class="glyphicon glyphicon-

43

asterisk"></span></span> </div> </div> <div class="form-group"> <label for="precio">precio:</label> <div class="input-group"> <input type="number" step="0.1" min="0" class="form-control" id="precio" value="${libro.precio}" name="precio" placeholder="Ingresa el precio del libro" > <span class="input-group-addon"><span class="glyphicon glyphicon-asterisk"></span></span> </div> </div> <div class="form-group"> <label for="codigoEditorial">Editorial:</label> <div class="input-group"> <select name="codigoEditorial" id="codigoEditorial" class="form-control"> <c:forEach items="${requestScope.listaEditoriales}" var="editorial"> <option val-ue="${editorial.codigoEditorial}">${editorial.nombreEditorial}</option> </c:forEach> </select> <span class="input-group-addon"><span class="glyphicon glyphicon-asterisk"></span></span> </div> </div> <div class="form-group"> <label for="codigoAutor">Autor:</label> <div class="input-group"> <select name="codigoAutor" id="codigoAutor" class="form-control"> <c:forEach var="autor" items="${requestScope.listaAutores}"> <option value="${autor.codigoAutor}">${autor.nombreAutor}</option> </c:forEach> </select> <span class="input-group-addon"><span class="glyphicon glyphicon-asterisk"></span></span> </div> </div> <div class="form-group"> <label for="codigoGenero">Genero:</label> <div class="input-group"> <select name="idGenero" id="codigoGenero" class="form-control"> <c:forEach var="genero" items="${requestScope.listaGeneros}"> <option value="${genero.idGenero}">${genero.nombreGenero}</option> </c:forEach> </select> <span class="input-group-addon"><span class="glyphicon glyphicon-asterisk"></span></span> </div> </div> <div class="form-group"> <label for="descripcion">descripcion del libro:</label> <div class="input-group col-md-12"> <textarea class="form-control" name="descripcion"> ${libro.descripcion} </textarea> </div> </div> <input type="submit" class="btn btn-info" value="Guardar" name="Guardar"> <a class="btn btn-danger" href="${contextPath}/libros.do?op=listar">Cancelar</a> </form> </div> </div> </div> <script> $("#codigoAutor option[value="+ '${libro.codigoAutor}' +"]").attr("selected",true); $("#codigoEditorial option[value="+ '${libro.codigoEditorial}' +"]").attr("selected",true); $("#codigoGenero option[value="+ '${libro.idGenero}' +"]").attr("selected",true); </script> </html>

44

Codigo para editarLibros.jsp. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <title>Nuevo libro</title> <%@ include file='/cabecera.jsp' %> <link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/css/select2.min.css" rel="stylesheet" /> <script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/js/select2.min.js"></script> </head> <body> <jsp:include page="/menu.jsp"/> <div class="container"> <div class="row"> <h3>Nuevo libro</h3> </div> <div class="row"> <div class=" col-md-7"> <c:if test="${not empty listaErrores}"> <div class="alert alert-danger"> <ul> <c:forEach var="errores" items="${requestScope.listaErrores}"> <li>${errores}</li> </c:forEach> </ul> </div> </c:if> <form role="form" action="${contextPath}/libros.do" method="POST"> <input type="hidden" name="op" value="modificar"> <div class="well well-sm"><strong><span class="glyphicon glyphicon-asterisk"></span>Campos requeridos</strong></div> <div class="form-group"> <label for="codigo">Codigo del libro:</label> <div class="input-group"> <input type="text" readonly class="form-control" name="codigo" id="codigo" value="${libro.codigoLibro}" placeholder="Ingresa el codigo del libro" > <span class="input-group-addon"><span class="glyphicon glyphicon-asterisk"></span></span> </div> </div> <div class="form-group"> <label for="nombre">Nombre del libro:</label> <div class="input-group"> <input type="text" class="form-control" name="nombre" id="nombre" va-lue="${libro.nombreLibro}" placeholder="Ingresa el nombre del libro" > <span class="input-group-addon"><span class="glyphicon glyphicon-asterisk"></span></span> </div> </div> <div class="form-group"> <label for="existencias">existencias:</label> <div class="input-group"> <input type="text" class="form-control" id="existencias" va-lue="${libro.existencias}" name="existencias" placeholder="Ingresa las existencias del libro"> <span class="input-group-addon"><span class="glyphicon glyphicon-asterisk"></span></span> </div> </div> <div class="form-group"> <label for="precio">precio:</label> <div class="input-group"> <input type="number" step="0.1" min="0" class="form-control" id="precio" value="${libro.precio}" name="precio" placeholder="Ingresa el precio del libro" > <span class="input-group-addon"><span class="glyphicon glyphicon-asterisk"></span></span> </div> </div> <div class="form-group"> <label for="codigoEditorial">Editorial:</label> <div class="input-group"> <select name="codigoEditorial" id="codigoEditorial" class="form-control"> <c:forEach items="${requestScope.listaEditoriales}" var="editorial"> <option val-ue="${editorial.codigoEditorial}">${editorial.nombreEditorial}</option>

45

</c:forEach> </select> <span class="input-group-addon"><span class="glyphicon glyphicon-asterisk"></span></span> </div> </div> <div class="form-group"> <label for="codigoAutor">Autor:</label> <div class="input-group"> <select name="codigoAutor" id="codigoAutor" class="form-control"> <c:forEach var="autor" items="${requestScope.listaAutores}"> <option value="${autor.codigoAutor}">${autor.nombreAutor}</option> </c:forEach> </select> <span class="input-group-addon"><span class="glyphicon glyphicon-asterisk"></span></span> </div> </div> <div class="form-group"> <label for="codigoGenero">Genero:</label> <div class="input-group"> <select name="idGenero" id="codigoGenero" class="form-control"> <c:forEach var="genero" items="${requestScope.listaGeneros}"> <option value="${genero.idGenero}">${genero.nombreGenero}</option> </c:forEach> </select> <span class="input-group-addon"><span class="glyphicon glyphicon-asterisk"></span></span> </div> </div> <div class="form-group"> <label for="descripcion">descripcion del libro:</label> <div class="input-group col-md-12"> <textarea class="form-control" name="descripcion"> ${libro.descripcion} </textarea> </div> </div> <input type="submit" class="btn btn-info" value="Guardar" name="Guardar"> <a class="btn btn-danger" href="${contextPath}/libros.do?op=listar">Cancelar</a> </form> </div> </div> </div> <script> $("#codigoAutor option[value="+ '${libro.codigoAutor}' +"]").attr("selected",true); $("#codigoEditorial option[value="+ '${libro.codigoEditorial}' +"]").attr("selected",true); $("#codigoGenero option[value="+ '${libro.idGenero}' +"]").attr("selected",true); </script> </html>

46

23. Si deployamos nuevamente la aplicación, podremos interactuar con el modulo de Libros, la

diferencia con el del autore, radica en que el mantenimiento obtenie de las clases que representan

los modelos, el listado de información que es visualizdad en los select para: autores, editoriesl y

género.

Listado de Editoral

Lisado de Autores.

47

Listado de Género

IV. EJERCICIOS COMPLEMENTARIOS

El ejemplo todavía no se encuentra completo, crear las clases controladoras para editorial y

genero, además deberá de crear las paginas JSP para listar, editar y crear.

Como siguiente punto, deberá de crear utilizando mvc, el modulo de préstamo de libros a

docentes (tomar en cuenta que deberá de tener el CRUD de docentes).

V. REFERENCIA BIBLIOGRAFICA

Libros en biblioteca UDB.

Ejemplo retomado de Guillermo Calderon, utilizando Netbeans.

https://www.youtube.com/watch?v=vaGdeKDN8TE&list=PLtqGwSACq5Q2JbMNRZNU_

QcDgNV7GFRHR

48

HOJA DE EVALUACIÓN

Actividad a

evaluar Criterio a evaluar

Cumplió Puntaje

SI NO

Discusión de

resultados

Realizó los ejemplos de guía de práctica (40%)

Presentó todos los problemas resueltos (20%)

Funcionan todos correctamente y sin errores (30%)

Envió la carpeta comprimida y organizada

adecuadamente en subcarpetas de acuerdo al tipo de

recurso (10%)

PROMEDIO:

Investigación

complementaria

Envió la investigación complementaria en la fecha

indicada (20%)

Resolvió todos los ejercicios planteados en la

investigación (40%)

Funcionaron correctamente y sin ningún mensaje de error

a nivel de consola o ejecución (40%)

PROMEDIO:

Hoja de cotejo:

Docente:

Máquina No:

GL:

a

2

Alumno: Carnet:

Docente: Fecha:

Título de la guía: No.: