Está en la página 1de 47

Java - Aplicacin Web, Carrito de Compras Parte I - Creacin de la Base de Datos

1. Entorno
MySQL 5.1. NetBeans IDE 6.9.1 Apache Tomcat JDK 1.6.0 - 21

2. Introduccin
En el siguiente tutorial vamos a desarrollar un carrito de compras o lo que seria un sistema de ventas usando el lenguaje de programacin Java, como base de datos vamos a usar el MySQL 5.1. y tambien crearemos un reporte con JasperReports. La base de datos que vamos a crear es una base de datos con fines didcticos, dado que nos faltara crear mas tablas, como la tabla cliente, categora, unidad de medida, etc pero si nos explayamos mucho nos quedara muy largo el tutorial. Ademas en el ejemplo no se explica como disminuir un stock, debido a que eso siempre se les pide a los alumnos universitario que investiguen como hacerlo, pero si quieren una ayudita lo pueden hacer creando Triggers en la base de datos. La aplicacin se desarrollara en un formato web usando el patrn de Modelo, Vista y Controlador. Y para la parte de la vista usaremos lo que se conoce como Java Server Page (JSP). Espero que el ejemplo se de su utilidad.

3. Desarrollo
En esta primera parte del tutorial vamos a crear la base de datos en MySQL 5.1., la base de datos se llamara BDTutorial 3.1. Diseo de la base de datos La base de datos tendra las siguientes tablas: Venta, Producto y DetalleVenta

A continuacin les paso el script de creacin de la base de datos


--------CREADO POR: HENRY JOE WONG URQUIZA FECHA: 24FEB2011 -----------------------------------------------------TUTORIAL DE COMO HACER UN CARRITO DE COMPRAS USANDO EL MODELO VISTA CONTROLADOR Creando la base de datos

