© Jdyb -‐ Mayo 2011
Ejemplo de Programación con Java EE
Una Tienda Online
Juan Díez-‐Yanguas Barber
Programación con Java EE 6
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 2
Índice
1.-‐ PREÁMBULO 3
2.-‐ INTRODUCCIÓN 4
3.-‐ DISEÑO DEL SISTEMA 10
3.1.-‐ HERRAMIENTAS UTILIZADAS 10 3.2.-‐ PATRÓN DE DISEÑO MVC 11 3.3.-‐ DISEÑO DE LA PERSISTENCIA. PATRÓN DAO 12 3.4.-‐ DISEÑO DE FILTROS 14 3.5.-‐ ACCESO A LOS MECANISMOS DE PERSISTENCIA 14 2.6.-‐ SEGURIDAD DE LA APLICACIÓN 14
4.-‐ MODELOS DE DATOS USADOS 16
4.1.-‐ MODELO DE DATOS DE PRODUCTO 16 4.2.-‐ MODELO DE DATOS PARA EL USUARIO 17 4.3.-‐ MODELO DE DATOS PARA EL LA CESTA DE LA COMPRA 18 4.4.-‐ MODELO DE DATOS PARA LOS COMENTARIOS 19
5.-‐ CONFIGURACIÓN DE LA APLICACIÓN 20
5.1.-‐ CONFIGURACIÓN DE PERSISTENCIA EN MODO FICHERO 20 5.2.-‐ CONFIGURACIÓN DE PERSISTENCIA EN MODO DE BASES DE DATOS 22 5.3.-‐ CONFIGURACIONES MISCELÁNEAS SOBRE LA APLICACIÓN 25 5.4.-‐ CONFIGURACIÓN DEL SERVIDOR SMTP PARA EL ENVÍO DE EMAILS 26 5.5.-‐ CONFIGURACIÓN DE LAS PLANTILLAS PARA EL ENVÍO DE EMAILS 28 5.6.-‐ LIBRERÍAS NECESARIAS 29
6.-‐ FUNCIONAMIENTO EN DETALLE DEL SISTEMA 31
6.1.-‐ ESTRUCTURA DE LA APLICACIÓN 31 6.2.-‐ DIAGRAMAS DE NAVEGACIÓN DE FILTROS 36 6.3.-‐ DIAGRAMAS DE NAVEGACIÓN DE LISTENERS 38 6.4.-‐ FLUJO DE NAVEGACIÓN DE LAS OPERACIONES PÚBLICAS 39 6.5.-‐ FLUJO DE NAVEGACIÓN PARA OPERACIONES DE USUARIO REGISTRADO 46 6.6.-‐ FLUJO DE NAVEGACIÓN DE LAS OPERACIONES DEL ADMINISTRADOR 49 6.7.-‐ SOBRE EL JAVASCRIPT QUE SE HA USADO 55
7.-‐ SISTEMA DE CONTROL DE VERSIONES 58
8.-‐ ASPECTOS A MEJORAR 61
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 3
1.-‐ Preámbulo
He sido siempre un apasionado de la informática, y desde que comencé mis estudios de Ingeniería Informática esta afición por la materia ha ido creciendo progresivamente.
Actualmente he finalizado mis estudios de Ingeniería Técnica en Informática de Sistemas, los que continuaré el próximo año para proseguir con la Ingeniería Superior.
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.
No puedo terminar este texto sin agradecer a Abraham Otero Quintana el interés que ha despertado en mí con este proyecto y los ánimos que me ha dado para continuar con ello hasta obtener un proyecto perfeccionado para su publicación. También le tengo que agradecer la ayuda que me ha prestado de manera totalmente desinteresada para la publicación del mismo.
Sin más me despido y espero que os sea de ayuda este documento así como el proyecto en si.
Pueden ponerse en contacto conmigo en esta dirección de correo electrónico sin problema alguno: [email protected]
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 4
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.
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 5
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.
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 6
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.
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 7
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 añadir comentarios a los productos siendo un usuario registrado.
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 8
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.
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 9
Cuenta con la opción de usar persistencia contra bases de datos así como persistencia contra ficheros en formato binario de objetos serializados.
Como ayuda a los administradores cuenta con un registro de peticiones realizadas al servidor que son guardados en una base de datos o en fichero (según sea el método de persistencia); este registro ayudará a realizar un seguimiento detallado para los administradores.
Es posible la visualización de estadísticas de ventas, esta opción estará disponible para aquellos usuarios que sean administradores de la tienda.
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 10
3.-‐ Diseño del sistema
3.1.-‐ Herramientas utilizadas
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
Como entorno de desarrollo se ha usado NetBeans 7.0.
Para la presentación de cara al usuario se han empleado páginas JSP para la generación del código HTML que finalmente será mostrado al usuario mediante el navegador web que será el que renderice dicho código.
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.
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 11
3.2.-‐ Patrón de diseño MVC
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.
Por último tendríamos la parte del controlador que sería la encargada de realizar las acciones necesarias para nuestro modelo de negocio. Esta parte realizará unas acciones y de manera general posteriormente decidirá la vista que se desea presentar al usuario, como ya se ha dicho esta parte se encarga de las operaciones necesarias por el modelo de negocio y por lo tanto será esta parte la que reciba las acciones por parte del usuario.
Usuario
if(conn SELEC WHERE print
Servlet Java EE
VB
Java
HTML
VB
JSP
Modelos de vista
Base de datos
Objetos Java
Controlador
Acciones del usuario
Actualizar modelo
Seleccionar vista
Consultas al modelo
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 12
3.3.-‐ Diseño de la persistencia. Patrón DAO
A continuación usaremos el patrón de diseño que se ha usado para el mecanismo de persistencia de la aplicación.
Este patrón trata de independizar el tipo de persistencia del resto de la aplicación, de esta manera la aplicación no tiene dependencia del tipo de persistencia que se este llevando a cabo.
Por poner un ejemplo, podemos estar desarrollando la aplicación con persistencia contra ficheros y posteriormente decidir que lo queremos hacer contra base de datos y no habría que cambiar nada de la lógica de negocio de la aplicación, únicamente habría que implementar los métodos necesarios para persistir contra la base de datos.
Explicamos a continuación en que consiste este patrón de diseño.
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).
Por último tendríamos una factoría que dependiendo de los argumentos, en nuestro caso parámetros del descriptor de despliegue, nos devolvería una instancia de la clase encargada de la persistencia (dependiendo de los argumentos para el tipo de persistencia).
Para acceder a la persistencia no tendríamos mas que acceder mediante la interfaz a los métodos y de esta manera el modelo de negocio de la aplicación es totalmente independiente del tipo de persistencia.
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.
La forma de controlar las instancias existentes es hacer que la propia clase contenga en sus atributos una instancia de ella misma.
Mostramos a continuación un diagrama de clases en el que se muestran las dependencias de cada una de estas clases.
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 13
StartListener
private boolean startValidate(ServletContext context)
public void contextDestroyed(ServletContextEvent sce)
private persistence: PersistenceInterface
public void contextInitialized(ServletContextEvent sce)
beans.Producto
beans.Usuario
beans.Comentario
beans.Carrito
Modelo de persistencia. Patrón DAO
persistencia.PersistenceInterface
public boolean delProduct(String codigo)
public boolean delUser(String mail)
public boolean addProduct (Producto prod)
public boolean addUser (Usuario user)
public boolean init (String locationUser, String locationProduct);
public boolean exit ()
public Usuario getUser (String mail)
public int anyAdmin ()
public boolean updateProduct (String codigo, Producto prod)
public boolean updateUser (String mail, Usuario user)
public Producto getProduct (String codigo)
public boolean saveCart (Carrito cart, boolean completado, String date, String formPago)
public boolean saveRequest (String fechaHora, String requestedURL, String remoteAddr, String remoteHost, String method, String param, String
userAgent)
public Map<String, Producto> searchProd(String campo, String term)
public Map <String, Usuario> getUsers ()
public Map <String, Producto> getProducts()
public boolean newComment (Usuario user, String codigoProducto, String codigoComentario,
String fechaHora, String comentario)
public ArrayList <Producto> getDetailsCartRecord (String codigo)
public ArrayList <Carrito> requestSalesRecord (String campo, String term)
public boolean deleteImcompleteCartsClient (String mailClient)
public boolean saveCart (Carrito cart, boolean completado, String date, String formPago)
public Carrito requestLastIncompleteCart (String mail)
public boolean updateComment (String codComentario, Comentario comentario)
public boolean deleteComment (String codigoComentario)
public Comentario getComment (String codComentario)
public LinkedList <Comentario> getComentarios (String campo, String valor)
persistencia.PersistenceFactory
public static PersistenceInterface getInstance (String type)
persistencia.PersistenceFile
lockProductos: Object
usuarios: Map<String, Usuario
productos: Map<String, Producto>
fileNameProduct: String
persistence: PersistenceFile
fileNameUser: String
lockUsuarios: Object
persistencia.PersistenceBD
instance: PersistenceBD
pool: DataSource
nameBD: String
logger: Logger
private ArrayList <String> requestIncompleteCarts (String mail)
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 14
3.4.-‐ Diseño de filtros
En este apartado veremos algunos aspectos del diseño de la aplicación que considero de interés aparte de los ya explicados en los apartados anteriores.
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.
La autentificación de la aplicación está basada en el uso de filtros. Hay un filtro que nos permite acceder a la zona de usuarios registrados de la aplicación (dependiendo de los atributos de la sesión) y un filtro posterior que verifica que podamos acceder a la zona de administración, zona a la que solo deben acceder los usuarios con suficientes permisos.
3.5.-‐ Acceso a los mecanismos de persistencia
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.
2.6.-‐ Seguridad de la aplicación
La aplicación ha sido diseñada prestando mucha atención a los aspectos de seguridad de la misma, no se ha tenido absolutamente ninguna idea preconcebida a la hora del diseño de la misma, se ha partido del pensamiento de que todo ha de ser validado.
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
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 15
(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.
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 16
4.-‐ Modelos de datos usados
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.
4.1.-‐ Modelo de datos de Producto
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.
• Código (Creado de manera automática usando UUIDs)
• Nombre
• Precio
• Stock
• Descripción corta
• Detalles
Se presenta a continuación un diagrama UML representando la clase.
Producto
public String getCodigo()
public int getStock()
public double getPrecio()
public String getNombre()
public String getDetalles()
public String getDesc()
Producto
detalles:String
desc: String
stock: int
precio: double
codigo: String
nombre: String
public Producto(String codigo, String nombre, double precio, int stock,
String desc, String detalles)
public Producto(String codigo, String nombre, double precio, int stock)
public Producto () public String getDisponibilidad ()
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 17
Como se puede observar en el diagrama UML no hay ningún método en esta clase que permita modificar el producto por lo que se puede decir que las instancias de esta clase serán inmutables, una vez creados los objetos no será posible modificar los mismos. Se ha hecho de esta manera para evitar problemas de concurrencia.
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.
4.2.-‐ Modelo de datos para el usuario
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
• Email (identificador único)
• Contraseña (MD5 de la contraseña)
• Permisos (‘a’ Administrador, ‘c’ Cliente normal)
A continuación de puede observar un diagrama UML representando la clase.
Usuario
Usuario
public Usuario ()
permisos: char
pass: String
mail: String
nombre: String
dir: String
public Usuario(String nombre, String dir, String
mail, String pass, char permisos)
public String getDir()
public String getMail()
public String getPass()
public String getNombre()
public char getPermisos()
public String getPrintablePermissions ()
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 18
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.
• Código del carrito
• Email del usuario
• Mapa de productos que contiene los productos añadidos al carro
• Precio del carro completo
• Fecha de la compra
• Hora de la compra
• Forma de pago de la compra
Carrito
Carrito
hora: String
fecha: String
precio: double
articulos: Map <String, Integer>
codigo: String
user: String
formPago: String
public Carrito ()
public Carrito(String codigo, String user, double precio)
public Carrito(String codigo, String user, double precio, String fecha, String hora,
String formaPago)
public Carrito(String codigo, String user)
public boolean editCant (String prod, int cantidad,
double prodPrice)public void delProduct
(String prod)public int getLenght ()
public Map <String, Integer> getArticulos ()
public String getCodigo()
public String getUser()public double getPrecio () public void setArticulos
(Map<String, Integer> articulos)
public String getFormaPago()
public void setPrecio (double price public String getHora()
public String getFecha() public void setUser(String user)
public void addProduct (String newProd, int
cantidad, double prodPrice)
public void removeProd(String prod, double
prodPrice)
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 19
4.4.-‐ Modelo de datos para los comentarios
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.
• Código del comentario
• Fecha
• Hora
• Código del producto
• Email del usuario
• Nombre del usuario
• Texto del comentario
Comentario
Comentario
nombre: String
Email: String
codigoProducto: String
hora: String
codigoComentario: String
fecha: String
comentario: Stringpublic String getHora()
public String getFecha()
public String getComentario()
public String getCodigoProducto()
public Comentario(String codigoComentario, String fecha, String hora, String codigoProducto, String
Email, String nombre, String comentario)
public String getCodigoComentario()
public String getEmail()
public String getFechaHora ()
public String getNombre()
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 20
5.-‐ Configuración de la aplicación
En este capítulo se van a describir diferentes aspectos de configuración de la aplicación necesarios para poder desplegar la aplicación correctamente.
5.1.-‐ Configuración de persistencia en modo fichero
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.
Lo primero que tenemos que hacer es indicar que la persistencia de la aplicación va a funcionar contra ficheros. Para ello tenemos que configurar el parámetro de contexto persistenceMethod. El valor que debe tener este parámetro para que funcione con ficheros es file.
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.
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 21
La ruta del fichero de registro de acciones viene dada por el parámetro de contexto archivoLog. Es un fichero de texto plano.
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 22
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.
A continuación se muestran los datos que son necesarios para configurar el pool de conexiones
• Nombre del recurso: el que se desee.
• JNDI: jdbc/OnlineShop (el nombre que será usado en el descriptor de despliegue)
• Motor de bases de datos: MySQL
• Nivel de aislamiento de las transacciones: READ-‐COMMITED
• Puerto: 3306 (puerto por defecto de mySQL)
• Nombre de la base de datos
• URL: jdbc:mysql://HOSTBASEDATOS
• Nombre del servidor
• 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
Una vez se ha configurado el servidor de aplicaciones hay que pasar a configurar la aplicación.
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 23
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.
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 24
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 25
5.3.-‐ Configuraciones misceláneas sobre la aplicación
Si la aplicación no encuentra un usuario administrador automáticamente lo creará partiendo de una serie de parámetros del descriptor de despliegue. Es necesario tener en cuenta que debido a que existen validaciones de datos en la aplicación los datos introducidos tendrán que ser datos válidos.
Es posible configurar la caducidad de la sesión de usuario en minutos, esto indica el tiempo en el que si la sesión está inactiva se cerrará de manera automática.
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.
También es necesario que la carpeta setup de la aplicación este añadida al classpath de ejecución de la máquina virtual.
En esta carpeta se encuentran ficheros de configuración de las librerías de validación y las plantillas de los emails que son enviados.
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 26
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.
Para el envío de los emails es necesario configurar un servidor SMTP y será configurado desde el descriptor de despliegue de la aplicación mediante los parámetros de contexto. Los parámetros con los que viene configurado son plenamente funcionales.
• hostMail: Host del servidor SMTP
• TSLMail: Si el servidor permite o no cifrado TSL
• mailPort: Puerto del servidor SMTP
• mailUser: Usuario con el que es necesario iniciar sesión para enviar los correos
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 27
• authMail: Si es necesaria o no la autentificación para el envío de mensajes
• mailFrom: Dirección de email del remitente que aparecerá en los correos enviados
• mailPass: Contraseña del servidor SMTP
A continuación se muestra un ejemplo de configuración en el descriptor de despliegue de la aplicación.
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 28
5.5.-‐ Configuración de las plantillas para el envío de emails
Existen plantillas personalizables para el envío de emails. Las podemos encontrar en la carpeta setup que como hemos dicho debe de estar añadida al classpath de la máquina virtual de java.
En primer lugar encontramos la plantilla con nombre plantillaCompra.html. Esta plantilla será usada para el envío de emails detallando los detalles de la compra.
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.
• &LISTA: Aquí aparecerá una tabla detallando la lista de productos siguiendo los estilos css .headerTable y .contentTable que indican el estilo de la cabecera y el contenido respectivamente
• &TOTAL: Aquí aparecerá el total de la compra en euros y con dos decimales.
• &NAME: Nombre del cliente
• &EMAIL: Email del cliente
• &DIR: Dirección del cliente
• &FORMPAGO: Forma de pago escogida por el cliente
La plantilla de envío de recuperación de contraseña está bajo el nombre plantillaRecuperarPass.html. Se detallan a continuación los códigos para la inclusión de datos.
• &NAME: Nombre del cliente
• &EMAIL: Email del cliente
• &PASS: Nueva contraseña para el cliente
La plantilla de registro para los usuarios esta bajo el nombre plantillaRegistro.html. Se detallan a continuación los códigos para la inclusión de datos.
• &NAME: Nombre del cliente elegido para el registro
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 29
• &EMAIL: Email del registro
• &DIR: Dirección del cliente para el registro
5.6.-‐ Librerías necesarias
En este capítulo vamos a detallar cuales son las librerías que han sido usadas en el desarrollo de la aplicación.
Podemos encontrar las librerías necesarias en la carpeta lib.
ESAPI 2.0GA Librería usada para la validación de entradas de usuario está situado dentro de la carpeta lib y necesita las librerías que están incluidas en la carpeta esapi-‐required.
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.
• ESAPI.properties: Fichero principal de configuración de ESAPI
• validation.properties: Fichero de configuración para las expresiones usadas en la validación
• antisamy-‐slashdot-‐1.4.3.xml: Fichero de validación de HTML para HTML que pueda introducir el usuario
JFreeChart 1.0.13 es la librería que se ha usado para generar las gráficas de estadísticas, situada en la carpeta lib y requiere la librería Jcommon 1.0.16 también situada en la carpeta lib.
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 30
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 31
6.-‐ Funcionamiento en detalle del sistema
En este apartado se va a detallar el flujo de navegación de cada una de las operaciones que se pueden realizar y de esta manera comprender mejor su funcionamiento.
6.1.-‐ Estructura de la aplicación
En el presente apartado vamos a ver como se ha organizado la aplicación en directorios según las funciones de cada Servlet, clase java o vista JSP.
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.
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 32
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,
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 33
podemos observar que existe este directorio en el descriptor de despliegue en la configuración de los Servlets.
La función que cumple el directorio admin es almacenar en el mismo las acciones de administración, pero sólo aquellas que se puedan llevar a cabo siendo usuario registrado pero sin permisos de administrador. La entrada a este directorio se comprueba con el filtro AdminFilter definido en el descriptor de despliegue de la aplicación.
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.
También podemos observar el paquete modelo, en el cual se encuentran los beans utilizados en la aplicación. Dentro del mismo encontramos las clases que representan un carrito de la compra, un comentario, un usuario o un producto.
Dentro de paquete control encontramos diferentes Servlets y clases usados para realizar diferentes funciones de la aplicación, será explicada cada uno de ellos en detalle posteriormente.
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.
Por último podemos observar el paquete control.productos, todo lo que hay dentro de este paquete es accesible mediante la ruta /shop que si observamos hay una carpeta que se llama así en las vistas de la aplicación. Todo lo que se encuentra dentro de este directorio hace las funciones necesarias para la compra y todas aquellas acciones a realizar con los productos, eso sí, únicamente aquellas acciones públicas.
Pasemos a ver ahora la estructura organizativa de las vistas de la aplicación. En primer lugar comentar que todas las vistas son páginas dinámicas JSP, no hay contenido estático html.
Como ya hemos visto anteriormente teníamos las carpetas admin y administration, que ya se ha comentado que tipo de funciones agrupaban.
Posteriormente observamos la carpeta css, en la cual podemos encontrar la hoja de estilos de la aplicación, todas las vistas de la aplicación usan esta hoja de estilos. También podemos encontrar dentro de esta carpeta la hoja de estilos que aplicada sobre los formularios a la hora de la validación mediante JavaScript.
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 34
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.
Posteriormente vemos la carpeta products que contiene las imágenes de los productos, cada una de ellas tiene como nombre el código del producto al que pertenece.
Observamos la carpeta stats la cual contiene todas las imágenes referentes a las estadísticas gráficas de la aplicación. Las estadísticas gráficas serán generadas y almacenadas en esta carpeta y serán posteriormente mostradas al usuario.
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.
Después podemos encontrar la carpeta scripts, dentro de la cual podemos encontrar todos los documentos javascript usados en la aplicación.
Dentro de esta carpeta observamos el documento jquery-‐1.6.1.js, que es la librería jquery necesaria para usar otros plugins que se han usado que se verán a continuación.
El documento scripts.js incluye una serie de funciones creadas para no tener que escribirlas directamente en las páginas jsp sino solo tener que llamar a estas funciones. Por ejemplo, podemos encontrar dentro de este documento la función necesaria para cargar el editor de textos tiny-‐mce.
Posteriormente encontramos la carpeta tiny_mce en la que se encuentran todos los elementos del plugin tiny-‐mce.
Finalmente observamos el documento vanadium.js que es el la librería usada para las validaciones de javascript. Este documento ha sido modificado para dar los mensajes en español y también se han modificado algunas de las expresiones regulares de validación y se han añadido otras.
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.
Posteriormente tenemos la carpeta WEB-‐INF, en la cual se encuentran aquellas páginas a las que no deseamos que el usuario llegue directamente, tiene varias
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 35
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 en primer lugar la carpeta admin que contiene la página de logout, a la cual tiene lógica que no se llegue sin realizar esa acción en concreto, también tiene la página de pre-‐visualización de producto que es usada al editar y añadir productos y tiene lógica que solo se llegue a esta página a través de dichas acciones.
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.
Dentro de esta carpeta podemos encontrar el header de la aplicación que contiene el menú superior y la barra superior, también encontramos el footer o pie de página de la misma, observamos también una página llamada resultados que es la encargada de mostrar los resultados de las acciones realizadas y esta es incluida en todas las páginas jsp que esperan recibir mensajes de los resultados de las acciones. Encontramos también en este directorio el menú de la aplicación tanto para la sección de administración como para el resto de las secciones (menu, menuAdministracion). Por último encontramos el módulo de comentarios de la aplicación que será el que es incluido en la página de visualización de producto para que muestre los comentarios de los productos.
Finalmente encontramos un directorio que contiene las páginas de error (paginasError) de la aplicación, a las cuales no se debe llegar salvo que haya ocurrido el error pertinente.
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 36
6.2.-‐ Diagramas de navegación de filtros
En este apartado mostraremos los diagramas de navegación referentes a los filtros para evitar mostrarlos en los diagramas de navegación de todas las acciones por claridad.
Todas las peticiones
LogFilter.java Destino
VB
Java
Guarda registro de
petición
Peticiones dirigidas a /admin/*
LogFilter.java AdminFilter.java
Destino
restricted.jsp
Autentificado
VB
JSPSin
autentificar
VB
Java
VB
Java
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 37
Peticiones dirigidas a /admin/administration/*
LogFilter.java AdminFilter.java
AdministrationFilter.java
restricted.jsp
VB
JSPSin autentificar
Autentificado
Destino
VB
Java
VB
Java
VB
Java
VB
JSP
/admin/index.jsp
Administrador
Usuario registrado
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 38
6.3.-‐ Diagramas de navegación de listeners
En este apartado detallamos los diagramas de navegación para los listeners de la aplicación.
Listener de inicio de contexto
if(conn SELEC WHERE print
StartListener.java
Despliegue de la aplicación
/index.jsp
VB
JSP
VB
Java
RuntimeException
Persistencia cargada
Error inicializando persistencia
Listener de sesión
Sesión caducada o cerrada
if(conn SELEC WHERE print
SaveSessionListener.java
Guarda carrito que no
se ha confirmado
Si es usuario autentificado y tiene carro sin comprar
Destino
Continua el flujo normal de navegación
Si no es usuario registrado; o si lo es pero no tiene carro. Continua el
flujo normal
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 39
6.4.-‐ Flujo de navegación de las operaciones públicas
En este apartado se verá el flujo de navegación de las operaciones que se pueden realizar en la tienda de manera pública.
En estos diagramas podremos ver cuadros en los que pone GET y POST, esto indica las acciones que se realizarán en caso de acceder a los servlets mediante un verbo u otro de los métodos http.
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.
Añadir producto al carrito
Listado de productos <script var a= var xl if(xls
AddCarritoServlet
VB
Java
Añade el producto al carro si corresponde
Caso de error añade un mensaje a la
petición
Error 404
Si el error es formulario
incorrecto o petición POST
/shop/products.jsp
VB
JSP
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 40
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.
Actualizar unidades de un producto en el carrito
Listado de productos en el carrito
/shop/products.jsp
VB
JSPSi la sesión no contiene carrito
<script var a= var xl if(xls
EditAmountServlet
VB
Java
Error 404
Formulario incorrecto
Actualiza el carro si las
comprobaciones son positivas
Si hay error en las comprobaciones se
añade mensaje
/shop/cart.jsp
VB
JSP
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 41
Borrar el carrito de la compra (vaciarlo)
Listado de productos en el carrito
<script var a= var xl if(xls
DeleteCartServlet
VB
Java
/shop/cart.jsp
VB
JSP
Validar carrito de la compra (paso previo a la compra)
Listado de productos en el carrito
/shop/cart.jsp
VB
JSP
<script var a= var xl if(xls
UpdateCartServlet
VB
Java
Listado de productos
VB
JSP
/shop/products.jsp
Si no hay carrito en la sesión
Formulario de venta
Si se han hecho cambios en el
carrito se avisa
/shop/buycart.jsp
VB
JSP
Si no es la operación de venta
definitiva
GET
POST
Error 404
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 42
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.
Por ello se ha implementado el primer Servlet, en el que se realizan esas operaciones (sin editar productos) pero no son sincronizadas y de esta manera
Realizar la compra
Formulario de venta
/shop/buycart.jsp
VB
JSP
<script var a= var xl if(xls
UpdateCartServlet
VB
Java Si se han hecho cambios en el
carrito se avisa
Listado de productos
VB
JSP
/shop/products.jsp
Si no hay carrito en la sesión
<script var a= var xl if(xls
BuyServlet
VB
Java Error 404
GET
POST
Fallos o cambios en el carrito Compra exitosa
Registro de la compra
Enviar Email
Compra realizada
POST
/shop/buyinformation.jsp
VB
JSP
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 43
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.
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
Busqueda
VB
JSP
/shop/products.jsp
<script var a= var xl if(xls
SearchProductServlet
VB
Java GET
Error 404POST
Sin parámetros de vueltaCorrecto
Buscar productos
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 44
Registro de usuarios
Registro
/login.jsp
VB
JSP GET
Error 404
Ante errores hay mensajes
Registro correcto
Nuevo usuario
Enviar email registro
POST
Inicio de sesión
Inicio de sesión
Login
VB
JSP GET
Error 404POST
<script var a= var xl if(xls
AuthServlet
Errores en la autentificación
Autentificación correcta
Inicio de sesión manual
Inicio de sesión después de un error
Inicio
/index.jsp
VB
JavaVB
JSP
Página a la que se intentó acceder y dio error
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 45
Recuperación de contraseña
Inicio de sesión
/login.jsp
VB
JSP
<script var a= var xl if(xls
PassRecoverServlet
GET
Error 404
VB
Java
POST
Error en el proceso
Proceso correcto
Envio email para recuperar la contraseñaActualizar
contraseña
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 46
6.5.-‐ Flujo de navegación para operaciones de usuario registrado
En este apartado se va a detallar el flujo de navegación para las operaciones que pueden realizar los usuarios registrados (no administradores).
Cambio de contraseña
Cambio de contraseña
/admin/preferences.jsp
VB
JSP
<script var a= var xl if(xls
ChangePassServlet
GET
Error 404
POST
Error en el proceso
Proceso completado
Actualizar datos
<script var a= var xl if(xls
LogOutServlet
No se encuentra el usuario de la sesión
/WEB-INF/admin/
logout.jsp
VB
JSP
VB
Java
VB
Java
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 47
Cambiar los datos personales
Cambio de datos personales
<script var a= var xl if(xls
EditUserServlet
/admin/preferences.jsp
VB
JSP
VB
Java
GET
Error 404
POST
Error en el proceso
Proceso completado
Actualizar datos
Añadir comentario al producto
Añadir comentario <script var a= var xl if(xls
AddCommentServlet
VB
Java
VB
JSP
/shop/viewprod.jsp?
prod=
GET
Error 404
POST
Error en el proceso
Proceso completado
Guardar datos
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 48
Cerrar sesión
Cerrar sesión <script var a= var xl if(xls
LogOutServlet
La sesión se cerro por un error
Sesión no iniciada
Cierre normal
/WEB-INF/admin/logout.jsp
/logout
VB
JSP
VB
JSPLogin
Login
VB
JSP
/login.jsp
/index.jsp
VB
JSP
VB
Java
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 49
6.6.-‐ Flujo de navegación de las operaciones del administrador
En este apartado veremos en detalle como es el flujo de las operaciones que puede realizar un usuario de la tienda con permisos de administrador.
Añadir producto al catálogo
1 -----2 -----3 -----
Añadir al catálogo POST<script var a= var xl if(xls
AddProductServlet
VB
JSP
/admin/administration/addproduct.jsp
Error en el transcurso de la
operación
Operación exitosa
Previsualización producto
VB
JSP
/WEB-INF/admin/preview_prod.jsp
Confirmar producto
Editar producto
GET
GET
VB
Java
Guarda producto
Error guardando
Exito guardando
Administración de productos
/admin/administration/products_administration.jsp
VB
JSP
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 50
Editar producto del catálogo
1 -----2 -----3 -----
Editar producto
VB
JSP
/admin/administration/modifyprod.jsp
<script var a= var xl if(xls
EditProductServlet
POST
VB
Java
Administración de productos
/admin/administration/products_administration.jsp
VB
JSP
Errores en la operación
Previsualización producto
VB
JSP
/WEB-INF/admin/preview_prod.jsp
Operación correcta
Confirmar producto
Editar producto
GET
GET
Error guardando
Exito guardando
Guarda producto
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 51
Editar usuario
Editar usuario<script var a= var xl if(xls
EditUserCompleteServlet
POST
GET
Error 404
VB
JSP
/admin/administration/edituser.jsp?user=
VB
Java
Administración de usuarios
Errores Operación completada
Actualizar usuario
VB
JSP
/admin/administration/user_administration.jsp
Borrar usuario
Lista de usuarios
VB
JSP
/admin/administration/user_administration.jsp
<script var a= var xl if(xls
DeleteUserServlet
Error en peticion
Error 404
Borrado correcto
Error en el proceso
Borrar usuario
VB
Java
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 52
Borrar producto
Listado productos
VB
JSP
/admin/administration/products_administration.jsp
Borrar producto
VB
JSP
/admin/administration/delprod.jsp?prod=
Cancelar Confirmar
<script var a= var xl if(xls
DeleteProductServlet
POST
Error 404
GET
Error Exito
Borrar producto
VB
Java
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 53
Editar comentario
Producto
VB
JSP
/shop/viewprod.jsp?prod=
Editar comentario
VB
JSP
Parámetros incorrectos
Parámetros correctos
Error 404
/admin/administration/editcomment?cod=
<script var a= var xl if(xls
EditCommentServlet
Error validación
Correcto
Actualizar comentario
Errores
VB
Java
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 54
Borrar comentario
Producto
VB
JSP
/shop/viewprod.jsp?prod=
<script var a= var xl if(xls
DeleteCommentServlet
Error parámetros
o POST
Error 404
Borrado correcto
Borrado fallido
VB
Java
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 55
6.7.-‐ Sobre el JavaScript que se ha usado
Todo el JavaScript usado en el sistema usan la librería JQuery, cuya principal función consiste en facilitar el acceso al documento HTML, facilitar el manejo de eventos así como en el uso de Ajax.
En primer lugar podemos destacar la librería VanadiumJS que nos ayuda a la validación de formularios mediante JavaScript. Esta librería es capaz de validar campos de los formularios simplemente poniendo la clave correspondiente en el atributo class del campo del formulario y nos da el mensaje de error siguiendo la hoja de estilos que está dentro de la carpeta css.
Mostremos un ejemplo para el formulario de login.
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.
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 56
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.
El código consiste simplemente en que se asigna una función al evento y esa función lo que realiza es el volcado del contenido.
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 57
Otra opción interesante es que se produzca un volcado en el submit del formulario.
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 58
7.-‐ Sistema de control de versiones
Para el desarrollo de este proyecto se ha usado un sistema de control de versiones centralizado, que ha sido subversión. Como repositorio se ha usado Google code.
La URL del proyecto en google code es la siguiente.
http://code.google.com/p/tiendaonlinelpijdyb/
Lo que se encuentra almacenado en el repositorio de google code es un proyecto de NetBeans, el cual se encuentra en la carpeta trunk.
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.
A continuación mostramos los pasos que hemos de seguir para hacer un checkout desde netbeans y así obtener el proyecto completo.
En la siguiente ventana se nos preguntará por la URL del repositorio.
https://tiendaonlinelpijdyb.googlecode.com/svn
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 59
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.
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 60
Podemos acudir al directorio de nuestro equipo donde elegimos guardar el proyecto y comprobaremos que se ha bajado correctamente.
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________
© Jdyb -‐ Mayo 2011 61
8.-‐ Aspectos a mejorar
La usabilidad de la aplicación se ha tratado de hacer lo mejor posible para hacerla lo más amigable posible pero aún así hay aspectos que son mejorables, como puede ser la paginación de los resultados, la apariencia de la página de inicio y la de la página de acerca han sido bastante austeras.
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.
También podría ser interesante la inclusión de más tipos de gráficas en la sección de estadísticas de los administradores para obtener más información sobre el estado y la evolución e la tienda. De la misma forma que estas gráficas podrían ser mejorables en lo que se refiere al aspecto de las mismas. Por ejemplo se podría usar javascript para representar las mismas.
Si esto se tratara de una aplicación real no podríamos usar el tipo de dato double para representar los precios de las cosas debido a que este tipo de dato podría efectuar redondeos o ajustes que no son deseables cuando estamos hablando de dinero. Si en la tienda hubiera descuentos o porcentajes de alguna forma se podrían empezar a observar las consecuencias. Lo que mejor hubiera estado para subsanar este problema sería haber usado la clase de java BigDecimal que tiene una mayor precisión.