Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Índice
1.-‐ PREÁMBULO 3
2.-‐ INTRODUCCIÓN 4
1.-‐ Preámbulo
El
proyecto
que
aquí
les
presento
viene
a
ser
una
asignatura
completa,
asignatura
dedicada
a
la
programación
de
aplicaciones
web,
y
esta
en
concreto
fue
impartida
en
Java.
Cogí
desde
el
principio
con
mucho
ánimo
esta
asignatura
y
poco
a
poco
me
fue
gustando
más.
Le
fui
dedicando
muchas
horas
a
este
proyecto
hasta
llegar
a
conseguir
un
ejemplo
lo
más
realista
posible
de
lo
que
pudiera
ser
una
tienda
online.
He
disfrutado
muchísimo
realizando
este
proyecto
no
solo
porque
se
trataba
de
algo
nuevo
sino
porque
he
adquirido
muchos
e
interesantes
conocimientos
sobre
el
lenguaje,
si
bien
es
cierto
que
me
queda
mucho
por
aprender
de
este
lenguaje
he
de
reconocer
que
esto
me
ha
ayudado
a
dar
un
paso
importante
en
este
continuo
aprendizaje.
Una
vez
completado
el
curso
pensé
que
ya
que
había
dedicado
mucho
tiempo
a
este
proyecto
podría
también
llegar
a
más
personas
y
ser
de
ayuda,
por
lo
que
he
seguido
trabajando
en
el
mismo
para
publicarlo
con
una
documentación
completa.
Sin
más
me
despido
y
espero
que
os
sea
de
ayuda
este
documento
así
como
el
proyecto
en
si.
2.-‐ Introducción
En
este
proyecto
se
ha
tratado
de
llevar
a
cabo
el
diseño
de
una
aplicación
web
que
cumpla
con
las
funcionabilidades
de
una
tienda
online
completa.
La
aplicación
debe
tener
una
interfaz
de
administración
la
cual
nos
permita
una
administración
completa
de
los
productos
(añadir,
modificar,
borrar
y
consultar),
también
es
posible
la
búsqueda
de
productos.
Para
acceder
a
la
zona
de
administración
es
necesario
estar
autentificado,
la
autentificación
se
realiza
mediante
un
correo
electrónico
y
una
contraseña.
También
es
posible
que
los
usuarios
se
registren
en
la
aplicación
con
la
ventaja
de
que
no
tendrán
que
introducir
los
datos
completos
para
realizar
la
compra.
También
podrán
consultar
su
historial
de
compras
y
por
supuesto
modificar
sus
datos.
La
parte
principal
de
la
aplicación
es
el
listado
de
productos
donde
el
usuarios
puede
añadirlos
a
la
cesta
de
la
compra.
El
usuario
podrá
consultar
el
estado
de
su
carrito
en
todo
momento
y
podrá
editar
la
cantidad
de
cada
producto
según
desee.
Cuando
el
usuario
quiera
dar
por
terminada
su
compra
tendrá
que
rellenar
el
formulario
con
los
datos
de
la
compra
en
el
caso
de
no
estar
registrado.
En
caso
contrario
lo
único
que
tendrá
que
hacer
es
seleccionar
la
forma
de
pago.
Posteriormente
un
correo
electrónico
será
enviado
al
usuario
con
los
detalles
de
la
compra.
La
aplicación
tiene
otras
funcionabilidades
extra
a
parte
de
las
básicas
de
una
tienda
online.
Es
posible
también
asignar
imágenes
a
los
productos,
el
sistema
está
capacitado
para
enviar
emails
a
los
usuarios
cuando
se
registran,
cuando
realizan
una
compra,
y
también
tienen
la
opción
de
recuperar
la
contraseña
en
caso
de
pérdida;
el
sistema
genera
una
nueva
contraseña
y
es
enviada
por
correo
electrónico
al
usuario.
Cuenta
con
la
opción
de
usar
persistencia
contra
bases
de
datos
así
como
persistencia
contra
ficheros
en
formato
binario
de
objetos
serializados.
Como
lenguaje
de
programación
para
la
aplicación
en
el
servidor
se
ha
usado
Java
EE
6,
el
servidor
de
aplicaciones
usado
es
GlassFish
Server
3.1
Gracias
a
este
diseño
se
podría
decir
que
el
trabajo
que
hemos
tenido
que
dedicar
a
la
aplicación
del
cliente
es
insignificante
debido
a
que
no
hemos
tenido
que
encargarnos
nosotros
del
desarrollo
del
navegador,
únicamente
de
generar
el
código
que
este
renderizará.
Esta
es
la
principal
ventaja
de
usar
este
modelo
de
diseño
unido
a
que
se
están
usando
tecnologías
estandarizadas.
Para
el
desarrollo
del
sistema
se
ha
usado
un
patrón
de
diseño
en
el
cual
hay
claramente
diferenciadas
tres
partes.
Por
una
parte
nos
podemos
encontrar
con
los
modelos
de
datos
que
en
nuestro
caso
serían
los
objetos
java
que
necesitamos
para
representar
la
información
de
nuestra
aplicación,
la
cual
estaría
almacenada
en
una
base
de
datos,
en
ficheros
o
en
cualquier
otro
modo
de
persistencia.
Por
otra
parte
tenemos
las
vistas
que
serían
las
páginas
que
se
encargan
de
la
presentación
al
usuario.
Estas
páginas
estarían
formadas
por
las
páginas
estáticas
HTML
y
las
páginas
dinámicas
JSP.
Base de datos
VB
Controlador
Usuario
Consultas al
if(conn
SELEC modelo
WHERE
print
Java
Servlet Java Seleccionar
EE vista
Modelos de vista
HTML JSP
En
primer
lugar
tendríamos
una
interfaz
que
indicaría
los
métodos
que
son
necesarios
en
la
persistencia
(los
métodos
a
los
que
se
llamarán
después
para
acceder
a
la
persistencia).
Por
cada
método
de
persistencia
tendríamos
una
clase
que
implementa
todos
y
cada
uno
de
los
métodos
de
la
interfaz.
Para
asegurarnos
de
que
no
se
crea
más
de
una
de
estas
clases
durante
el
desarrollo
de
la
aplicación
deberíamos
hacer
que
estas
clases
sigan
un
patrón
de
diseño
singleton
(explicado
posteriormente).
El
patrón
de
diseño
singleton
consiste
en
crear
un
constructor
para
la
clase
que
solo
permita
que
haya
una
única
instancia
de
la
clase
en
la
aplicación.
Esto
se
haría
haciendo
un
constructor
que
compruebe
si
hay
o
no
una
instancia
de
la
clase
en
la
aplicación,
si
la
hay
devolvería
es
misma
instancia,
en
caso
contrario
se
crearía
una
nueva
instancia.
StartListener persistencia.PersistenceFactory
beans.Producto persistencia.PersistenceInterface
Hay
un
filtro
que
recoge
todas
las
peticiones
y
se
encarga
de
registrar
cada
una
de
las
peticiones,
en
este
filtro
de
setean
tanto
la
respuesta
como
la
petición
con
la
codificación
que
usa
toda
la
aplicación;
de
esta
manera
nos
aseguramos
de
que
toda
la
aplicación
este
funcionando
en
la
misma
codificación
para
evitar
problemas.
Ahora
bien,
esto
no
nos
asegura
de
que
el
resto
de
cosas
externas
sigan
en
la
misma
codificación
(UTF-‐8),
como
pueden
ser
las
bases
de
datos
u
otros
recursos
externos
que
se
usen
en
la
aplicación.
Respecto
al
modelo
de
persistencia
que
se
ha
comentado
se
podría
añadir
que
para
acceder
a
las
funciones
de
la
persistencia
lo
que
se
realiza
es
obtener
siempre
la
interfaz
que
se
guardó
en
el
contexto
de
la
aplicación
al
inicio
de
la
misma
con
un
listener
de
inicio
de
contexto.
En
primer
lugar
se
ha
optado
por
la
opción
de
eliminar
las
contraseñas
de
las
bases
de
datos,
la
aplicación
no
contiene
ninguna
contraseña,
en
ningún
momento
son
guardadas.
Lo
que
se
almacena
es
una
huella
de
la
contraseña
mas
una
pequeña
cadena
fija
para
que
sea
resistente
también
a
los
ataques
por
diccionario
a
la
base
de
datos
en
busca
de
huellas
conocidas.
Cuando
el
usuario
introduce
una
contraseña
se
seguiría
se
obtendría
la
huella
de
la
misma
y
lo
que
se
compara
serían
las
dos
huellas.
Sin
asegurarlo
totalmente
podría
afirmar
que
la
única
forma
de
que
un
usuario
se
hiciera
con
la
contraseña
de
otro
sería
teniendo
un
sniffer
en
la
red
de
la
víctima
(puesto
que
la
aplicación
no
funciona
sobre
https),
otra
opción
sería
intentar
robar
la
sesión
de
alguna
manera,
pero
así
no
se
conseguiría
la
contraseña
del
usuario,
sino
acceso
a
su
sesión
por
un
periodo
limitado
de
tiempo.
Otro
aspecto
importante
en
la
seguridad
son
todas
las
entradas
de
datos
que
ser
reciben
del
usuario
tanto
de
formularios
como
de
cualquier
tipo
de
petición
que
tenga
que
atender
el
servidor,
no
se
debe
dar
por
supuesto
nada.
En
todos
los
formularios
que
recibe
la
aplicación
lo
primero
que
se
hace
con
ellos
es
verificar
que
contengan
los
parámetros
que
deseamos
(dependiendo
del
formulario
concreto),
y
posteriormente
todos
los
parámetros
recibidos
son
validados
con
la
librería
ESAPI
mediante
expresiones
regulares,
evitando
de
esta
manera
intentos
de
Cross
Site
Scripting
o
de
inyección
SQL.
También
son
validados
todos
aquellos
campos
que
deben
permitir
cualquier
texto
(como
puede
ser
el
caso
de
los
comentarios)
en
busca
de
cualquier
etiqueta
HTML
sospechosa
y
también
se
contemplan
los
ataques
usando
codificaciones
diferentes.
Posteriormente
una
vez
validados
cada
uno
de
los
parámetros
se
analiza
cada
uno
de
ellos
para
verificar
que
tengan
sentido,
no
se
permiten
números
negativos,
no
se
permite
eliminar
al
último
administrador,
no
se
permite
subir
un
archivo
que
no
sea
una
imagen
y
como
tamaño
máximo
8mb.
A
la
hora
de
construir
el
sistema
se
ha
construido
con
una
idea
final
en
mente
que
es
procurar
en
la
medida
de
lo
posible
o
en
todos
los
casos
si
es
posible
que
la
aplicación
fallase
por
el
uso
incorrecto
de
los
usuarios
o
el
intento
de
introducción
de
datos
erróneos
en
formularios
o
intento
de
“jugar”
con
las
URLs
de
la
aplicación.
Con
esto
quiero
decir
que
para
cada
acción
que
realiza
la
aplicación
primero
se
comprueba
si
es
posible
realizarla.
Por
ejemplo,
no
se
puede
borrar
un
administrador
si
es
el
único
que
hay,
no
se
pueden
comprar
mas
unidades
de
las
que
tiene
un
producto,
no
se
puede
borrar
o
editar
un
producto
o
usuario
que
no
existe.
En
este
apartado
se
explicarán
los
modelos
de
datos
que
han
sido
usados
para
representar
todos
los
datos
con
los
que
trabaja
la
aplicación.
Con
esta
clase
se
pretender
representar
un
producto
de
la
tienda
con
todos
los
atributos
que
contiene,
estos
atributos
serán
los
requeridos
por
el
enunciado.
• Nombre
• Precio
• Stock
• Descripción corta
• Detalles
Producto
Producto
©
Jdyb
-‐
Mayo
2011
16
Juan
Díez-‐Yanguas
Barber
Programación
con
Java
EE
Tienda
Online
_____________________________________________________________________________
Si
los
objetos
no
son
inmutables
sería
posible
por
ejemplo
que
un
usuario
que
esta
comprando
cambiara
las
unidades
de
un
producto
mientras
que
el
administrador
cambie
las
unidades
del
mismo
producto.
Con
esta
clase
se
pretende
representar
un
usuario
dentro
de
la
tienda
online.
Cada
objeto
de
la
clase
tendrá
los
siguientes
siguientes
atributos.
• Nombre
• Dirección
A continuación de puede observar un diagrama UML representando la clase.
Usuario
Usuario
4.3.-‐ Modelo de datos para el la cesta de la compra
Con
esta
clase
se
pretende
representar
la
cesta
de
la
compra
de
un
usuario.
El
carrito
de
la
compra
tiene
los
siguientes
atributos.
• Mapa de productos que contiene los productos añadidos al carro
Carrito
Carrito
Con
esta
clase
se
pretende
representar
un
comentario
añadido
por
un
usuario
a
un
producto
del
catálogo
de
la
tienda.
Un
comentario
se
representa
con
los
siguientes
atributos.
• Fecha
• Hora
Comentario
Comentario
Es
posible
que
la
aplicación
funcione
con
persistencia
contra
ficheros.
Para
que
funcione
correctamente
es
necesario
configurar
una
serie
de
parámetros
en
el
descriptor
de
despliegue
de
la
aplicación.
Posteriormente
lo
que
tendremos
que
hacer
es
configurar
la
ruta
de
los
ficheros,
si
únicamente
pone
el
nombre
del
fichero
se
guardaran
en
el
directorio
del
dominio
del
servidor
de
aplicaciones.
Los
archivos
van
a
ser
cargados
usando
directorios
del
sistema,
no
se
van
a
emplear
métodos
de
contexto
o
del
classpath
para
cargarlos.
La
ruta
del
fichero
que
contiene
los
datos
de
productos
y
usuarios
viene
dado
por
el
parámetro
de
contexto
archivoDatos.
Es
un
fichero
de
tipo
binario.
La
ruta
del
fichero
que
contiene
el
historial
de
carritos
viene
dada
por
el
parámetro
de
contexto
archivoHistoriales.
Es
un
fichero
de
tipo
binario
La
ruta
del
fichero
que
contiene
carritos
sin
comprar
que
son
guardados
para
ser
recuperados
al
inicio
de
la
sesión
de
los
usuarios
viene
dada
por
el
parámetro
de
contexto
archivoRecuperacion.
Es
un
fichero
de
tipo
binario.
La
ruta
del
fichero
de
registro
de
acciones
viene
dada
por
el
parámetro
de
contexto
archivoLog.
Es
un
fichero
de
texto
plano.
5.2.-‐ Configuración de persistencia en modo de bases de datos
La
aplicación
también
está
preparada
para
que
la
persistencia
funcione
contra
bases
de
datos,
para
ello
se
emplea
un
pool
de
conexiones
que
es
necesario
configurar
en
el
servidor
de
aplicaciones,
y
en
el
descriptor
de
despliegue.
La
aplicación
se
ha
desarrollado
con
una
base
de
datos
MySQL,
para
preparar
la
base
de
datos
para
la
aplicación
se
incluye
junto
con
este
documento
un
export
de
la
base
de
datos
completa.
• URL: jdbc:mysql://HOSTBASEDATOS
• Usuario
• Contraseña
Para
que
el
pool
de
conexiones
funcione
es
necesario
incluir
el
conector
de
la
base
de
datos
en
los
directorios
del
servidor
de
aplicaciones.
El
conector
para
MySQL
lo
puede
descargar
desde
la
página
web
oficial.
http://www.mysql.com/downloads/connector/j/
Una
vez
descargado
debe
incluir
el
archivo
jar
del
conector
en
el
directorio
del
servidor
de
aplicaciones.
En
el
caso
de
GlassFish
será
el
siguiente.
glassfish-‐3.1/glassfish/lib
En
primer
lugar
es
necesario
configurar
el
modo
de
persistencia
en
el
descriptor
de
despliegue.
En
segundo
lugar
hemos
de
configurar
el
nombre
del
recurso
JNDI
y
posteriormente
el
nombre
de
la
tabla.
Para
ello
se
usan
parámetros
del
contexto
que
fueron
usados
para
la
persistencia
en
modo
de
fichero.
También
es
necesario
configurar
el
recurso
en
el
descriptor
de
despliegue.
Por
último
se
ha
de
configurar
el
recurso
en
el
descriptor
de
despliegue
específico
del
servidor
de
aplicaciones.
En
el
caso
de
GlassFish
se
haría
como
se
puede
ver
aquí.
A
continuación
se
muestran
las
sentencias
SQL
necesarias
para
crear
las
tablas
necesarias
de
la
base
de
datos.
Sobre
el
contexto
de
la
aplicación
es
necesario
indicar
que
está
preparada
para
funcionar
sin
contexto
directamente
sobre
la
raíz
del
servidor
de
aplicaciones
debido
a
que
todas
las
rutas
usadas
en
la
aplicación
se
dan
a
partir
de
la
raíz
del
servidor.
Si
se
configurara
un
contexto
habría
que
configurar
de
nuevo
todas
las
rutas
de
la
aplicación.
Este
parámetro
de
configuración
lo
encontramos
en
el
descriptor
de
despliegue
propio
del
servidor
de
aplicaciones.
Mostramos
como
se
haría
para
GlassFish.
5.4.-‐ Configuración del servidor SMTP para el envío de emails
La
aplicación
permite
el
envío
de
emails
a
los
usuarios
cuando
son
registrados
con
sus
datos
de
registro,
también
cuando
una
compra
es
realizada
detallándose
en
el
mismo
los
detalles
de
la
compra
y
por
último
también
admite
la
posibilidad
de
recuperación
de
la
contraseña
de
los
usuarios
en
caso
de
olvido.
• mailUser:
Usuario
con
el
que
es
necesario
iniciar
sesión
para
enviar
los
correos
5.5.-‐ Configuración de las plantillas para el envío de emails
Usted
decide
la
información
que
desea
incluir
en
la
plantilla
con
las
siguientes
claves,
donde
usted
ponga
los
siguiente
códigos
será
donde
aparezca
en
el
email
la
información
correspondiente.
En
este
capítulo
vamos
a
detallar
cuales
son
las
librerías
que
han
sido
usadas
en
el
desarrollo
de
la
aplicación.
Los
ficheros
de
configuración
necesarios
para
esta
librería
se
encuentran
en
la
carpeta
setup
que
como
hemos
indicado
hay
que
añadirla
al
classpath.
Mostramos
en
primer
lugar
la
organización
de
Servlets
y
clases
en
los
diferentes
paquetes.
Mostramos
a
continuación
la
organización
de
vistas
de
la
aplicación.
En
primer
lugar
podemos
observar
como
tenemos
un
paquete
control.admin,
al
igual
que
en
las
vistas
también
lo
hay,
dentro
de
la
carpeta
admin
podemos
encontrar
también
una
carpeta
administration.
Dentro
del
paquete
control.admin
de
archivos
java
también
se
encuentra
un
directorio
que
no
se
ve
también
llamado
administration,
En
el
directorio
administration
es
donde
se
encuentran
todas
las
acciones
que
se
pueden
llevar
a
cabo
siendo
administrador,
que
son
todas
aquellas
que
se
refieren
a
la
administración
de
la
tienda.
La
entrada
en
esta
zona
es
comprobada
por
el
filtro
AdministrationFilter,
este
filtro
solo
comprueba
si
el
usuario
es
administrador
o
no
lo
es,
no
es
necesario
que
compruebe
la
autentificación
del
usuario
debido
a
que
ya
ha
sido
comprobada
por
el
filtro
AdminFilter
el
cual
se
encuentra
antes
que
este.
Podemos
observar
también
el
paquete
persistencia
en
el
cual
se
encuentran
las
clases
necesarias
que
se
describieron
anteriormente,
todas
ellas
juntas
forman
el
patrón
DAO
de
la
aplicación.
Observamos
una
carpeta
llamada
images,
dentro
de
esta
carpeta
se
guardarán
todas
las
imágenes
que
use
la
aplicación,
dentro
de
la
misma
habrá
varias
carpetas.
La
carpeta
icons
contiene
los
iconos
que
se
usan
en
la
aplicación,
como
por
ejemplo
puede
ser
el
carrito
de
la
compra.
Por
último
la
carpeta
template,
la
cual
contiene
todas
las
imágenes
utilizadas
por
la
plantilla
de
la
aplicación.
Posteriormente
vemos
en
la
raíz
de
la
aplicación
el
home,
la
página
de
login
y
la
página
de
acerca
de.
Observamos
la
carpeta
shop
que
contiene
las
vistas
de
las
acciones
a
realizar
referentes
a
las
acciones
con
los
productos
y
con
la
compra,
siempre
y
cuando
sean
públicas.
carpetas
dentro
y
en
su
raíz
el
descriptor
de
despliegue
y
el
fichero
de
configuración
específico
del
servidor
de
aplicaciones
usado
(GlassFish
3.1).
Encontramos
la
carpeta
include
que
contiene
páginas
jsp
que
van
a
ser
incluidas
en
las
vistas
de
la
aplicación,
a
estas
páginas
no
se
debe
llegar,
solo
deben
ser
incluidas
en
el
cuerpo
de
otras
páginas
jsp.
Java
LogFilter.java Destino
Guarda
registro deVB V
petición
Autentificado
Java Java
Destino
LogFilter.java AdminFilter.java
JSP
Sin
autentificar
restricted.jsp
Sin
Java Java autentificar JSP
Autentificado Administrador
Java
Destino
En
este
apartado
detallamos
los
diagramas
de
navegación
para
los
listeners
de
VB
la
aplicación.
VB
Despliegue de la
aplicación
Error
JSP Persistencia inicializando
cargada persistencia
if(conn
SELEC
Java
WHERE
print
Listener de sesión
Sesión caducada o
cerrada
if(conn
SELEC
Si no es usuario WHERE
print Si es usuario autentificado
registrado; o si lo es pero y tiene carro sin comprar
no tiene carro. Continua el SaveSession
flujo normal Listener.java
Destino Guarda
carrito que no
se ha
confirmado
©
Jdyb
-‐
Mayo
2011
38
Juan
Díez-‐Yanguas
Barber
Programación
con
Java
EE
Tienda
Online
_____________________________________________________________________________
Para
este
primer
diagrama
vamos
a
mostrar
como
se
sigue
el
diagrama
con
capturas
de
pantalla
para
que
se
tome
como
ejemplo
para
entender
el
resto
de
los
diagramas.
JSP
Java
Listado de productos <script
var a=
var xl
if(xls
AddCarritoServlet
/shop/products.jsp
Si el error es
formulario
incorrecto o
petición
POST
Error 404
©
Jdyb
-‐
Mayo
2011
39
Juan
Díez-‐Yanguas
Barber
Programación
con
Java
EE
Tienda
Online
_____________________________________________________________________________
VB
VB
JSP
Si la sesión no
Listado de productos en Java contiene carrito JSP
el carrito <script
var a=
var xl
if(xls
EditAmount /shop/
Servlet Formulario products.jsp
incorrecto
/shop/cart.jsp
Error 404
Actualiza el carro si
las Si hay error en las
comprobaciones comprobaciones se
son positivas añade mensaje
Para
borrar
un
producto
de
la
cesta
se
seguiría
el
mismo
mecanismo
con
la
salvedad
de
que
la
cantidad
que
se
pediría
son
cero
unidades.
JSP Java
Listado de productos en <script
var a=
el carrito var xl
VB
if(xls
DeleteCart VB
Servlet
/shop/cart.jsp
JSP
Si se han hecho
Listado de productos en Java cambios en el
el carrito <script
carrito se avisa
var a=
GET var xl
if(xls
UpdateCart
Servlet
/shop/cart.jsp Si no es la
operación de venta
definitiva
Si no hay carrito en
la sesión
JSP JSP
Listado de productos Formulario de venta
/shop/products.jsp /shop/buycart.jsp
POST
Error 404
Realizar la compra VB
JSP
Java Si se han hecho
Formulario de venta <script cambios en el
var a=
var xl carrito se avisa
if(xls
POST
UpdateCart
Servlet
/shop/buycart.jsp
Si no hay carrito en
la sesión Java Error 404
JSP <script
var a=
var xl
if(xls
GET
Listado de productos
VB
BuyServlet
/shop/products.jsp POST
Fallos o cambios
Compra exitosa
en el carrito
Registro de la
compra
Enviar Email
JSP
Compra realizada
/shop/buyinformation.jsp
Es
importante
destacar
de
este
diagrama
el
paso
previo
antes
de
la
compra
por
el
Servlet
UpdateCartServlet,
es
posible
que
el
que
lo
vea
se
pregunte
porque
pasa
antes
por
aquí
que
por
el
Servlet
que
realmente
realiza
la
compra.
Se
ha
diseñado
así
por
cuestiones
de
rendimiento.
El
Servlet
que
realiza
la
compra
comprueba
si
las
unidades
son
correctas
o
no
y
edita
el
catálogo,
pero
estas
operaciones
las
realiza
de
manera
sincronizada
y
pidiendo
locks,
por
lo
que
el
rendimiento
de
la
aplicación
disminuiría
significativamente
en
el
caso
de
que
hubiera
muchos
hilos
concurrentes
ejecutando
el
Servlet
de
compra.
evitamos
que
todas
las
peticiones
lleguen
al
servlet
que
realiza
la
compra.
Se
podría
decir
que
de
esta
manera
reducimos
las
peticiones
que
llegan
al
servlet
de
compra
y
las
que
llegan
al
mismo
tienen
un
porcentaje
de
acierto
mayor
a
la
hora
de
completar
la
compra
con
éxito.
VB
VB
También
es
importante
este
paso
previo
antes
de
la
compra
porque
ese
servlet
también
realiza
una
actualización
del
precio
del
carrito
por
si
algún
producto
cambió
el
precio
en
el
periodo
de
tiempo
en
el
que
ha
estado
ese
producto
en
el
carrito.
De
esta
manera
aseguramos
que
el
precio
que
se
paga
por
el
carrtito
es
el
actual.
Busqueda de productos
JSP GET
Java
Busqueda <script
var a=
var xl
if(xls
Error 404
SearchProduct POST
Servlet
/shop/products.jsp
Sin parámetros de
Correcto
vuelta
Buscar
productos
Registro de usuarios
JSP GET
Registro
Error 404
Registro
correcto
Nuevo usuario
VB VB
Enviar email
registro
Inicio de sesión
Errores en la
Autentificación
autentificación
correcta
/index.jsp
Recuperación de contraseña
PassRecover
Servlet Error 404
/login.jsp
Proceso
correcto
POST
Error en el
proceso
VB
Cambio de contraseña
JSP GET
Java
Cambio de contraseña VB
<script
var a=
var xl Error 404
if(xls
ChangePass POST
Servlet
/admin/
preferences.jsp Error en el
proceso
JSP
Proceso
completado
/WEB-INF/
admin/ Java No se encuentra el
logout.jsp
<script usuario de la sesión
var a=
var xl
if(xls
LogOutServlet Actualizar
datos
JSP GET
Cambio de datos personales Java
<script
var a=
var xl
if(xls
Error 404
EditUserServlet
POST
/admin/preferences.jsp
VB VB
Actualizar
Error en el Proceso datos
proceso completado
GET
JSP Java
<script
Añadir comentario var a= Error 404
var xl
if(xls
POST
AddComment
Servlet
/shop/
viewprod.jsp?
prod= Error en el Proceso
proceso completado
Guardar
datos
Cerrar sesión
JSP Java
Cerrar sesión <script
var a=
var xl
if(xls VB VB
LogOutServlet
/logout
/admin/
administration/
addproduct.jsp Operación exitosa
GET
JSP
Confirmar
Previsualización producto
producto
VB
Editar
producto
/WEB-INF/admin/
preview_prod.jsp
GET
Error Exito
guardando guardando
Guarda
producto
JSP
Administración de productos
/admin/administration/
products_administration.jsp
JSP
VB
Java POST
Editar producto
<script
var a=
var xl
1 ----- if(xls Operación
2 ----- correcta
3 ----- EditProduct
Servlet
/admin/
Errores en la JSP
administration/ operación
modifyprod.jsp Previsualización producto
Editar
producto
JSP
Administración de productos Confirmar /WEB-INF/admin/
producto preview_prod.jsp
GET
GET
/admin/administration/
products_administration.jsp
Error Exito
guardando guardando
Guarda
producto
Editar usuario
VB
JSP GET
/admin/administration/
edituser.jsp?user= Operación
Errores
completada
JSP
Administración de
usuarios
VB Actualizar VB
usuario
/admin/administration/
user_administration.jsp
Borrar usuario
JSP Java
Error en
Lista de usuarios <script
var a= peticion
var xl
if(xls
Error 404
DeleteUser
Servlet
/admin/administration/
user_administration.jsp
Borrado Error en el
correcto proceso
Borrar
usuario
Borrar producto
VB
JSP JSP
Listado productos Borrar producto
/admin/administration/ /admin/administration/
products_administration.jsp delprod.jsp?prod=
Cancelar Confirmar
POST
Java
<script
var a=
var xl
Error 404
if(xls
DeleteProduct
GET Servlet
Error Exito
Borrar
producto
Editar comentario
JSP JSP
VB
Error 404
/shop/viewprod.jsp? /admin/administration/
prod= editcomment?cod=
Parámetros Parámetros
correctos incorrectos
Error
validación
<script
Java var a=
var xl
if(xls
Errores
EditComment
Servlet
Correcto
Actualizar
comentario
Borrar comentario
JSP
Java
Producto
<script
var a=
Error 404
var xl
if(xls
DeleteComment
Servlet
/shop/viewprod.jsp?
prod= Error
parámetros
o POST
Borrado Borrado
correcto fallido
Mostramos
a
continuación
la
web
de
la
librería
usada,
aunque
el
documento
de
la
librería
que
se
usa
en
esta
aplicación
ha
sido
modificado
para
dar
los
mensajes
en
español
y
también
se
han
modificado
algunas
de
las
expresiones
regulares
y
se
han
añadido
otras
expresiones
regulares
como
por
ejemplo
para
validar
las
direcciones.
http://www.vanadiumjs.com/
Otra
de
las
librerías
usadas
es
Tiny-‐MCE
el
cual
sirve
para
que
los
cuadros
de
texto
de
los
textarea
sean
cuadros
de
texto
WYSIWYG.
Para
ello
hay
que
inicializar
las
páginas
que
contengan
los
textarea
con
una
función
que
especifica
las
opciones
de
plugin.
Esta
función
la
podemos
ver
en
el
documento
scripts.js.
Dejo
a
continuación
la
web
del
plugin
en
donde
se
puede
obtener
más
información
acerca
de
las
opciones.
http://tinymce.moxiecode.com/
Algo
que
hay
que
tener
muy
en
cuenta
a
la
hora
de
usar
este
plugin
es
que
se
ha
dejado
muy
corto
de
opciones
debido
a
que
se
valida
el
html
de
entrada
en
el
servidor
por
cuestiones
de
seguridad,
por
lo
que
hay
ciertas
etiquetas
de
html
o
css
que
no
están
permitidas,
por
ello
el
fichero
XML
de
configuración
de
antisamy
está
adaptado
especialmente
a
este
plugin.
Otro
aspecto
muy
importante
a
tener
en
cuenta
es
que
la
combinación
de
estos
dos
plugins
puede
tener
problemas,
a
continuación
explico
las
causas.
El
cuadro
de
texto
WYSIWYG
que
se
genera
no
es
el
mismo
textarea
que
hay
en
nuestro
html,
se
podría
decir
que
es
uno
virtual,
por
lo
que
nosotros
escribimos
en
el
virtual,
por
lo
tanto
nuestro
textarea
está
vacío
y
por
esta
causa
la
validación
por
la
librería
Vanadium
fallaría.
Por
ello
lo
que
hay
que
hacer
es
volcar
el
contenido
del
cuadro
de
texto
WYSIWYG
en
el
textarea
real
de
nuestro
html.
Para
ello
hemos
de
usar
eventos,
yo
para
solucionarlo
que
he
hecho
es
que
se
vuelque
el
contenido
con
cualquier
cambio
que
se
produzca
en
el
campo
de
texto.
Esto
lo
podemos
configurar
en
la
función
de
inicialización
del
cuadro
WYSIWYG.
Otra
opción
interesante
es
que
se
produzca
un
volcado
en
el
submit
del
formulario.
http://code.google.com/p/tiendaonlinelpijdyb/
http://code.google.com/p/tiendaonlinelpijdyb/source/browse/#svn%2Ftrunk%
253Fstate%253Dclosed
Es
posible
bajar
el
proyecto
haciendo
un
checkout
del
mismo
con
el
cliente
de
subversión
que
nosotros
deseemos.
Por
ejemplo
podemos
usar
el
cliente
que
trae
Netbeans
por
defecto.
En
la
siguiente
ventana
se
nos
preguntará
por
la
URL
del
repositorio.
https://tiendaonlinelpijdyb.googlecode.com/svn
En
esta
ventana
se
nos
preguntará
por
la
ruta
de
la
que
deseamos
hacer
el
checkout
y
posteriormente
por
la
ruta
dentro
de
nuestro
equipo
donde
queremos
que
se
guarde
el
proyecto.
En
la
siguiente
ventana
podemos
comprobar
que
se
ha
realizado
correctamente
la
operación
y
observamos
que
ha
detectado
que
es
un
proyecto
de
NetBeans
y
nos
da
la
opción
de
abrirlo
o
no
abrirlo.
Podemos
acudir
al
directorio
de
nuestro
equipo
donde
elegimos
guardar
el
proyecto
y
comprobaremos
que
se
ha
bajado
correctamente.
La
función
de
subida
de
imágenes
podría
ser
mejorable
modificando
el
modelo
de
datos
y
de
esta
manera
ayudaríamos
al
SEO
(Searh
Engine
Optimization)
para
que
nuestras
imágenes
fueran
mejor
indexadas
por
los
motores
de
búsqueda.