CREATE DATABASE IF NOT EXISTS bdtutorial; USE bdtutorial; --- Creando la tabla `detalleventa` -DROP TABLE IF EXISTS `detalleventa`; CREATE TABLE `detalleventa` ( `codigoVenta` int(11) NOT NULL, `codigoProducto` int(11) NOT NULL, `cantidad` decimal(18,2) NOT NULL, `descuento` decimal(18,2) NOT NULL, PRIMARY KEY (`codigoVenta`,`codigoProducto`),

KEY `FK_DetalleVenta_Producto` (`codigoProducto`), CONSTRAINT `FK_DetalleVenta_Producto` FOREIGN KEY (`codigoProducto`) REFERENCES `producto` (`codigoProducto`), CONSTRAINT `FK_DetalleVenta_Venta` FOREIGN KEY (`codigoVenta`) REFERENCES `venta` (`codigoVenta`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; --- Creando la tabla `producto` -DROP TABLE IF EXISTS `producto`; CREATE TABLE `producto` ( `codigoProducto` int(11) NOT NULL, `nombre` varchar(100) NOT NULL, `precio` decimal(18,2) NOT NULL, PRIMARY KEY (`codigoProducto`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; --- Creando la tabla venta -DROP TABLE IF EXISTS `venta`; CREATE TABLE `venta` ( `codigoVenta` int(11) NOT NULL, `cliente` varchar(100) NOT NULL, `fecha` datetime NOT NULL, PRIMARY KEY (`codigoVenta`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

3.2. Creando los procedimientos almacenados Segn Wikipedia un procedimiento almacenado (stored procedure en ingls) es un programa (o procedimiento) el cual es almacenado fsicamente en una base de datos. Su implementacin vara de un manejador de bases de datos a otro. La ventaja de un procedimiento almacenado es que al ser ejecutado, en respuesta a una peticin de usuario, es ejecutado directamente en el motor de bases de datos, el cual usualmente corre en un servidor separado. Como tal, posee acceso directo a los datos que necesita manipular y slo necesita enviar sus resultados de regreso al usuario, deshacindose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes. 3.2.1. Procedimientos almacenados para la tabla Producto
-----CREADO POR: HENRY JOE WONG URQUIZA FECHA: 24FEBRERO2011 -----------------------------------------------------TUTORIAL DE COMO REALIZAR UN CARRITO DE COMPRAS CON JAVA Y JSP APLICANDO MODELO, VISTA Y CONTROLADOR

-- Procedimiento almacenado para insertar un producto DROP PROCEDURE IF EXISTS `spI_producto`; DELIMITER $$ CREATE DEFINER=`root`@`localhost` PROCEDURE `spI_producto`( INOUT _codigoProducto int , _nombre varchar(100) ,

_precio decimal(18, 2) ) BEGIN -- Genera una especie de autoincremental pero yo controlo los codigos -- que genero SELECT IFNULL(MAX(codigoProducto),0)+1 into _codigoProducto FROM `producto`; INSERT INTO `producto`( `codigoProducto`, `nombre`, `precio` ) VALUES ( _codigoProducto, _nombre, _precio ); END $$ DELIMITER ; -- Procedimiento almacenado para actualizar un producto DROP PROCEDURE IF EXISTS `spU_producto`; DELIMITER $$ CREATE DEFINER=`root`@`localhost` PROCEDURE `spU_producto`( _codigoProducto int , _nombre varchar(100) , _precio decimal(18, 2) ) BEGIN UPDATE producto SET `nombre` = _nombre, `precio` = _precio WHERE `codigoProducto` = _codigoProducto ; END $$ DELIMITER ; -- Procedimiento almacenado para obtener todos los productos DROP PROCEDURE IF EXISTS `spF_producto_all`; DELIMITER $$ CREATE DEFINER=`root`@`localhost` PROCEDURE `spF_producto_all`( ) BEGIN SELECT p.codigoProducto, p.nombre, p.precio FROM producto p ORDER BY P.nombre ; END $$ DELIMITER ;

-- Procedimiento almacenado para obtener todos los productos DROP PROCEDURE IF EXISTS `spF_producto_one`; DELIMITER $$ CREATE DEFINER=`root`@`localhost` PROCEDURE `spF_producto_one`( _codigoProducto int ) BEGIN SELECT p.codigoProducto, p.nombre, p.precio FROM producto p WHERE p.codigoProducto = _codigoProducto ORDER BY P.nombre ; END $$ DELIMITER ;

3.2.2. Procedimientos almacenados para la tabla venta


-----CREADO POR: HENRY JOE WONG URQUIZA FECHA: 24FEBRERO2011 -----------------------------------------------------TUTORIAL DE COMO REALIZAR UN CARRITO DE COMPRAS CON JAVA Y JSP APLICANDO MODELO, VISTA Y CONTROLADOR

-- Procedimiento almacenado para insertar una venta DROP PROCEDURE IF EXISTS `spI_venta`; DELIMITER $$ CREATE DEFINER=`root`@`localhost` PROCEDURE `spI_venta`( INOUT _codigoVenta int , _cliente varchar(100) ) BEGIN -- Codigo autogenerado SELECT IFNULL(MAX(codigoVenta),0)+1 into _codigoVenta FROM `venta`; INSERT INTO `venta`( `codigoVenta`, `cliente`, `fecha` ) VALUES ( _codigoVenta, _cliente, CURDATE() ); END $$ DELIMITER ; -- Procedimiento almacenado para obtener todas las ventas DROP PROCEDURE IF EXISTS `spF_venta_All`; DELIMITER $$ CREATE DEFINER=`root`@`localhost` PROCEDURE `spF_venta_All`( ) BEGIN SELECT v.codigoVenta AS CodigoVenta, v.cliente AS Cliente, v.fecha AS Fecha, d.codigoProducto AS CodigoProducto, p.nombre AS Nombre, p.precio AS Precio, d.cantidad AS Cantidad,

FROM

d.descuento AS Descuento, p.precio*d.cantidad AS Parcial, ((p.precio*d.cantidad)-d.descuento) AS SubTotal, ( SELECT SUM((dT.cantidad * pT.precio)-dT.descuento) AS TotalPagar FROM DetalleVenta AS dT INNER JOIN Producto AS pT ON dT.codigoProducto = pT.codigoProducto WHERE dT.codigoVenta=v.codigoVenta ) AS TotalPagar

Venta AS v INNER JOIN DetalleVenta AS d ON v.codigoVenta = d.codigoVenta INNER JOIN Producto AS p ON d.codigoProducto = p.codigoProducto ORDER BY CodigoVenta, Nombre ; END $$ DELIMITER ; -- Procedimiento almacenado para obtener una venta DROP PROCEDURE IF EXISTS `spF_venta_one`; DELIMITER $$ CREATE DEFINER=`root`@`localhost` PROCEDURE `spF_venta_one`( _codigoVenta int ) BEGIN SELECT v.codigoVenta AS CodigoVenta, v.cliente AS Cliente, v.fecha AS Fecha, d.codigoProducto AS CodigoProducto, p.nombre AS Nombre, p.precio AS Precio, d.cantidad AS Cantidad, d.descuento AS Descuento, p.precio*d.cantidad AS Parcial, ((p.precio*d.cantidad)-d.descuento) AS SubTotal, ( SELECT SUM((dT.cantidad * pT.precio)-dT.descuento) AS TotalPagar FROM DetalleVenta AS dT INNER JOIN Producto AS pT ON dT.codigoProducto = pT.codigoProducto WHERE dT.codigoVenta=v.codigoVenta ) AS TotalPagar FROM Venta AS v INNER JOIN DetalleVenta AS d ON v.codigoVenta = d.codigoVenta INNER JOIN Producto AS p ON d.codigoProducto = p.codigoProducto WHERE v.codigoVenta=_codigoVenta ORDER BY Nombre ;

END $$ DELIMITER ;

Java - Aplicacin Web, Carrito de Compras Parte II - Creacin del Modelo

1. Entorno
MySQL 5.1. NetBeans IDE 6.9.1 Apache Tomcat JDK 1.6.0 - 21

2. Introduccin
El modelo es la representacin especfica de la informacin con la cual el sistema opera. En resumen, el modelo se limita a lo relativo de la vista y su controlador facilitando las presentaciones visuales complejas. El sistema tambin puede operar con ms datos no relativos a la presentacin, haciendo uso integrado de otras lgicas de negocio y de datos afines con el sistema modelado. Ac crearemos nuestros JavaBeans y las clases que se encargaran de llamar a los procedimientos almacenados que hemos creado en nuestra base de datos BDTutorial que esta en MySQL 5.1.. Para comunicar Java con Base de datos usamos lo que comnmente se conoce como JDBC y para ejecutar consultas o inserciones a nuestra base de datos usamos las interfaces java.sql.Statement que espera que se le pase una sentencia SQL de forma completa por ejemplo "insert into producto values(1,'valor01')", para ejecutar sentencias preparadas se utiliza la interfaz java.sql.PreparedStatement que en los lugares donde se deben de poner los valores para la sentecia SQL se representan entre ? para despus poder asignar sus valores respectivos por ejemplo "insert into producto values(?,?)" y la ultima clase para llamar a procedimientos almacenados es la clase java.sql.CallableStatement que es la que utilizaremos para este tutorial

3. Creando el Proyecto
3.1. Proyecto en Netbeans Primero debemos de crear un proyecto web en Netbeans y para eso abriremos el Netbeans y buscaremos el menu File y luego New Project. Y seleccionaremos que deseamos crear un proyecto del tipo Web Application

De ah presionamos el botn Next y nos pedir que pongamos un nombre a nuestro proyecto y lo llamaremos CarritoComprasJSP

Luego nos pedir que seleccionamos en que servidor queremos que se ejecute nuestro proyecto web. En este caso lo ejecutaremos en el servidor de Apache Tomcat

3.2. Estructura del proyecto

Para explicar la estructura que vamos a tener del proyecto, les presento el siguiente grfico que nos indicara como se distribuir el Modelo, el Controlador y la Vista

4. Desarrollo
4.1. Creando el Paquete Primero debemos de crear nuestro paquete que se llamara Modelo. En el grfico se explica como crear el paquete

Y al paquete lo llamaremos Modelo 4.2. Creando los JavaBeans Para crear los JavaBeans debemos de crear las clases que tendran la misma estructura de las tablas de nuestra base de datos, eso quiere decir que si por ejemplo en alguna tabla de nuestra base de datos tenemos una columna del tipo Varchar en Java tendriamos una variable del tipo String, si tenemos un variable del tipo Decimal en Java seria double. Para eso hacemos clic derecho en nuestro paquete que se llama Modelo, de ahi nos vamos a New y seleccionamos Java Class 4.2.1. Clase Producto La clase Producto tiene la misma estructura de nuestra tabla Producto de nuestra base de datos, a continuacin les comparto el cdigo fuente de la clase.

package Modelo; //@author Henry Joe Wong Urquiza public class Producto { //Las columnas que tiene la tabla Producto private int codigoProducto; private String nombre; private double precio; //Constructor de la clase sin parametros public Producto() { } //Constructor de la clase con parametros public Producto(int codigoProducto, String nombre, double precio) { this.codigoProducto = codigoProducto; this.nombre = nombre; this.precio = precio; } //Metodo toString de la clase que nos retorna //el nombre del producto @Override public String toString() { return nombre.toUpperCase(); } //Metodos get y set de la clase public int getCodigoProducto() { return codigoProducto; } public void setCodigoProducto(int codigoProducto) { this.codigoProducto = codigoProducto; } public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } public double getPrecio() { return precio; } public void setPrecio(double precio) { this.precio = precio; } }

4.2.2. Clase Venta La clase Venta tiene la misma estructura de nuestra tabla Venta de nuestra base de datos,

a continuacin les comparto el cdigo fuente de la clase.


package Modelo; // @author hwong import java.sql.Timestamp; public class Venta { //Las columnas que tiene la tabla Venta private int codigoVenta; private String cliente; private Timestamp fecha; //Constructor de la clase sin parametros public Venta() { } //Constructor de la clase con parametros public Venta(int codigoVenta, String cliente, Timestamp fecha) { this.codigoVenta = codigoVenta; this.cliente = cliente; this.fecha = fecha; } //Metodos get y set de la clase public String getCliente() { return cliente; } public void setCliente(String cliente) { this.cliente = cliente; } public int getCodigoVenta() { return codigoVenta; } public void setCodigoVenta(int codigoVenta) { this.codigoVenta = codigoVenta; } public Timestamp getFecha() { return fecha; } public void setFecha(Timestamp fecha) { this.fecha = fecha; } }

4.2.3. Clase DetalleVenta La clase DetalleVenta tiene la misma estructura de nuestra tabla DetalleVenta de nuestra base de datos, a continuacin les comparto el cdigo fuente de la clase.

package Modelo; // @author hwong public class DetalleVenta { //Las columnas que tiene la tabla DetalleVenta private private private private private private int codigoVenta; int codigoProducto; double cantidad; double descuento; Producto producto; Venta venta;

//Constructor sin parametros public DetalleVenta() { } //Constructor con parametros public DetalleVenta(int codigoVenta, int codigoProducto, double cantidad, double descuento) { this.codigoVenta = codigoVenta; this.codigoProducto = codigoProducto; this.cantidad = cantidad; this.descuento = descuento; } //Metodos Get y Set de la clase public double getCantidad() { return cantidad; } public void setCantidad(double cantidad) { this.cantidad = cantidad; } public int getCodigoProducto() { return codigoProducto; } public void setCodigoProducto(int codigoProducto) { this.codigoProducto = codigoProducto; } public int getCodigoVenta() { return codigoVenta; } public void setCodigoVenta(int codigoVenta) { this.codigoVenta = codigoVenta; } public double getDescuento() { return descuento; } public void setDescuento(double descuento) { this.descuento = descuento; }

public Producto getProducto() { return producto; } public void setProducto(Producto producto) { this.producto = producto; } public Venta getVenta() { return venta; } public void setVenta(Venta venta) { this.venta = venta; }

4.2.4. Estructura final Al finalizar de crear las clases deberiamos tener 3 clases tal como se muestra en el grafico siguiente

4.3. Creando las clases para comunicar con la base de datos 4.3.1. Cargando el Driver Para poder comunicar nuestro proyecto con MySQL 5.1. primero debemos de adicionar el driver a nuestro proyecto. Para eso hacemos clic derecho en nuestro proyecto y nos vamos a la opcin que dice Properties y seleccionamos de ah Libraries y presionamos el botn que dice Add Library y buscamos el que dice MySQL JDBC Driver

4.3.2. Creando la clase Conexion Esta clase es la que centraliza la conexin con nuestra base de datos que esta en MySQL nos va dar soporte para ciertos mtodos que vamos a usar en nuestras dems clases
package Modelo; import import import import java.sql.CallableStatement; java.sql.Connection; java.sql.DriverManager; java.sql.ResultSet;

//@author Henry Joe Wong Urquiza public class Conexion { //La url con la cual nos conectariamos a la base de datos private static String url = "jdbc:mysql://localhost/bdtutorial"; //El usuario de la base de datos private static String user = "root"; //La clave del usuario de la base de datos

private static String password = "clave"; //Metodo para obtener la conexion con la base de datos public static synchronized Connection getConexion() { Connection cn = null; try { //Cargamos el driver y le decimos que vamos a usar //una conexion con mysql Class.forName("com.mysql.jdbc.Driver"); //Obtenemos la conexion cn = DriverManager.getConnection(url, user, password); } catch (Exception e) { cn = null; } finally { return cn; } } //Metodo utilizado para cerrar el callablestatemente public static synchronized void cerrarCall(CallableStatement cl) { try{cl.close();}catch(Exception e){} } //Metodo utilizado para cerrar el resulset de datos public static synchronized void cerrarConexion(ResultSet rs) { try{rs.close();} catch (Exception e) {} } //Metodo utilizado para cerrar la conexion public static synchronized void cerrarConexion(Connection cn) { try{cn.close();} catch (Exception e) {} } //Metodo utilizado para deshacer los cambios en la base de datos public static synchronized void deshacerCambios(Connection cn) { try{cn.rollback();}catch (Exception e){} }

4.3.3. Creando la clase ProductoBD Que se encargara de hacer las consultas o inserciones a nuestra tabla Producto
package Modelo; import import import import import import java.sql.CallableStatement; java.sql.Connection; java.sql.ResultSet; java.sql.SQLException; java.sql.Types; java.util.ArrayList;

// @autor Henry Joe Wong Uruqiza // Archivo: ProductoBD.java // Creado: 24FEBRERO2011 12:39:08 PM public class ProductoBD { //Metodo utilizado para insertar un Producto a nuestra Base de datos public static synchronized boolean insertarProducto(Producto varproducto) {

Connection cn = null; CallableStatement cl = null; boolean rpta = false; try { //Nombre del procedimiento almacenado y como espera tres parametros //le ponemos 3 interrogantes String call = "{CALL spI_producto(?,?,?)}"; //Obtenemos la conexion cn = Conexion.getConexion(); //Decimos que vamos a crear una transaccion cn.setAutoCommit(false); //Preparamos la sentecia cl = cn.prepareCall(call); //Como el codigo se autogenera y es del tipo OUT en el procedimiento //almacenado le decimos que es OUT y el del tipo Integer en Java cl.registerOutParameter(1, Types.INTEGER); //El siguiente parametro del procedimiento almacenado es el nombre cl.setString(2, varproducto.getNombre()); //Y por ultimo el precio cl.setDouble(3, varproducto.getPrecio()); //Ejecutamos la sentencia y si nos devuelve el valor de 1 es porque //registro de forma correcta los datos rpta = cl.executeUpdate() == 1 ? true : false; if (rpta) { //Confirmamos la transaccion cn.commit(); } else { //Negamos la transaccion Conexion.deshacerCambios(cn); } Conexion.cerrarCall(cl); Conexion.cerrarConexion(cn); } catch (SQLException e) { e.printStackTrace(); Conexion.deshacerCambios(cn); Conexion.cerrarCall(cl); Conexion.cerrarConexion(cn); } catch (Exception e) { e.printStackTrace(); Conexion.deshacerCambios(cn); Conexion.cerrarCall(cl); Conexion.cerrarConexion(cn); } return rpta;

//Metodo utilizado para insertar un Producto a nuestra Base de datos public static synchronized boolean actualizarProducto(Producto varproducto) { Connection cn = null; CallableStatement cl = null; boolean rpta = false; try { //Nombre del procedimiento almacenado y como espera tres parametros //le ponemos 3 interrogantes String call = "{CALL spU_producto(?,?,?)}"; //Obtenemos la conexion cn = Conexion.getConexion(); //Decimos que vamos a crear una transaccion

cn.setAutoCommit(false); //Preparamos la sentecia cl = cn.prepareCall(call); //El primer parametro del procedimiento almacenado es el codigo cl.setInt(1, varproducto.getCodigoProducto()); //El siguiente parametro del procedimiento almacenado es el nombre cl.setString(2, varproducto.getNombre()); //Y por ultimo el precio cl.setDouble(3, varproducto.getPrecio()); //Ejecutamos la sentencia y si nos devuelve el valor de 1 es porque //registro de forma correcta los datos rpta = cl.executeUpdate() == 1 ? true : false; if (rpta) { //Confirmamos la transaccion cn.commit(); } else { //Negamos la transaccion Conexion.deshacerCambios(cn); } Conexion.cerrarCall(cl); Conexion.cerrarConexion(cn); } catch (SQLException e) { e.printStackTrace(); Conexion.deshacerCambios(cn); Conexion.cerrarCall(cl); Conexion.cerrarConexion(cn); } catch (Exception e) { e.printStackTrace(); Conexion.deshacerCambios(cn); Conexion.cerrarCall(cl); Conexion.cerrarConexion(cn); } return rpta; } //Metodo utilizado para obtener todos los productos de nuestra base de datos public static synchronized ArrayList<Producto> obtenerProducto() { //El array que contendra todos nuestros productos ArrayList<Producto> lista = new ArrayList<Producto>(); Connection cn = null; CallableStatement cl = null; ResultSet rs = null; try { //Nombre del procedimiento almacenado String call = "{CALL spF_producto_all()}"; cn = Conexion.getConexion(); cl = cn.prepareCall(call); //La sentencia lo almacenamos en un resulset rs = cl.executeQuery(); //Consultamos si hay datos para recorrerlo //e insertarlo en nuestro array while (rs.next()) { Producto p = new Producto(); //Obtenemos los valores de la consulta y creamos //nuestro objeto producto p.setCodigoProducto(rs.getInt("codigoProducto")); p.setNombre(rs.getString("nombre")); p.setPrecio(rs.getDouble("precio"));

} Conexion.cerrarCall(cl); Conexion.cerrarConexion(cn); } catch (SQLException e) { e.printStackTrace(); Conexion.cerrarCall(cl); Conexion.cerrarConexion(cn); } catch (Exception e) { e.printStackTrace(); Conexion.cerrarCall(cl); Conexion.cerrarConexion(cn); } return lista; }

//Lo adicionamos a nuestra lista lista.add(p);

//Metodo utilizado para obtener todos los productos de nuestra base de datos public static synchronized Producto obtenerProducto(int codigo) { Producto p = new Producto(); Connection cn = null; CallableStatement cl = null; ResultSet rs = null; try { //Nombre del procedimiento almacenado String call = "{CALL spF_producto_one(?)}"; cn = Conexion.getConexion(); cl = cn.prepareCall(call); cl.setInt(1, codigo); //La sentencia lo almacenamos en un resulset rs = cl.executeQuery(); //Consultamos si hay datos para recorrerlo //e insertarlo en nuestro array while (rs.next()) { //Obtenemos los valores de la consulta y creamos //nuestro objeto producto p.setCodigoProducto(rs.getInt("codigoProducto")); p.setNombre(rs.getString("nombre")); p.setPrecio(rs.getDouble("precio")); } Conexion.cerrarCall(cl); Conexion.cerrarConexion(cn); } catch (SQLException e) { e.printStackTrace(); Conexion.cerrarCall(cl); Conexion.cerrarConexion(cn); } catch (Exception e) { e.printStackTrace(); Conexion.cerrarCall(cl); Conexion.cerrarConexion(cn); } return p; } }

4.3.4. Creando la clase DetalleVentaBD Sirve para insertar un detalle de la venta, el metodo insertarDetalle espera obtener la conexion y la transaccion de la clase Venta. Debido a que esta ultima clase es la que inicia la transaccion con la base de datos y es la nica encargada de confirmar o negar la transaccion
package Modelo; // @autor Henry Joe Wong Uruqiza import java.sql.CallableStatement; import java.sql.Connection; import java.sql.SQLException; // Archivo: DetalleVentaBD.java // Creado: 24FEBRERO2011 12:39:08 PM public class DetalleVentaBD { //Metodo utilizado para insertar un Detalle de Venta a nuestra Base de datos //Obtenemos la conexion de Venta debido a que la clase Venta es la que inicia //la transaccion public static synchronized boolean insertarDetalleVenta(DetalleVenta varDetalle, Connection cn) { CallableStatement cl = null; boolean rpta = false; try { //Nombre del procedimiento almacenado y como espera tres parametros //le ponemos 3 interrogantes String call = "{CALL spI_detalleventa(?,?,?,?)}"; //Preparamos la sentecia cl = cn.prepareCall(call); //Codigo de la venta cl.setInt(1, varDetalle.getCodigoVenta()); //Codigo del producto cl.setInt(2, varDetalle.getCodigoProducto()); //La cantidad cl.setDouble(3, varDetalle.getCantidad()); //El descuento cl.setDouble(4, varDetalle.getDescuento()); //Ejecutamos la sentencia y si nos devuelve el valor de 1 es porque //registro de forma correcta los datos rpta = cl.executeUpdate() == 1 ? true : false; Conexion.cerrarCall(cl); } catch (SQLException e) { e.printStackTrace(); Conexion.cerrarCall(cl); } catch (Exception e) { e.printStackTrace(); Conexion.cerrarCall(cl); } return rpta; } }

4.3.5. Creando la clase VentaBD

package Modelo; import import import import import import java.sql.CallableStatement; java.sql.Connection; java.sql.ResultSet; java.sql.SQLException; java.sql.Types; java.util.ArrayList;

// @autor Henry Joe Wong Uruqiza // Archivo: VentaBD.java // Creado: 24FEBRERO2011 12:39:08 PM public class VentaBD { //Metodo utilizado para insertar una Venta a nuestra Base de datos public static synchronized boolean insertarVenta(Venta varventa, ArrayList<DetalleVenta> detalle) { Connection cn = null; CallableStatement cl = null; boolean rpta = false; try { //Nombre del procedimiento almacenado y como espera tres parametros //le ponemos 3 interrogantes String call = "{CALL spI_venta(?,?)}"; //Obtenemos la conexion cn = Conexion.getConexion(); //Decimos que vamos a crear una transaccion cn.setAutoCommit(false); //Preparamos la sentecia cl = cn.prepareCall(call); //Como el codigo se autogenera y es del tipo OUT en el procedimiento //almacenado le decimos que es OUT y el del tipo Integer en Java cl.registerOutParameter(1, Types.INTEGER); //El siguiente parametro del procedimiento almacenado es el cliente cl.setString(2, varventa.getCliente()); //Ejecutamos la sentencia y si nos devuelve el valor de 1 es porque //registro de forma correcta los datos rpta = cl.executeUpdate() == 1 ? true : false; //Codigo que se genero producto de la insercion ---> codigoVenta varventa.setCodigoVenta(cl.getInt(1)); if (rpta) { for (DetalleVenta det : detalle) { //Establecemos al detalle el codigo genero producto de la venta det.setCodigoVenta(varventa.getCodigoVenta()); //Insertamos el detalle y le pasamos la conexion rpta = DetalleVentaBD.insertarDetalleVenta(det, cn); //Si nos devuelve false salimos del for if (!rpta) { break; } } if (rpta) { //Confirmamos la transaccion cn.commit(); } else {

} } else { //Negamos la transaccion Conexion.deshacerCambios(cn); } Conexion.cerrarCall(cl); Conexion.cerrarConexion(cn); } catch (SQLException e) { e.printStackTrace(); Conexion.deshacerCambios(cn); Conexion.cerrarCall(cl); Conexion.cerrarConexion(cn); } catch (Exception e) { e.printStackTrace(); Conexion.deshacerCambios(cn); Conexion.cerrarCall(cl); Conexion.cerrarConexion(cn); } return rpta; }

//Negamos la transaccion Conexion.deshacerCambios(cn);

//Metodo utilizado para obtener todos las ventas de nuestra base de datos public static synchronized ArrayList<DetalleVenta> obtenerVentas() { //El array que contendra todos nuestros productos ArrayList<DetalleVenta> lista = new ArrayList<DetalleVenta>(); Connection cn = null; CallableStatement cl = null; ResultSet rs = null; try { //Nombre del procedimiento almacenado String call = "{CALL spF_venta_All()}"; cn = Conexion.getConexion(); cl = cn.prepareCall(call); //La sentencia lo almacenamos en un resulset rs = cl.executeQuery(); //Consultamos si hay datos para recorrerlo //e insertarlo en nuestro array while (rs.next()) { Venta ven=new Venta(); Producto pro=new Producto(); DetalleVenta det=new DetalleVenta(); ven.setCodigoVenta(rs.getInt("CodigoVenta")); ven.setCliente(rs.getString("Cliente")); ven.setFecha(rs.getTimestamp("Fecha")); pro.setCodigoProducto(rs.getInt("CodigoProducto")); pro.setNombre(rs.getString("Nombre")); pro.setPrecio(rs.getDouble("Precio")); det.setCantidad(rs.getDouble("Cantidad")); det.setDescuento(rs.getDouble("Parcial")); det.setVenta(ven); det.setProducto(pro); lista.add(det); } Conexion.cerrarCall(cl); Conexion.cerrarConexion(cn);

} }

} catch (SQLException e) { e.printStackTrace(); Conexion.cerrarCall(cl); Conexion.cerrarConexion(cn); } catch (Exception e) { e.printStackTrace(); Conexion.cerrarCall(cl); Conexion.cerrarConexion(cn); } return lista;

