GUIA DE APRENDIZAJE 01 - Proyecto Java Web
GUIA DE APRENDIZAJE 01 - Proyecto Java Web
A continuación, se describen una serie de pasos para crear un sistema de información web cuyo backend se
desarrolla en el lenguaje Java.
Video 1. Software necesario, instalación de Glasfish y creación del nuevo proyecto java web
Luego debemos descargar Glassfish y configurar el servidor para trabajar con NetBeans
Video 2. Creación de la base de datos, Diseño de la pantalla de login, estructura patron MVC, vincular librería
MySQL Conector
<title>Hello, world!</title>
</head>
<body>
<div class="container center-block" >
<div class="row justify-content-center">
<div class="card" style="width: 18rem;">
<img src="logo.png" class="card-img-top" alt="...">
<div class="card-body">
<form method="POST" action="Validar">
<div class="form-group">
<label>No de Documento</label>
<input type="text" class="form-control" name="txtusuario">
<small id="emailHelp" class="form-text text-muted">Ingrese su documento sin
espacios ni puntos</small>
</div>
<div class="form-group">
<label for="exampleInputPassword1">Contraseña</label>
<input type="password" class="form-
control" id="exampleInputPassword1" name="txtpassword">
</div>
<div class="form-group form-check">
<input type="checkbox" class="form-check-input" id="exampleCheck1">
<label class="form-check-label" for="exampleCheck1">Permanecer
loggeado</label>
</div>
<button type="submit" class="btn btn-
primary" name="accion" value="Ingresar">Ingresar</button>
</form>
</div>
</div>
</div>
</div>
Connection con;
String url="jdbc:mysql://localhost:3306/mibdventas";
String usuario = "root";
String clave = "";
try {
Class.forName("com.mysql.cj.jdbc.Driver");
con = DriverManager.getConnection(url,usuario,clave);
} catch (ClassNotFoundException ex) {
Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ex);
} catch (SQLException ex) {
Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ex);
}
return con;
}
}
int id;
int documento;
String nombre, correo, estado, password, rol;
public Usuario() {
}
public Usuario(int id, int documento, String nombre, String correo, String estado, String
password, String rol) {
this.id = id;
this.documento = documento;
this.nombre = nombre;
this.correo = correo;
this.estado = estado;
this.password = password;
this.rol = rol;
}
Archivo UsuarioDAO
Connection con;
PreparedStatement ps;
ResultSet rs;
Conexion cn = new Conexion();
}
}
2. En el servlet Validar se captura los datos del formulario, esto lo hacemos en el método post
En el comienzo de la clase agregar los objetos usuario y usuarioDAO
}else{
request.getRequestDispatcher("index.jsp").forward(request, response);
}
if(menu.equals("Principal")){
request.getRequestDispatcher("Principal.jsp").forward(request, response);
}
1. Agregar un navbar de Bootstrap incluir las opciones, home, producto, empleado, clientes, venta y un
dropdown para el nombre de usuario.
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
request.setAttribute("usuario", usuario);
${usuario.getNom()}
${usuario.getUser()}
${usuario.getCorreo()}
4. Se modifica la opción salir del dropdown por un botón en un form con action =”Validar” y
method=”POST” y se agrega un botón con name=”accion” y value = “salir”
5. Se crea un iframe o contenedro después de la etiqueta de cierre nav
6. Se modifica el href de los enlaces del nav para que redireccione a controlador
<a class="nav-link" href="Controlador?menu=Ventas" target="miContenedor">Ventas </a>
7. Se modifica el controlador para que redireccione a las paginas según la opción seleccionada agragando
los casos respectivos
if(menu.equals("Principal")){
request.getRequestDispatcher("Principal.jsp").forward(request, response);
}
if(menu.equals("Productos")){
request.getRequestDispatcher("Productos.jsp").forward(request, response);
}
if(menu.equals("Empleados")){
request.getRequestDispatcher("Empleados.jsp").forward(request, response);
}
if(menu.equals("Clientes")){
request.getRequestDispatcher("Clientes.jsp").forward(request, response);
}
if(menu.equals("Ventas")){
request.getRequestDispatcher("Ventas.jsp").forward(request, response);
}
<title>Hello, world!</title>
</head>
<body>
<div class="row">
<div class="card col-md-4">
<div class="card-body">
<h5 class="card-title">Empleados</h5>
<h6 class="card-subtitle mb-2 text-muted">En este panel podras gestionar los
datos de los usuarios empleados del sistema</h6>
<div>
<form action="Controlador?menu=Empleados" method="POST">
<div class="form-group">
<label>Documento</label>
<input type="number" class="form-control" name="txtdocumento">
<small class="form-text text-muted">Ingrese El No de documento sin
espacios ni caracteres especiales</small>
</div>
<div class="form-group">
<label>Nombre</label>
<input type="text" class="form-control" name="txtnombre"">
</div>
<div class="form-group">
<label>Correo</label>
<input type="text" class="form-control" name="txtcorreo">
</div>
<div class="form-group">
<label>Password</label>
<input type="text" class="form-control" name="txtpassword">
</div>
<div class="form-group">
<label>Rol</label>
<select class="form-control form-control-sm" name="txtrol">
<option>Empleado</option>
<option>Cliente</option>
</select>
</div>
<div class="form-group">
<label>Estado</label>
<select class="form-control form-control-sm" name="txtestado">
<option>Activo</option>
<option>Inactivo</option>
</select>
</div>
<div class="col-md-8">
<table class="table">
<thead class="thead-dark">
<tr>
<th scope="col">id</th>
<th scope="col">Documento</th>
<th scope="col">Nombres</th>
<th scope="col">Correo</th>
<th scope="col">Contraseña</th>
<th scope="col">Rol</th>
<th scope="col">Estado</th>
<th scope="col">Acciones</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
3. Agregamos un switch case en la opción empleado para determinar las acciones de cada botón
if (menu.equals("Empleados")) {
switch (accion) {
case "listar":
break;
case "agregar":
break;
case "actualizar":
break;
case "eliminar":
break;
}
request.getRequestDispatcher("Empleados.jsp").forward(request, response);
}
4. En la clase usuarioDAO agregamos los métodos respectivos para el CRUD en este caso el método Listar
public List Listar() {
String consulta = "SELECT * FROM usuarios";
List<Usuario> lista = new ArrayList();
try {
con = cn.Conexion();
ps = con.prepareStatement(consulta);
rs = ps.executeQuery();
while (rs.next()) {
Usuario usuario = new Usuario();
usuario.setId(rs.getInt("id"));
usuario.setDocumento(rs.getInt("documento"));
usuario.setNombre(rs.getString("nombre"));
usuario.setCorreo(rs.getString("correo"));
usuario.setPassword(rs.getString("password"));
usuario.setEstado(rs.getString("estado"));
usuario.setRol(rs.getString("rol"));
lista.add(usuario);
}
} catch (SQLException ex) {
Logger.getLogger(UsuarioDAO.class.getName()).log(Level.SEVERE, null, ex);
}
return lista;
6. En la opción listar se crea una lista y se ejecuta la función listar de usuarioDAO y se envían los datos a la vista
case "listar":
List lista = usuarioDAO.Listar();
request.setAttribute("usuarios", lista);
break;
<tbody>
<c:forEach var="usuario" items="${usuarios}">
<tr>
<th scope="row">${usuario.getId()}</th>
<td>${usuario.getDocumento()}</td>
<td>${usuario.getNombre()}</td>
<td>${usuario.getCorreo()}</td>
<td>${usuario.getPassword()}</td>
<td>${usuario.getRol()}</td>
<td>${usuario.getEstado()}</td>
<td><a>Editar</a><a>Eliminar</a></td>
</tr>
</c:forEach>
</tbody>
2. En el controlador en el case Agrega capturamos los datos de cada uno de los elementos del formulario y los
enviamos a la función Agregar de la clase usuarioDAO, antes nos aseguramos que en el formulario tenga los
siguientes atributos
case "Agregar":
int documento = Integer.parseInt(request.getParameter("txtdocumento"));
String nombre = request.getParameter("txtnombre");
String correo = request.getParameter("txtcorreo");
String password = request.getParameter("txtpassword");
String rol = request.getParameter("txtrol");
String estado = request.getParameter("txtestado");
usuario.setDocumento(documento);
usuario.setNombre(nombre);
usuario.setPassword(password);
usuario.setCorreo(correo);
usuario.setRol(rol);
usuario.setEstado(estado);
usuarioDAO.Agregar(usuario);
request.getRequestDispatcher("Controlador?
menu=Empleados&accion=Listar").forward(request, response);
break;
return usuario;
4. Para editar un registro editamos los botones de editar y eliminar, referenciando el controlador, la acción y el
id según el registro seleccionado y el botón presionado
<td>
<a class="btn btn-warning" href="Controlador?menu=Empleados&accion=Cargar&id=$
{usuario.getId()}">Editar</a>
<a class="btn btn-danger" href="Controlador?menu=Empleados&accion=Eliminar&id=$
{usuario.getId()}">Eliminar</a>
</td>
case "Cargar":
idUsuario = Integer.parseInt(request.getParameter("id"));
Usuario usuario = usuarioDAO.ListarPorId(idUsuario);
request.setAttribute("usuarioSeleccionado", usuario);
request.getRequestDispatcher("Controlador?menu=Empleados&accion=Listar").forward(request, response);
break;
6. Agregamos la opción value a cada uno de los inputs del formulario de registro
8. En el caso actualizar se captura el id y se crea un nuevo objeto usuario con los datos modificados, y se carga
la función actualizar de la clase UsuarioDAO y se vuelve a listar la tabla
case "Actualizar":
Usuario usuario1 = new Usuario();
int documentoUpdate = Integer.parseInt(request.getParameter("txtdocumento"));
String nombreUpdate = request.getParameter("txtnombre");
String correoUpdate = request.getParameter("txtcorreo");
String passwordUpdate = request.getParameter("txtpassword");
String rolUpdate = request.getParameter("txtrol");
String estadoUpdate = request.getParameter("txtestado");
usuario1.setDocumento(documentoUpdate);
usuario1.setNombre(nombreUpdate);
usuario1.setPassword(passwordUpdate);
usuario1.setCorreo(correoUpdate);
usuario1.setRol(rolUpdate);
usuario1.setEstado(estadoUpdate);
usuario1.setId(idUsuario);
usuarioDAO.Actualizar(usuario1);
request.getRequestDispatcher("Controlador?menu=Empleados&accion=Listar").forward(request, response);
break;
case "Eliminar":
idUsuario = Integer.parseInt(request.getParameter("id"));
usuarioDAO.Eliminar(idUsuario);
request.getRequestDispatcher("Controlador?menu=Empleados&accion=Listar").forward(request, response);
break;
1. Se realiza la interfaz de usuario en el archivo ventas.jsp, un formulario para consulta de cliente y producto y
una tabla para ver productos agregados
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>Sistema de ventas</title>
<style>
@media print{
.seccion1, .btn, .columna{
display:none;
}
}
</style>
</head>
<body>
<div class="row">
<div class="col-md-5 seccion1">
<div class="card">
<h5 class="card-header">Datos cliente</h5>
<div class="card-body">
<form method="post" action="Controlador?menu=Ventas">
<div class="row">
<div class="col-md-4 d-flex">
<input type="number" name="documentocliente" class="form-control"
placeholder="documento cliente">
<input type="submit" name="accion" value="BuscarCliente"
class="btn btn-outline-dark">
</div>
<div class="col-md-8 d-flex">
<input type="text" name="nombrecliente" class="form-control"
placeholder="Nombre cliente">
</div>
</div>
<div class="row"></div>
</form>
</div>
</div>
<div class="card">
<h5 class="card-header">Datos producto</h5>
<div class="card-body">
<form action="Controlador?menu=Ventas" method="post">
<div class="row">
<div class="col-md-4 d-flex form-group">
<input type="number" name="codigoproducto" class="form-control"
placeholder="Codigo Producto">
<input type="submit" name="accion" value="BuscarProducto"
class="btn btn-outline-dark">
</div>
<div class="col-md-8 d-flex form-group">
<input type="text" name="nombreproducto" class="form-control"
placeholder="Nombre Producto">
</div>
<div class="col-md-4 d-flex form-group">
<input type="text" name="precioproducto" class="form-control"
placeholder="$ 0000.00">
</div>
<div class="col-md-8 d-flex form-group">
<input type="number" value="1" name="cantidadproducto"
class="form-control" placeholder="Cantidad">
</div>
</div>
<input type="submit" name="accion" value="AgregarProducto" class="btn
btn-outline-primary col text-center">
<div class="row"></div>
</form>
</div>
</div>
</div>
<div class="col-md-7">
<div class="card">
<div class="card-header">
<div class="form-group row">
<label class="col-sm-2 col-form-label">Numero de factura</label>
<input class="form-control col-md-4" type="text" name="txtnumerofactura">
</div>
</div>
<div class="card-body">
<table class="table">
<thead class="thead-dark">
<tr>
<th scope="col">#</th>
<th scope="col">Codigo</th>
<th scope="col">Producto</th>
<th scope="col">Precio</th>
<th scope="col">Cantidad</th>
<th scope="col">Total</th>
<th scope="col" class="columna">Acciones</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
<div class="card-footer d-flex">
<div class="col-md-8 text-center">
<a class="btn btn-success" onclick="print()" href="Controlador?
menu=Ventas&accion=GenerarVenta">Generar Venta</a>
<a class="btn btn-danger" href="Controlador?
menu=Ventas&accion=NuevaVenta">Nueva Venta</a>
</div>
<div class="col-md-4">
<input type=text" name="txttotalapagar" class="form-control"
placeholder="$ 00.000.00" disabled="disabled">
</div>
</div>
</div>
</div>
</div>
case "BuscarCliente":
int documentoCliente =
Integer.parseInt(request.getParameter("documentocliente"));
usuario = usuarioDAO.BuscarCliente(documentoCliente);
request.setAttribute("cliente", usuario);
break;
try {
ps = con.prepareStatement(consulta);
rs = ps.executeQuery();
while(rs.next()){
producto.setCodigo(rs.getInt("id"));
producto.setNombreProducto(rs.getString("nombreproducto"));
producto.setDescripcion(rs.getString("descripcionproducto"));
producto.setUnidad(rs.getString("unidad"));
producto.setPrecio(rs.getString("precio"));
}
} catch (SQLException ex) {
Logger.getLogger(ProductoDAO.class.getName()).log(Level.SEVERE, null, ex);
}
return producto;
}
6. Para cargar el producto se debe en controlador en el case buscarproducto capturar el código del producto y
realizar la función consultarporcodigo con el respectivo método en productoDAO, y posteriormente se
envían los parámetros a la vista
case "BuscarProducto":
System.err.print("Ingreso");
int codigoProducto = Integer.parseInt(request.getParameter("codigoproducto"));
producto = productoDAO.ConsultaPorCodigo(codigoProducto);
System.out.print("" + producto.getNombreProducto());
request.setAttribute("productoseleccionado", producto);
break;
7. Se actualizan los value del formulario de manera que se vea el nombre del producto, el código y el valor
8. Se crea la clase ventas con todas las variables de la venta, se crea un constructor vacio y un constructor con
todos los elementos, se crean los métodos get y set
9. En controlador en el case AgregarProducto se capturan todos los datos del formulario y se agregan a un
objeto de tipo ventas y se agregan a un objeto List<Ventas> Nota: declarar las variables al inicio de la clase,
se calcula el subtotal y se envían los parametros
case "AgregarProducto":
totalapagar = 0;
venta = new Venta();
item++;
codProducto = Integer.parseInt(request.getParameter("codigoproducto"));
descripcion = request.getParameter("nombreproducto");
precio = Integer.parseInt(request.getParameter("precioproducto"));
cantidad = Integer.parseInt(request.getParameter("cantidadproducto"));
subtotal = precio * cantidad;
venta.setItem(item);
venta.setDescripcionProducto(descripcion);
venta.setCantidad(cantidad);
venta.setPrecio(precio);
venta.setSubtotal(subtotal);
venta.setIdProducto(codProducto);
listaVentas.add(venta);
request.setAttribute("listaventas", listaVentas);
for (int i = 0; i < listaVentas.size(); i++) {
totalapagar += listaVentas.get(i).getSubtotal();
}
NumberFormat formatoNumero1 = NumberFormat.getNumberInstance();
String total1 = formatoNumero1.format(totalapagar);
request.setAttribute("totalapagar", total1);
break;
Para generar el número de factura se crea el modelo VentaDAO y allí se crea el método o la función
ObtenerNumeroDeFactura
try {
ps = con.prepareStatement(consulta);
rs = ps.executeQuery();
while (rs.next()) {
numerodefactura = rs.getString(1);
System.err.println("numfac"+numerodefactura);
}
} catch (SQLException ex) {
Logger.getLogger(VentaDAO.class.getName()).log(Level.SEVERE, null, ex);
}
return numerodefactura;
default:
request.setAttribute("numerofactura", numfac);
Para generar la venta en ventaDAO se crea un método para obtener el máximo idVentas y el método para guardar
venta y el método guardar detalle ventas.
return idVenta;
}
public void RegistrarVenta(Venta venta){
String sentencia = "INSERT INTO ventas
(idclienteventa,idempleadoventa,numerofactura,fechaventa,totalventa,estado)
VALUES(?,?,?,?,?,?)";
con = cn.Conexion();
try {
ps = con.prepareStatement(sentencia);
ps.setInt(1,venta.getIdCliente());
ps.setInt(2, venta.getIdEmpleado());
ps.setString(3, venta.getNumeroComprobante());
ps.setString(4, venta.getFecha());
ps.setDouble(5, venta.getMonto());
ps.setString(6, venta.getEstado());
ps.executeUpdate();
ps.executeUpdate();
case "GenerarVenta":
venta.setIdCliente(usuario.getId());
venta.setIdEmpleado(1);
venta.setNumeroComprobante("" + numfac);
venta.setFecha("2020-10-21");
venta.setMonto(totalapagar);
venta.setEstado("1");
ventaDAO.RegistrarVenta(venta);
int idv = ventaDAO.ObtenerMaximoIdVentas();
for (int i = 0; i < listaVentas.size(); i++) {
venta = new Venta();
venta.setIdVenta(idv);
venta.setIdProducto(listaVentas.get(i).getIdProducto());
venta.setCantidad(listaVentas.get(i).getCantidad());
venta.setPrecio(listaVentas.get(i).getPrecio());
ventaDAO.GuardarDetalleVenta(venta);
}
break;
</div>
<div class="col-md-4">
<input type=text" name="txttotalapagar" class="form-control"
placeholder="$ 00.000.00" disabled="disabled" value="$ ${totalapagar}" >
</div>
</div>
Imprimir factura
<style>
@media print{
.seccion1, .btn, .columna{
display:none;
}
}
</style>
Agregamos las clases a los elementos que no queremos que salgan en la impresión y listo