Documentos de Académico
Documentos de Profesional
Documentos de Cultura
2- El patrón MVC.
El patrón de diseño MVC es usado en interfaces gráficas de usuario para tener separadas las
responsabilidades en capas de objetos diferentes de manera que las aplicaciones sean más fáciles de
desarrollar y mantener [1]. La siguiente figura representa las tres capas del patrón MVC, que se
detallan a continuación.
2. La capa del Modelo incluye todos aquellos objetos que encapsulan los datos que maneja la
aplicación. Esta capa oculta al resto de capas las peculiaridades de la tecnología de
almacenamiento de la información (e.g., base de datos empleada, lenguaje de interrogación
1
Desarrollo de Aplicaciones Web Creación de aplicaciones web siguiendo el...
La figura anterior muestra las interacciones entre los diferentes componentes Java de las tres
capas. Los Servlets del controlador están mapeados a urls con extensión .html (e.g., accion.html)
que aunque parecen páginas estáticas son dinamismos en el servidor que se asocian a acciones del
controlador. El usuario de la aplicación hace uso de un navegador web para ejecutar lógica de
negocio a través de peticiones HTTP a estas acciones, que al ejecutarse suelen acceder, crear o
modificar datos de la base de datos. El acceso a la base de datos, MySQL [6] en esta práctica, no se
hace directamente, si no a través de Factories [7], que son un patrón de diseño que permite ocultar
los detalles del acceso a datos mediante el empaquetamiento de la información en JavaBeans.
Finalmente, los Servlets redirigen a una JSP que interpreta los JavaBeans y genera la interfaz de
usuario en HTML.
2
Desarrollo de Aplicaciones Web Creación de aplicaciones web siguiendo el...
Por lo tanto, las JSPs son las únicas que generarán HTML accediendo únicamente a tipos
básicos, a clases del paquete java.util.* o a JavaBeans definidos en la aplicación o en otras librerías.
Además los Servlets sólo podrán acceder a las Factories y a los JavaBeans. Finalmente, las
Factories serán las únicas que accedan a JDBC [8] para ejecutar sentencias SQL sobre la base de
datos MySQL.
4- Enunciado.
En esta práctica proporcionaremos el contenido dinámico a las páginas web elaboradas en la
primera práctica, añadiendo un conjunto de Servlets, JavaBeans, Factories y páginas JSPs
interconectados para permitir realizar la compra de los productos de la tienda virtual. Como parte de
la arquitectura de la aplicación web, se deberá diseñar y crear una base de datos MySQL y una
estructura de datos básica para almacenar la información relativa al sitio web creado.
Dispondrá de un carrito de la compra donde los usuarios podrán ir añadiendo los productos
que deseen.
Para finalizar el pedido el usuario tendrá que estar previamente registrado en el sistema.
Para ello se habilitarán los formularios necesarios para realizar el registro y el acceso. La
información para el acceso se almacenará en la base de datos.
El usuario dispondrá de una zona personal para administrar los datos introducidos, ver sus
pedidos, etc.
1 La parte de administración de la web se implementará utilizando PHP en la tercera práctica, por lo que queda fuera
de los objetivos de esta segunda práctica.
3
Desarrollo de Aplicaciones Web Creación de aplicaciones web siguiendo el...
La creación de una base de datos es tan sencilla como pulsar en el menú de la izquierda la
opción “Nueva”, dar un nombre a la base de datos y pulsar el botón “Crear”:
4
Desarrollo de Aplicaciones Web Creación de aplicaciones web siguiendo el...
Una vez creada la base de datos aparece automáticamente el menú de creación de tablas, en
el cual tan solo debemos indicar el nombre de la tabla y su número de columnas, pulsar en
“Continuar”, definir los tipos de datos de los campos y por último pulsar en “Guardar”, tal y como
pueden verse en las siguientes figuras:
Por último, phpMyAdmin también permite insertar elementos en las tablas de la base de
datos, ejecutar consultas sobre la base de datos y mostrar el resultado, etc., lo que es muy útil a la
hora de rellenar las tablas, comprobar que las consultas que se embeben en el código son correctas y
realizan la acción deseada, etc.
5
Desarrollo de Aplicaciones Web Creación de aplicaciones web siguiendo el...
Mientras que las consultas sobre la base de datos se realizan seleccionando la pestaña
“SQL”, rellenando la consulta en el área de texto y pulsando “Continuar”, como se puede ver en la
siguiente figura:
Necesitaremos una tabla para almacenar los productos, de los cuales necesitaremos conocer
su descripción, su precio y sus existencias en el almacén, además de la URL de su imagen asociada
(si se utiliza). Por último, deberíamos añadir un identificador único para poder hacer referencia al
producto2.
Necesitaremos otra tabla para almacenar los usuarios y sus datos, necesitando un
identificador único para el usuario, así como el resto de datos necesarios (usuario, clave, nombre,
apellidos, etc.). Además, deberá existir un campo que indique el estado del usuario (activo o no
activo/baja) y otro campo que indique si el usuario es administrador o no3.
2 Podría ser necesario otro atributo que indique si ese producto aún se vende o no, pero basta con que las existencias
sean 0 para que el producto, si el programa se desarrolla correctamente, no pueda venderse.
3 Este último campo se utilizará en la práctica 3, pero debemos introducirlo ahora pues la base de datos es común
para ambas prácticas.
6
Desarrollo de Aplicaciones Web Creación de aplicaciones web siguiendo el...
Por último, necesitamos dos tablas para almacenar los pedidos realizados. Una primera tabla
almacenara la identificación del pedido y la persona que hace el pedido, así como datos adicionales
como la fecha del pedido, el importe total del mismo o el estado del pedido (entregado, cancelado,
etc.), y una segunda tabla será el detalle que contendrá todos los productos distintos que forman ese
pedido, pues es necesario tener en cuenta que un pedido puede contener productos distintos, y que
por cada producto deberá contener el identificador del pedido y del producto, la cantidad pedida y el
precio unitario, pues debemos tener en cuenta que el precio de un producto puede cambiar pero no
en los pedidos ya realizados.
Por tanto, y obviando esta última tabla, el diagrama de una posible base de datos que nos
permita manejar nuestra tienda online sería el siguiente:
Figura 5.2.1: Esquema de una posible base de datos para la tienda online.
Unas sentencias SQL que crearían las tablas de la base de datos anterior, con unos tipos de
datos que podrían ser validos en muchos de los casos, son:
7
Desarrollo de Aplicaciones Web Creación de aplicaciones web siguiendo el...
provincia VARCHAR(32),
cp CHAR(5),
telefono CHAR(9),
PRIMARY KEY(codigo)
);
4 Si nunca se ha generado un proyecto de esta categoría es posible que indique que no está disponible, debiendo
pulsar el botón de “Siguiente” y esperar un rato para que active este tipo de proyectos.
8
Desarrollo de Aplicaciones Web Creación de aplicaciones web siguiendo el...
Por último, no seleccionaremos ningún framework, por lo que tan solo tenemos que pulsar
en “Terminar” para concluir la creación del nuevo proyecto:
9
Desarrollo de Aplicaciones Web Creación de aplicaciones web siguiendo el...
Una vez creada la aplicación nos aparecerá una página inicial “index.jsp” que es la página
inicial de nuestra aplicación web y que habrá que sustituirla por la desarrollada en la práctica 1.
Podemos ejecutar el servicio web pulsando en el icono de Play, apareciendo una ventana del
navegador con la ejecución de la aplicación web, tal y como podemos ver en la siguiente figura:
5 Puede usarse el explorador de Windows para localizar la ubicación del proyecto de aplicación web creado.
10
Desarrollo de Aplicaciones Web Creación de aplicaciones web siguiendo el...
Si deseamos cambiar la página inicial de nuestra aplicación web debemos pulsar con el
botón derecho sobre el nombre del proyecto y seleccionar propiedades, tal y como podemos ver en
la siguiente figura:
Figura 5.4.2: Opción a seleccionar para modificar la página de inicio del proyecto.
Dentro del apartado Run, en “Relative URL” debemos escribir el nombre de la página inicial
que deseamos se cargue al ejecutar la aplicación, por ejemplo index.html, tal y como podemos ver a
continuación:
11
Desarrollo de Aplicaciones Web Creación de aplicaciones web siguiendo el...
Figura 5.5.1: Copia del conector MySQL para Java en el directorio WEB-INF/lib.
Una vez copiado el conector en la carpeta adecuada, debemos agregar el jar como referencia
al proyecto pulsando con el botón derecho en el proyecto y seleccionando la opción Propiedades, tal
6 En la actualidad la versión del conector es la 8.0.23. Adicionalmente, tener en cuenta que se descarga un
fichero .zip el cual debe extraerse el .jar que es el conector propiamente dicho. Para Windows escoger en la opción
del sistema operativo “Platform Independent”.
12
Desarrollo de Aplicaciones Web Creación de aplicaciones web siguiendo el...
y como vimos en la figura 5.4.2. En la ventana que aparece seleccionamos Libraries → Add
JAR/Folder como vemos a continuación:
Aunque puede realizarse de múltiples formas, se recomienda utilizar una estructura de datos
basada en un objeto que sea un contenedor de objetos, de forma que cada elemento del objeto
contenedor sea uno de los productos del carrito. De esta forma, la estructura de los objetos sería:
13
Desarrollo de Aplicaciones Web Creación de aplicaciones web siguiendo el...
var carrito = new Object(); // Objeto contenedor, se debe crear solo uno.
carrito[identificador] = producto;
Se debe informar al cliente de forma visual que el producto se ha añadido al carrito, bien
mediante una ventana emergente o bien mediante el cambio de algún elemento visual de la página.
5.6.2.- Página del Carrito.
Nuestra página tendrá un apartado donde veremos el listado completo de productos que
hemos añadido al carrito y podremos cambiar la cantidad que deseemos de cada producto, así como
quitar productos de la cesta. Esta funcionalidad también se realizará utilizando Javascript.
5.6.3.- Almacenamiento del Carrito.
El carrito de la compra también será almacenado con uno de los mecanismos de
almacenamiento en el lado del cliente que incorpora HTML5. En concreto, se hará uso de
localStorage, de forma que, si el usuario cierra el navegador web con productos almacenados en el
carrito, la próxima vez que se conecte a nuestra página, la información contenida en el carrito se
restaurará cargando el contenido del localStorage.
14
Desarrollo de Aplicaciones Web Creación de aplicaciones web siguiendo el...
15
Desarrollo de Aplicaciones Web Creación de aplicaciones web siguiendo el...
A partir de este momento tendremos un paquete de nombre p2, dentro del cual crearemos
todas nuestras clases Java, los servlets y los javabeans necesarios para nuestra aplicación web.
6.2- Creación de la factoría para acceso a la base de datos.
Vamos a crear una clase factoría que contenga todas las operaciones que tengan que ver con
la base de datos, por ejemplo, el proceso de conexión a la base de datos, las consultas a la base de
datos, etc. Esta clase pertenecerá al paquete p2, por lo que pulsaremos con el botón derecho en el
paquete p2 y seleccionaremos Nuevo → Java Class, dándole el nombre AccesoBD y seleccionando
el paquete p2, tal y como podemos ver a continuación:
package p2;
La cual debemos rellenar con los datos necesarios, inicialmente se va a definir una variable
singleton o instancia única, de forma que se garantice que tan solo se tiene una instancia de esta
clase a lo largo de nuestra aplicación [7]7:
package p2;
import java.sql.*;
7 A partir de este punto todo aquello que se añada al código anterior se resaltará en negrita.
16
Desarrollo de Aplicaciones Web Creación de aplicaciones web siguiendo el...
}
return instanciaUnica;
}
}
A continuación, se rellenará la clase con los datos necesarios, en nuestro caso los datos de
conexión a la base de datos:
package p2;
import java.sql.*;
private AccesoBD() {
abrirConexionBD();
}
Si deseamos comprobar que la conexión se realiza correctamente podemos añadir una nueva
función que, nos devuelva un booleano para indicar si ha sucedido la conexión o no8:
package p2;
import java.sql.*;
8 En nuestro caso hemos creado la función comprobarAcceso() que devuelve true si la conexión se realiza o false en
caso contrario. Esta función de prueba puede eliminarse con posterioridad si así se desea.
17
Desarrollo de Aplicaciones Web Creación de aplicaciones web siguiendo el...
private AccesoBD() {
abrirConexionBD();
}
Únicamente para probar el funcionamiento de la clase anterior, crearemos un JSP para que
llame a la función comprobarAcceso(). El código de un sencillo JSP, llamado “comprobar.jsp”, que
ejecuta la llamada es el siguiente:
18
Desarrollo de Aplicaciones Web Creación de aplicaciones web siguiendo el...
Donde podemos ver que los delimitadores <% %> nos permiten integrar código Java dentro
del código HTML de la página. Además, los delimitadores <%= %> nos permiten integrar el
contenido de una variable Java dentro del código HTML de la página.
Si cambiamos ahora la página que se ejecuta al lanzar el proyecto, tal y como hemos visto
en el punto 5.4.2, por nuestra página “comprobar.jsp”, y ejecutamos la aplicación obtenemos la
siguiente página web:
Por último, se definirá también la función cerrarConexiónBD(), de forma que se cierren las
conexiones de forma adecuada.
...
public void cerrarConexionBD()
{
if (conexionBD != null)
{
try{
conexionBD.close();
conexionBD = null;
}
catch(Exception e){ //Error en la conexión con la BD
System.err.println("No se ha completado la desconexión a la base de datos");
System.err.println(e.getMessage());
}
}
}
…
19
Desarrollo de Aplicaciones Web Creación de aplicaciones web siguiendo el...
Un javabean debe contener un constructor sin argumentos, unos atributos privados y una
serie de funciones get() y set() para leer y asignar valores a esos atributos.
Por tanto, inicialmente crearemos los atributos necesarios, quedando el código del javabean
como puede verse a continuación9:
package p2;
Ahora deberíamos escribir el código de las funciones get() y set() para todos los atributos.
Sin embargo, podemos generarlos de forma automática seleccionando la opción Fuente → Insertar
código, apareciendo un cuadro de diálogo que permite incluir funciones get() y set() para los
elementos deseados, tal y como podemos ver a continuación:
9 A partir de este punto desarrollaremos todo el código suponiendo que se ha creado una base de datos donde los
campos tienen los atributos indicados en el apartado 5.2. Si se modifican esos tipos obviamente debe modificarse el
código aquí mostrado para adecuarlo al tipo de dato que se haya usado. Por ejemplo, si el campo “codigo” de los
productos se ha definido como CHAR en lugar de INTEGER, el tipo de dato de id debe ser String en lugar de int.
20
Desarrollo de Aplicaciones Web Creación de aplicaciones web siguiendo el...
package p2;
21
Desarrollo de Aplicaciones Web Creación de aplicaciones web siguiendo el...
this.stock = stock;
}
public String getImagen() {
return imagen;
}
public void setImagen(String imagen) {
this.imagen = imagen;
}
}
...
import java.util.*;
...
public List<ProductoBD> obtenerProductosBD() {
abrirConexionBD();
try {
String con;
Statement s = conexionBD.createStatement();
// hay que tener en cuenta las columnas de vuestra tabla de productos
// también se puede utilizar una consulta del tipo:
// con = "SELECT * FROM productos";
con = "SELECT codigo,descripcion,precio,existencias,imagen FROM productos";
ResultSet resultado = s.executeQuery(con);
while(resultado.next()){
producto = new ProductoBD();
producto.setId(resultados.getInt("codigo"));
producto.setDescripcion(resultados.getString("descripcion"));
producto.setPrecio(resultados.getFloat("precio"));
producto.setStock(resultados.getInt("existencias"));
producto.setImagen(resultados.getString("imagen"));
productos.add(producto);
}
}
catch(Exception e) {
System.err.println("Error ejecutando la consulta a la base de datos");
System.err.println(e.getMessage());
}
return productos;
}
22
Desarrollo de Aplicaciones Web Creación de aplicaciones web siguiendo el...
...
Para que nuestro programa llame a la función y reciba la respuesta deberemos modificar el
fichero HTML que hicimos en la práctica 1 y convertirlo en un JSP que llame a esta función y
recoja el resultado de la consulta mostrándolo en el navegador. Un posible código del JSP
“productos.jsp” sería:
package p2;
<%@page import="java.util.List"%>
<%@page contentType="text/html" import="p2.*" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="es">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title> </title>
</head>
<body>
<%
AccesoBD con = AccesoBD.getInstance();
List<ProductoBD> productos = con.obtenerProductosBD();
%>
<div>
<table>
<tr>
<th>Código</th>
<th> </th>
<th>Descripción</th>
<th>Precio</th>
<th> </th>
</tr>
<%
for(ProductoBD producto : productos){
int codigo = producto.getId();
String descripcion = producto.getDescripcion();
float precio = producto.getPrecio();
int existencias = producto.getStock();
String imagen = producto.getImagen();
%>
<tr>
<td><%=codigo%></td>
<td><img src="<%=imagen%>" alt="<%=descripcion%>">
<td><%=descripcion%></td>
<td><%=precio%></td>
<td>
<%
if (existencias > 0) {
%>
<input type="button" value="Añadir al carrito" onclick="__F__">
<%
}
else {
%>
23
Desarrollo de Aplicaciones Web Creación de aplicaciones web siguiendo el...
<%
}
%>
</td>
</tr>
<%
}
%>
</table>
</div>
</body>
</html>
Donde podemos ver como la página web se crea de forma dinámica con todos los productos
existentes en la base de datos mediante el bucle. En la página web mostrada falta el código del
evento onclick, (texto __F__) que debe añadirse para ir de esta página a la página
correspondiente.
Ahora es necesario modificar el código de todas las páginas que llamen a productos.html por
nuestra nueva página productos.jsp. Por ejemplo, hemos de modificar la página de inicio para que
llame a nuestro JSP en lugar del HTML estático:
…
<a href="#" onclick="Cargar('productos.jsp','cuerpo')">Productos</a>
…
Como ejemplo, vamos a implementar una versión simplificada de este mecanismo de acceso, que
será un documento jsp que detectará si el usuario se encuentra identificado. En caso afirmativo, permitirá
realizar, formalizar la compra o acceder al apartado de usuario de la página web. En caso negativo, se
mostrará un formulario para registrarse/identificarse.
Para comprobar si un usuario se encuentra registrado o no, se puede emplear una variable en el
entorno de sesión de la aplicación web. Por ejemplo, vamos a crear dentro de ese entorno, una variable
“usuario” que contendrá el nombre del usuario actualmente identificado, en el caso de que esa variable no
exista o no tenga contenido, supondremos que no hay ningún usuario identificado.
Si no hay ningún usuario identificado, se mostrará un formulario, el contenido del cual irá dirigido a
un servlet, que se encargará de procesar la información y de validarla haciendo uso de la base de datos.
Además, creará o rellenará la variable “usuario” del entorno de la sesión, redirigiendo la petición
nuevamente hacia la página jsp, donde esta vez, si el usuario se ha registrado correctamente, permitirá
realizar la acción adecuada (formalizar la compra o acceder al apartado del usuario), en caso contrario se
mostrará un mensaje señalando el error de autentificación y se procederá a mostrar nuevamente el formulario
de ingreso. A continuación, se muestra de forma esquemática este proceso:
24
Desarrollo de Aplicaciones Web Creación de aplicaciones web siguiendo el...
Si Mostrar Opciones
Usuario registrado Usuario (jsp)
No
Mostrar Formulario
(jsp)
ProcesarFormulario (servlet)
Figura 6.5.1: Esquema de la autenticación de un usuario.
Primeramente crearemos un nuevo jsp dentro del directorio Web Pages, para ello,
colocándonos sobre ese directorio, elegiremos con el botón derecho del ratón la opción: “New →
JSP”. Le pondremos un nombre, por ejemplo, “login”, y pulsaremos finish. El código de “login.jsp”
es el siguiente:
25
Desarrollo de Aplicaciones Web Creación de aplicaciones web siguiendo el...
Inicialmente hemos especificado que estamos empleando el lenguaje Java y que vamos a
hacer uso del paquete p2 (creado en el apartado 2.1), dentro del cual definiremos los javabeans y
servlets de nuestra aplicación web. Adicionalmente también añadimos la librería de capas utilizada
en la práctica 1.
...
<body>
<%
//Utilizamos una variable en la sesión para informar de los mensajes de Error
String mensaje = (String)session.getAttribute("mensaje");
if (mensaje != null) { //Eliminamos el mensaje consumido
session.removeAttribute("mensaje");
%>
<h1> <%=mensaje%> </h1>
<%
}
//Se obtiene el usuario actual registrado en el servicio web, del entorno de sesión
String usuarioActual = (String)session.getAttribute("usuario");
26
Desarrollo de Aplicaciones Web Creación de aplicaciones web siguiendo el...
</body>
</html>
NOTAS:
1. Se debe sustituir el código del formulario por aquel que hayáis desarrollado en la práctica 1.
2. El formulario hace uso de la función “ProcesarForm”, que al igual que la función “Cargar”
se encuentra en el fichero javascript “libCapas2021.js”.
3. La función ProcesarForm() enviará el formulario a un destino, en este caso, a la url del
servlet “LoginTienda”, y el resultado que devuelva ese servlet lo mostrará en una capa, en
este caso “cuerpo”.
6.5.2. El servlet
A continuación, crearemos el servlet con el que procesaremos la información del formulario
incluido en “login.jsp”. Para ello, pulsaremos con el botón derecho del ratón sobre el paquete p2, y
seleccionamos: New->Servlet. Le damos un nombre, por ejemplo, LoginTienda, y como paquete el
paquete creado anteriormente en el apartado 1.6.4, en este caso p2. Pulsamos en siguiente.
Figura 6.5.2.1: Creación del servlet para procesar la información de acceso a la tienda.
27
Desarrollo de Aplicaciones Web Creación de aplicaciones web siguiendo el...
Figura 6.5.2.2: Opción a seleccionar para añadir la información del servlet al fichero
web.xml.
De esta forma se habrá creado un servlet con las funciones básicas, entre ellas, la función
processRequest que es la que se va modificar, la cual es llamada desde las funciones doGet y
doPost, que son los dos métodos de envío existentes en HTTP que vamos a implementar.
Dado que vamos a realizar las mismas acciones independientemente del modo en que nos
lleguen los datos del formulario (modo GET o POST), en las funciones doGet o DoPost únicamente
realizaremos una redirección a la función processRequest, y en esa función implementaremos la
funcionalidad del servlet. Como NetBeans rellena por defecto la función con una página web, habrá
que borrar el contenido e implementar la funcionalidad adecuada.
En este caso, esa funcionalidad se basa en recoger el usuario y la clave enviados con el
formulario, y comprobar si existen en la base de datos. En caso afirmativo, permitiremos el acceso
al apartado del usuario, en caso negativo, se nos volverá a pedir que introduzcamos el usuario y el
password.
En el caso de que el usuario sea correcto, se introducirá una variable “usuario” en el entorno
de la sesión que almacenará ese nombre de usuario, lo que le permitirá saber al jsp al que se redirige
la petición, que un usuario se ha introducido correctamente.
El código es el siguiente. Como vemos, el servlet pertenecerá al paquete p2. Además, será
necesario el import “HttpSession”, para acceder al entorno de sesión de la aplicación web.
10 En este ejemplo solo implementamos la lógica que permite comprobar si un usuario/clave es correcto. En el
programa a desarrollar debe implementarse también la lógica que permita realizar el registro de nuevos usuarios.
28
Desarrollo de Aplicaciones Web Creación de aplicaciones web siguiendo el...
package p2;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; //Para acceder al entorno de sesión
...
…
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Esa clase dispondrá de una función comprobarUsuarioBD, que tendrá como parámetros un
usuario y una clave, y devolverá como respuesta true, si existe un par usuario/clave definido en la
base de datos, o false en caso contrario.
…
AccesoBD con = AccesoBD.getInstance(); //Instancia de la clase factoría AccesoBD
29
Desarrollo de Aplicaciones Web Creación de aplicaciones web siguiendo el...
}
…
…
response.sendRedirect("login.jsp"); //Redirigimos la petición a la página de login
}
NOTA: El código habrá que adaptarlo conveniente a las páginas web realizadas, dirigiendo la
redirección a la página adecuada.
6.5.3. La función comprobarUsuarioBD de la clase AccesoBD
En el apartado 6.2, se definió la clase AccesoBD para contener todas aquellas operaciones
que tengan que ver con la base de datos, entre ellas, se encontrará el proceso de conexión con la
base de datos y las diferentes consultas que se tengan que realizar en ella. Debemos definir una
nueva función comprobarUsuarioBD() que debe comprobar si el par usuario/clave existe en la base
de datos y en caso afirmativo devolver true, devolviendo false en caso contrario. El código de la
función comprobarUsuarioBD() será similar al siguiente:
try{
String con;
Statement s = conexionBD.createStatement();
// Consulta, buscamos una correspondencia usuario/clave
con = "SELECT * FROM usuarios WHERE usuario='" + usuario + "' and clave='" + clave + "'";
ResultSet resultado = s.executeQuery(con);
if ( resultados.next() ) // El usuario/clave se encuentra en la BD
{
return true;
}
else // El usuario/clave no se encuentra en la BD
{
return false;
}
}
catch(Exception e) { // Error en la conexión con la BD
System.err.println("Error verificando usuaro/clave");
System.err.println(e.getMessage());
return false;
}
}
30
Desarrollo de Aplicaciones Web Creación de aplicaciones web siguiendo el...
recogerCarrito (servlet)
Resguardo (jsp)
Tramitar pedido
Para formalizar el pedido los datos del carrito de la compra se enviarán a un servlet
(recogerCarrito) a través de una llamada ajax EnviarCarrito(url, capa, carrito).
El servlet recogerCarrito, se encargará de comprobar que los datos sean correctos (que haya
stock disponible de los productos comprados, por ejemplo) y redirigirá la petición a un documento
JSP (resguardo) que mostrará los datos de la compra y los datos de envío y facturación, junto con
dos botones, uno para llevar a cabo la compra y otro para cancelarla.
En este JSP (resguardo) se permitirá modificar los datos de usuario relacionados con el
envío de la compra (dirección, código postal, etc.), y de pago (tarjeta de crédito, contrarreembolso,
etc.). Los datos que estén previamente almacenados en la base de datos, como nombre, dirección,
etc., deben aparecer en el formulario por defecto. Asimismo, aparecerá el listado de productos a
comprar.
31
Desarrollo de Aplicaciones Web Creación de aplicaciones web siguiendo el...
Un javabean debe contener un constructor sin argumentos, unos atributos privados y una
serie de funciones get() y set() para leer y asignar valores a esos atributos.
Por tanto, inicialmente crearemos los atributos necesarios, quedando el código del javabean
como puede verse a continuación:
package p2;
Ahora deberíamos escribir el código de las funciones get() y set() para todos los atributos.
Sin embargo, podemos generarlos de forma automática seleccionando la opción Fuente → Insertar
código, apareciendo un cuadro de diálogo que permite incluir funciones get() y set() para los
elementos deseados, tal y como podemos ver a continuación:
32
Desarrollo de Aplicaciones Web Creación de aplicaciones web siguiendo el...
package p2;
33
Desarrollo de Aplicaciones Web Creación de aplicaciones web siguiendo el...
34
Desarrollo de Aplicaciones Web Creación de aplicaciones web siguiendo el...
Cabe tener en cuenta que los pedidos pueden tener diferentes estados (procesando, enviado,
recibido, …), por lo tanto, el cliente tan sólo podrá cancelar un pedido siempre y cuando este
todavía no haya sido enviado.
En esta sesión el alumno debe realizar todos los JSP y servlets que necesite para
implementar las funcionalidades indicadas con anterioridad. No se os facilita ningún esquema pues
a esta altura de la práctica debéis ser capaces de identificar claramente los JSP y/o servlets que
necesitáis para cada una de las opciones.
Por último, se os indica que para poder acceder a todas esas opciones el usuario debe
haberse identificado ante la aplicación, por lo que en caso de que no lo haya hecho se debe seguir el
mismo esquema que en el punto 6.5.
35
Desarrollo de Aplicaciones Web Creación de aplicaciones web siguiendo el...
Almacenar los productos de nuestra tienda: producto, descripción, precio, stock, etc.
Gestionar el acceso de los usuarios a la tienda virtual: usuario, clave.
Almacenar información de los usuarios: nombre, apellidos, dirección, etc.
Almacenar la información de los pedidos realizados: productos, unidades, etc.
Para acceder a la base de datos se requerirá definir consultas SQL. Algunos ejemplos de
consultas SQL para diferentes acciones son:
Búsqueda de información:
Inserción de información:
String con = "INSERT INTO usuarios(id,usuario,clave) VALUES (NULL,'" + usuario + "','" + clave +
"');
Modificación de información:
String con = "UPDATE productos SET unidades = '" + unidades + "' WHERE id='" + id + "'";
Eliminación de información:
String con = "DELETE FROM usuarios WHERE usuario='" + usuario + "' AND clave='" + clave + "'";
Para ejecutar las sentencias SQL se deberá utilizar la función executeQuery() para las
sentencias que tengan como resultado la obtención de datos (select), y executeUpdate() para
aquellas que tengan como resultado la modificación de la información (insert, update y delete).
Statement s = conexionBD.createStatement();
…
// definición de la consulta “con”
…
// Para obtener información
ResultSet resultado = s.executeQuery(con);
…
36
Desarrollo de Aplicaciones Web Creación de aplicaciones web siguiendo el...
// Para modificar
int filas = s.executeUpdate(con);
9.2- Prohibiciones.
Dado que se va a seguir el modelo MVC no se permite el uso de “out” tanto en las páginas
JSP como en los servlets, por lo que los servlets no crearan contenido visual (no enviarán nada con
response). Por tanto, está prohibido usar:
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("...");
En los JSP tampoco se permite el uso de out.println("…"), sino que se deberá utilizar el
delimitador <%=variable%>.
9.3- Recomendaciones.
A la hora de codificar en Java, se recomienda seguir las pautas seguidas en las Java Code
Conventions [9]. Así por ejemplo las clases siempre deben empezar por sustantivo en mayúsculas,
mientras que las variables y métodos de las clases deben empezar por verbo en minúsculas.
Además un código Java bien documentado haciendo uso de Javadoc, ayudar a ser
compartido y mantenido por los miembros de un equipo de desarrolladores (pareja en el caso de las
prácticas de la asignatura).
9.4- Entrega y evaluación.
La corrección de la práctica 2 se realizara comprobando el correcto desarrollo y
funcionamiento de la práctica. El alumno tendrá una sesión de defensa de la práctica con el profesor
en la cuál se le podrá requerir que explique aquellos elementos que el profesor considere relevantes,
entre ellos:
37
Desarrollo de Aplicaciones Web Creación de aplicaciones web siguiendo el...
38
Desarrollo de Aplicaciones Web Creación de aplicaciones web siguiendo el...
Todos los puntos en color rojo deben cumplirse para que la práctica pueda considerarse
correcta. Los puntos en color verde son mejoras que el alumno puede realizar en la misma.
Cargar url local (Ej0.html) en una capa (con el nombre capa1), a través de un enlace (<a>)
del menú:
Cargar la respuesta obtenida de un formulario en una capa. Esta función será útil para la
práctica 2, donde nos permitirá mostrar la respuesta que nos envié un servlet en la capa que
deseemos. En este ejemplo, el formulario se enviará al servlet registro, y lo que nos
devuelva ese servlet se mostrará en la capa con el nombre “capa1”).
Enviar el contenido del carrito de la compra a un servlet. Esta función convierte el array
asociativo donde se almacena los productos del carrito de la compra en una cadena JSON y
la envía como formato de formulario (atributo1=valor1&atributo2=valor2, …), de forma
que el servlet pueda obtener ese JSON a través del parámetro “carrito” de un formulario.
Esta función será útil para la sesión 3 de la práctica 2, donde se debe llevar a cabo la compra
del contenido del carrito. En este ejemplo, se ha definido un botón que llama a la función
RecogerCarrito, pasándole como parámetros el servlet que va a recibir esa información, la
capa donde se cargará la respuesta que proporcione el servlet, y el vector que contiene los
productos almacenados en el carrito.
39
Desarrollo de Aplicaciones Web Creación de aplicaciones web siguiendo el...
conexion.open("POST", url,true);
conexion.onreadystatechange=function()
{
if((conexion.readyState == 4) && (conexion.status == 200))
{
contenido.innerHTML = conexion.responseText;
invokeScript(document.getElementById(capa));
}
}
conexion.setRequestHeader('Content-Type','application/json; charset=utf-8');
conexion.send(JSON.stringify(valores));
}
Para procesar la cadena JSON en el servlet es necesario utilizar una librería específica.
Existen múltiples librerías, una de ellas, JSON-P, está incluida en el propio estándar de Java.
Un ejemplo de su uso sería el siguiente:
import javax.json.Json;
import javax.json.JsonObject;
import javax.json.JsonReader;
import javax.json.stream.JsonParser;
import javax.json.stream.JsonParser.Event;
import java.util.Iterator;
import java.util.ArrayList;
...
ArrayList <Producto> carrito = new <Producto>ArrayList();
for (String key : jobj.keySet()) { // Se recorren todos los productos pasados en el JSON
JsonObject prod = (JsonObject)jobj.getJsonObject(key);
carrito.add(nuevo);
}
40
Desarrollo de Aplicaciones Web Creación de aplicaciones web siguiendo el...
En este código, se obtiene la cadena almacenada en el JSON que contiene los productos que
queremos comprar, y se recorren sus elementos, almacenándose en un ArrayList de
“Producto”. Un ejemplo del formato de la cadena JSON que puede procesar es el siguiente:
{
"1":{
"id":"1",
"nombre":"Elemento 1 del carrito",
"cantidad":1,
"precio":100.0
},
"2":{
"id":"2",
"nombre":"Elementos 2 del carrito",
"cantidad":3,
"precio":120.5
}
}
41
Desarrollo de Aplicaciones Web Creación de aplicaciones web siguiendo el...
10- Referencias
1. Burbeck, Steve, “Applications Programming in Smalltalk-80™: How to use Model-View-
Controller (MVC),” in Smalltalk-80 v2.5, 1992 [Online]. Available:
https://www.researchgate.net/publication/238719652_Applications_programming_in_smalltal
k-80_how_to_use_model-view-controller_mvc
2. A. Leff and J. T. Rayfield, “Web-application development using the Model/View/Controller
design pattern,” in Proceedings Fifth IEEE International Enterprise Distributed Object
Computing Conference, 2001, pp. 118–127 [Online]. Available:
http://dx.doi.org/10.1109/EDOC.2001.950428
3. Oracle, “Java Servlet Technology.”
Visitado a 23/2/2020 en https://www.oracle.com/technetwork/java/index-jsp-135475.html ,
2019.
4. Oracle, “JavaServer Pages Technology.”
Visitado a 23/2/2020 en https://www.oracle.com/technetwork/java/index-jsp-138231.html ,
2019.
5. Oracle, “JavaBeans Technology.”
Visitado a 1/3/2020 en https://www.oracle.com/technetwork/java/javase/tech/index-jsp-
138795.html , 2019.
6. Oracle, “MySQL.”
Visitado a 1/3/2020 en https://www.mysql.com , 2019.
7. E. Gamma, R. Helm, R. Johnson, and J. Vlissides, Design patterns: elements of reusable
object-oriented software. Addison-Wesley, 1994.
8. Oracle, “JDBC Technology.”
Visitado a 1/3/2020 en https://www.oracle.com/technetwork/java/javase/jdbc/index.html ,
2019.
9. Sun Microsystems, “Java Code Conventions.”
Visitado a 1/3/2020 en https://www.oracle.com/technetwork/java/codeconventions-
150003.pdf, 1997.
42