4.4. Estructura final de todas las clases

Java - Aplicacin Web, Carrito de Compras Parte III - Creacin del Controlador

1. Entorno
MySQL 5.1. NetBeans IDE 6.9.1 Apache Tomcat JDK 1.6.0 - 21

2. Introduccin
El controlador responde usualmente a acciones del usuario, e invoca peticiones al modelo y, probablemente, a la vista. En Java por lo general los controladores se encuentran en un Servlet y es el que recibe todas las peticiones de la Vista y llama al Modelo. Y es por eso que en esta parte de tutorial vamos a desarrollar lo que corresponde al Controlador. Para no perder la idea del tema les recomiendo que revisen informacin sobre peticiones Post, Get y sobre manejo de Sesiones con Java.

3. Desarrollo
3.1. Creando el paquete Lo que primero debemos de hacer es crear un paquete dentro de nuestro proyecto en Netbeans el cual se llamara "Controlador" y en este paquete es donde se almacenara los Servlet que recibir las peticiones de la Vista y la comunicara con el Modelo. El Servlet que vamos a crear lo llamaremos "Controlador.java". Para crear un Servlet primero debemos hacer clic derecho en nuestro paquete que se llama "Controlador" ir luego a "New" y finalmente "Servlet"

3.2. La clase Controlador Como les dije esta clase se encargara de recibir todas las peticiones de la vista, en nuestro caso de los JSP que vamos a crear y se encargara de llamar a los mtodos de la base de datos para realizar las inserciones, actualizaciones o consultas del caso.
package Controlador; import import import import import import import import import import import import Modelo.DetalleVenta; Modelo.Producto; Modelo.ProductoBD; Modelo.Venta; Modelo.VentaBD; java.io.IOException; java.util.ArrayList; javax.servlet.ServletException; javax.servlet.http.HttpServlet; javax.servlet.http.HttpServletRequest; javax.servlet.http.HttpServletResponse; javax.servlet.http.HttpSession;

//@author Henry Joe Wong Urquiza public class Controlador extends HttpServlet { //Para controlar peticiones del tipo GET @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } //Para controlar peticiones del tipo POST @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } //Un metodo que recibe todas las peticiones a si sea GET y POST protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //La accion se va a guardar en un caja de texto oculto que nos dira que accion //debemos hacer String accion = request.getParameter("accion"); if (accion.equals("RegistrarProducto")) { this.registrarProducto(request, response); } else if (accion.equals("ModificarProducto")) { this.actualizarProducto(request, response); } else if (accion.equals("AnadirCarrito")) { this.aadirCarrito(request, response); } else if (accion.equals("RegistrarVenta")) { this.registrarVenta(request, response); } }

//Metodo que sirve para registrar un producto private void registrarProducto(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Producto p = new Producto(); //request.getParameter --> Sirve para obtener los valores de las cajas de texto p.setNombre(request.getParameter("txtNombre").toUpperCase()); p.setPrecio(Double.parseDouble(request.getParameter("txtPrecio"))); boolean rpta = ProductoBD.insertarProducto(p); if (rpta) { //Si inserto lo redireccionamos a otra pagina que se llama "mensaje.jsp" response.sendRedirect("mensaje.jsp?men=Se registro del producto de manera correcta"); } else { //Si no se inserto lo redireccionamos a otra pagina que se llama "mensaje.jsp" response.sendRedirect("mensaje.jsp?men=No se registro el producto"); } } //Metodo que sirve para actualizar un producto private void actualizarProducto(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Producto p = new Producto(); p.setCodigoProducto(Integer.parseInt(request.getParameter("txtCodigo"))); p.setNombre(request.getParameter("txtNombre").toUpperCase()); p.setPrecio(Double.parseDouble(request.getParameter("txtPrecio"))); boolean rpta = ProductoBD.actualizarProducto(p); if (rpta) { response.sendRedirect("mensaje.jsp?men=Se actualizo el producto de manera correcta"); } else { response.sendRedirect("mensaje.jsp?men=No se actualizo el producto"); } } //Sirve para aadir un detalle al carrito //La informacion del carrito de compras se guarda en una sesion private void aadirCarrito(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //Obtenemos la sesion actual HttpSession sesion = request.getSession(); ArrayList<DetalleVenta> carrito; //Si no existe la sesion creamos al carrito de cmoras if (sesion.getAttribute("carrito") == null) { carrito = new ArrayList<DetalleVenta>(); } else { carrito = (ArrayList<DetalleVenta>) sesion.getAttribute("carrito"); } //Obtenemos el producto que deseamos aadir al carrito Producto p = ProductoBD.obtenerProducto(Integer.parseInt(request.getParameter("txtCodigo"))); //Creamos un detalle para el carrtio DetalleVenta d = new DetalleVenta(); //Obtenemos los valores de la caja de texto d.setCodigoProducto(Integer.parseInt(request.getParameter("txtCodigo")));

} //Metodo que sirve para registrar toda la venta en la base de datos private void registrarVenta(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession sesion = request.getSession(); Venta v=new Venta(); v.setCliente(request.getParameter("txtCliente").toUpperCase()); ArrayList<DetalleVenta> detalle = (ArrayList<DetalleVenta>) sesion.getAttribute("carrito"); boolean rpta=VentaBD.insertarVenta(v, detalle); if (rpta) { response.sendRedirect("mensaje.jsp?men=Se registro la venta de manera correcta"); } else { response.sendRedirect("mensaje.jsp?men=No se registro la venta"); } } }

d.setProducto(p); d.setCantidad(Double.parseDouble(request.getParameter("txtCantidad"))); //Calculamos el descuento, si es sub detalle es mayor a 50 se le hace //un descuento del 5% aca es donde se encuentra la logica del negocio double subTotal = p.getPrecio() * d.getCantidad(); if (subTotal > 50) { d.setDescuento(subTotal * (5D / 100D)); } else { d.setDescuento(0); } //Sirva para saber si tenemos agregado el producto al carrito de compras int indice = -1; //recorremos todo el carrito de compras for (int i = 0; i < carrito.size(); i++) { DetalleVenta det = carrito.get(i); if (det.getCodigoProducto() == p.getCodigoProducto()) { //Si el producto ya esta en el carrito, obtengo el indice dentro //del arreglo para actualizar al carrito de compras indice = i; break; } } if (indice == -1) { //Si es -1 es porque voy a registrar carrito.add(d); } else { //Si es otro valor es porque el producto esta en el carrito //y vamos actualizar la carrito.set(indice, d); } //Actualizamos la sesion del carrito de compras sesion.setAttribute("carrito", carrito); //Redireccionamos al formulario de culminar la venta response.sendRedirect("registrarVenta.jsp");

Java - Aplicacin Web, Carrito de Compras Parte IV - Creacin de la Vista

1. Entorno
MySQL 5.1. NetBeans IDE 6.9.1 Apache Tomcat JDK 1.6.0 - 21

2. Introduccin
La vista sirve para interactuar con el usuario, toma datos del usuario para registrar en la base de datos o mostrar los datos resultantes de una consultas. 2.1. JSP JavaServer Pages (JSP) es una tecnologa Java que permite generar contenido dinmico para web, en forma de documentos HTML, XML o de otro tipo. Esta tecnologa es un desarrollo de la compaa Sun Microsystems. La Especificacin JSP 1.2 fue la primera que se liber y en la actualidad est disponible la Especificacin JSP 2.1. Las JSP's permiten la utilizacin de cdigo Java mediante scripts. Adems, es posible utilizar algunas acciones JSP predefinidas mediante etiquetas. Estas etiquetas pueden ser enriquecidas mediante la utilizacin de Bibliotecas de Etiquetas (TagLibs o Tag Libraries) externas e incluso personalizadas.

3. Desarrollo
3.1. Crear los JSP Primero lo que debemos de hacer es crear los JSP, que ser la parte con la cual el usuario interactuara con el sistema. Para eso hacemos clic derecho en la carpeta que dice Web Pages de ah nos vamos New y luego JSP.

Y creamos siete JSP: index --> Que nos mostrara un listado de todos los productos que tenemos y que deseamos modificar registrarProducto --> Registrar un producto nuevo al sistema actualizarProducto --> Sirve para modificar un producto del sistema anadirCarrito --> Aade un detalle al carrito de compras registrarVenta --> Registrar la venta verVentas --> Reporte de las ventas mensaje --> Muestra los mensajes de realizacin exitosa o fallo

3.2. index.jsp El diseo del index.jsp, seria el siguiente

Y su cdigo fuente seria el siguiente:


<%-- Importaciones que son necesarias para que se muestre el JSP --%> <%@page import="java.util.ArrayList"%> <%@page import="Modelo.*" %> <%@page import="java.util.*" %> <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>.:Programando con Caf - Carrito de Compras - Ing. Henry Wong</title> </head> <body> <h1>Programando con Caf<br>Ing. Henry Joe Wong Urquiza</h1> <div>

<%-- Menu de opciones --%> <a href="index.jsp">Inicio</a> | <a href="registrarProducto.jsp">Registrar Producto</a> | <a href="registrarVenta.jsp">Registrar Venta</a> | <a href="verVentas.jsp">Consultar Ventas</a> | <a href="Reporte">Reporte Producto</a> </div> <br > <div> <table border="1"> <tr style="background-color: chocolate"> <td colspan="4">Lista de Productos</td> </tr> <tr style="background-color: chocolate"> <td>Codigo</td> <td>Nombre</td> <td>Precio</td> <td>Proceso</td> </tr> <%-- Lista de todos los productos --%> <% ArrayList<Producto> lista = ProductoBD.obtenerProducto(); for (Producto p : lista) { %> <tr> <td><%= p.getCodigoProducto()%></td> <td><%= p.getNombre()%></td> <td><%= p.getPrecio()%></td> <%-- Enlaces a las paginas de actualizar o anadir al carrito --%> <td><a href="actualizarProducto.jsp?id=<%= p.getCodigoProducto()%>">Modificar</a> | <a href="anadirCarrito.jsp?id=<%= p.getCodigoProducto() %>">Aadir</a> </td> </tr> <% } %> </table> </div> </body> </html>

3.3. registrarProducto.jsp El diseo seria el siguiente

Su cdigo fuente seria el siguiente:


<%@page import="java.util.ArrayList"%> <%@page import="Modelo.*" %> <%@page import="java.util.*" %> <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>.:Programando con Caf - Carrito de Compras - Ing. Henry Wong</title> </head> <body> <h1>Programando con Caf<br>Ing. Henry Joe Wong Urquiza</h1> <div>

<a href="index.jsp">Inicio</a> | <a href="registrarProducto.jsp">Registrar Producto</a> | <a href="registrarVenta.jsp">Registrar Venta</a> | <a href="verVentas.jsp">Consultar Ventas</a> | <a href="Reporte">Reporte Producto</a> </div> <br > <%-- En el action del formulario le decimos que llama al Controlador --%> <form method="post" action="Controlador"> <div> <input type="hidden" name="accion" value="RegistrarProducto" /> <table border="1"> <tr> <td>Nombre</td> <td><input type="text" name="txtNombre" value="" /></td> </tr> <tr> <td>Precio</td> <td><input type="text" name="txtPrecio" value="0" /></td> </tr> <tr> <td></td> <td><input type="submit" value="Registrar" name="btnRegistrar" /></td> </tr> </table> </div> </form> </body> </html>

3.4. actualizarProducto.jsp Este formulario recibe por peticin GET el cdigo del producto seleccionado desde la pagina index.jsp y muestra su informacin para luego actualizar. Su diseo del formulario seria el siguiente.

Su cdigo fuente seria el siguiente:


<%@page import="java.util.ArrayList"%> <%@page import="Modelo.*" %> <%@page import="java.util.*" %> <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <%-- Obtenemos el id o el codigo del producto que deseamos modificar o actualizar --%> <% Producto p=ProductoBD.obtenerProducto(Integer.parseInt(request.getParameter("id"))); %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>.:Programando con Caf - Carrito de Compras - Ing. Henry Wong</title> </head> <body> <h1>Programando con Caf<br>Ing. Henry Joe Wong Urquiza</h1> <div> <a href="index.jsp">Inicio</a> | <a href="registrarProducto.jsp">Registrar Producto</a> | <a href="registrarVenta.jsp">Registrar Venta</a> | <a href="verVentas.jsp">Consultar Ventas</a> | <a href="Reporte">Reporte Producto</a> </div> <br > <%-- En el action del formulario le decimos que llama al Controlador --%> <form method="post" action="Controlador"> <div> <%-- Indica al controlador que vamos hacer una modificacion --%> <input type="hidden" name="accion" value="ModificarProducto" /> <table border="1"> <tr>

<td>Codigo</td> <%-- Escribimos el codigo del producto a modificar --%> <td><input type="text" name="txtCodigo" value="<%= p.getCodigoProducto()%>" readonly /></td> </tr> <tr> <td>Nombre</td> <%-- Escribimos el nombre del producto a modificar --%> <td><input type="text" name="txtNombre" value="<%= p.getNombre()%>" /></td> </tr> <tr> <td>Precio</td> <%-- Escribimos el precio del producto a modificar --%> <td><input type="text" name="txtPrecio" value="<%= p.getPrecio()%>" /></td> </tr> <tr> <td></td> <td><input type="submit" value="Actualizar" name="btnActualizar" /></td> </tr> </table> </div> </form> </body> </html>

3.5. anadirCarrito.jsp Este formulario nos sirve para aadir un elemento al carrito de compras que tenemos en sesion. Su diseo seria el siguiente:
<%@page import="java.util.ArrayList"%> <%@page import="Modelo.*" %> <%@page import="java.util.*" %> <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <%-- Obtenemos el id o el codigo del producto que deseamos aadir al carrito --%> <% Producto p=ProductoBD.obtenerProducto(Integer.parseInt(request.getParameter("id"))); %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>.:Programando con Caf - Carrito de Compras - Ing. Henry Wong</title> </head> <body>

<h1>Programando con Caf<br>Ing. Henry Joe Wong Urquiza</h1> <div> <a href="index.jsp">Inicio</a> | <a href="registrarProducto.jsp">Registrar Producto</a> | <a href="registrarVenta.jsp">Registrar Venta</a> | <a href="verVentas.jsp">Consultar Ventas</a> | <a href="Reporte">Reporte Producto</a> </div> <br > <form method="post" action="Controlador"> <div> <input type="hidden" name="accion" value="AnadirCarrito" /> <table border="1"> <tr> <td>Codigo</td> <td><input type="text" name="txtCodigo" value="<%= p.getCodigoProducto()%>" readonly /></td> </tr> <tr> <td>Nombre</td> <td><input type="text" name="txtNombre" value="<%= p.getNombre()%>" readonly /></td> </tr> <tr> <td>Precio</td> <td><input type="text" name="txtPrecio" value="<%= p.getPrecio()%>" readonly /></td> </tr> <tr> <td>Cantidad Pedir</td> <td><input type="text" name="txtCantidad" value="0" /></td> </tr> <tr> <td></td> <td><input type="submit" value="Aadir" name="btnAnadir" /></td> </tr> </table> </div> </form> </body> </html>

3.6. registrarVenta.jsp Este formulario es el encargado de llamar los mtodos que registraran todos los productos guardados en la sesin a la base de datos. Su diseo del formulario es el siguiente

Su codigo fuente seria:


<%@page import="java.util.ArrayList"%> <%@page import="Modelo.*" %> <%@page import="java.util.*" %> <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>.:Programando con Caf - Carrito de Compras - Ing. Henry Wong</title> </head> <body> <h1>Programando con Caf<br>Ing. Henry Joe Wong Urquiza</h1> <div> <a href="index.jsp">Inicio</a> |

<a href="registrarProducto.jsp">Registrar Producto</a> | <a href="registrarVenta.jsp">Registrar Venta</a> | <a href="verVentas.jsp">Consultar Ventas</a> | <a href="Reporte">Reporte Producto</a> </div> <br > <div> <form method="post" action="Controlador"> <%-- Llamamos a la accion Registrar Venta --%> <input type="hidden" name="accion" value="RegistrarVenta" /> <table border="1"> <tr style="background-color: chocolate"> <td colspan="5">Carrito de Compras</td> </tr> <tr style="background-color: chocolate"> <td>Cliente:</td> <td colspan="4"><input type="text" name="txtCliente" value="" /></td> </tr> <tr style="background-color: chocolate"> <td>Nombre</td> <td>Precio</td> <td>Cantidad</td> <td>Descuento</td> <td>Sub. Total</td> </tr> <%-- Los productos que tenemos en la sesion que se llama carrito --%> <% ArrayList<DetalleVenta> lista = (ArrayList<DetalleVenta>)session.getAttribute("carrito"); if(lista!=null){ for (DetalleVenta d : lista) { %> <tr> <td><%= d.getProducto()%></td> <td><%= d.getProducto().getPrecio() %></td> <td><%= d.getCantidad()%></td> <td><%= d.getDescuento()%></td> <td><%= (d.getProducto().getPrecio() * d.getCantidad())-d.getDescuento()%></td> </tr> <% } } %> <tr > <td colspan="5"><input type="submit" value="Registrar Venta" name="btnVenta" /></td> </tr> </table> </form> </div> </body> </html>

Java - Aplicacin Web, Carrito de Compras Parte V - Creacin del Reporte

1. Entorno
MySQL 5.1. NetBeans IDE 6.9.1 Apache Tomcat JDK 1.6.0 - 21 iReport-4.0.0

2. Introduccin
Para realizar reportes en Java hay un programa que se llama iReport. Este programa se puede integrar muy facil a Netbeans o tenerlo instalado de forma separada. Yo recomiendo que lo instalen de forma separada, debido a que le da mas funcionalidades propias del programa. El iReport lo pueden bajar de aqui y pueden buscar en internet un poco de informacin mas detallada sobre esta herramienta.

3. Desarrollo
3.1. Diseando el reporte Lo primero que debe de hacer es disear el reporte en iReport, para eso les prepare el siguiente vdeo

Object 1

Para llenar el reporte, hemos usado el cdigo del procedimiento almacenado que se llama spF_Venta_All. Que creamos en la primera parte del tutorial. 3.2. Agregando el reporte al Netbans Luego que diseamos el reporte debemos de crear un carpeta dentro de nuestro proyecto en Netbeans que se llame "reportes". Para eso haces clic derecho en donde dice "Web Page" y nos vamos a la opcin que dice New y seleccionamos Folder

De ahi debemos de copiar y pegar el reporte que hemos diseado a esta carpeta

Y al final nuestra carpeta debera contener los siguientes archivos: reporteDeVentas.jasper y reporteDeVentas.jrxl

3.3. Agregando libreras Tienen que agregar a su proyecto de Netbeans los siguientes jar commons-beanutils-1.8.2 commons-collections-3.2.1 commons-digester-1.7 commons-logging-1.1 groovy-all-1.7.5 iText-2.1.7 iTextAsian jasperreports-4.0.0 jasperreports-fonts-4.0.0 jasperreports-javaflow-4.0.0 jcommon-1.0.15 jfreechart-1.0.12 png-encoder-1.5

Estas libreras se encuentras en las carpetas dist o lib en donde se instalo el iReport iReport-4.0.0. para eso hacen clic derecho en su proyecto y se van a propiedades

De ahi se van a la opcin "Libraries", presionan el botn "Add Jar" y agregan todos los jar anteriormente mencionados

3.4. Creando el Servlet: Reporte En nuestro paquete controlador debemos de crear un nuevo servlet que se llamara "Reporte". Este servlet sera el encargado de mostrar el reporte creado en formato PDF.

Y este servlet tendra el siguiente codigo fuente:

package Controlador; import import import import import import Modelo.Conexion; java.io.FileInputStream; java.io.IOException; java.io.OutputStream; java.sql.SQLException; java.util.HashMap;

import import import import import import import import

java.util.Map; javax.servlet.ServletException; javax.servlet.http.HttpServlet; javax.servlet.http.HttpServletRequest; javax.servlet.http.HttpServletResponse; net.sf.jasperreports.engine.JasperManager; net.sf.jasperreports.engine.JasperPrint; net.sf.jasperreports.engine.JasperReport;

//@autor Henry Joe Wong Urquiza public class Reporte extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { createReport(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { createReport(request, response); } protected void createReport(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //Mostrar el reporte en formato PDF response.setContentType("application/pdf"); java.sql.Connection cn; try { cn = Conexion.getConexion(); //El que obtiene el diseo del reporte JasperReport jasperReport = null; Map parameterMap = new HashMap(); //La direccion del reporte String reporteJasper = request.getSession().getServletContext().getRealPath("reporte/reporteDeVentas.jasp er"); //Cargamos el reporte jasperReport = JasperManager.loadReport(new FileInputStream(reporteJasper)); //Llenamos con informacion al reporte JasperPrint jasperPrint = JasperManager.fillReport(jasperReport, parameterMap, cn); OutputStream oS = null; oS = response.getOutputStream(); //Y lo convertimos a PDF el reporte JasperManager.printReportToPdfStream(jasperPrint, oS); cn.close(); } catch (SQLException ex) { ex.printStackTrace(); } catch (Exception ex) { ex.printStackTrace(); } } }

3.5. Modificando la Vista Luego para ponder invocar al reporte que hemos creado, ir cada JSP que tenemos y buscar la linea que dice
<a href="#">Reporte Producto</a>

Y reemplazarla por
<a href="Reporte">Reporte Producto</a>