Ejemplo de Programación con Java EE Una Tienda Online - Juan Díez-Yanguas Barber Programación con Java EE 6
←
→
Transcripción del contenido de la página
Si su navegador no muestra la página correctamente, lea el contenido de la página a continuación
Ejemplo de Programación con Java EE Una Tienda Online Juan Díez-‐Yanguas Barber Programación con Java EE 6 © Jdyb -‐ Mayo 2011
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________ Í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 © Jdyb -‐ Mayo 2011 2
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________ 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: jdyb04jdyb@gmail.com © Jdyb -‐ Mayo 2011 3
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________ 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. © Jdyb -‐ Mayo 2011 4
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________ 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. © Jdyb -‐ Mayo 2011 5
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________ 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. © Jdyb -‐ Mayo 2011 6
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________ 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. © Jdyb -‐ Mayo 2011 7
Juan Díez-‐Yanguas Barber Programación con Java EE 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. © Jdyb -‐ Mayo 2011 8
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________ 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. © Jdyb -‐ Mayo 2011 9
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________ 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. © Jdyb -‐ Mayo 2011 10
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________ 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. Base de datos VB Actualizar Objetos Java modelo Acciones del usuario Controlador Usuario Consultas al if(conn SELEC modelo WHERE print Java Servlet Java Seleccionar EE vista Modelos de vista HTML JSP © Jdyb -‐ Mayo 2011 11
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________ 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. © Jdyb -‐ Mayo 2011 12
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________ Modelo de persistencia. Patrón DAO StartListener persistencia.PersistenceFactory private persistence: PersistenceInterface public static PersistenceInterface getInstance (String type) public void contextInitialized(ServletContextEvent sce) public void contextDestroyed(ServletContextEvent sce) private boolean startValidate(ServletContext context) beans.Producto persistencia.PersistenceInterface public boolean init (String locationUser, String persistencia.PersistenceFile persistencia.PersistenceBD beans.Usuario locationProduct); persistence: PersistenceFile instance: PersistenceBD public boolean exit () beans.Comentario fileNameUser: String pool: DataSource public boolean addUser (Usuario user) fileNameProduct: String beans.Carrito productos: Map nameBD: String public boolean addProduct (Producto prod) usuarios: Map
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________ 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 © Jdyb -‐ Mayo 2011 14
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________ (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. © Jdyb -‐ Mayo 2011 15
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________ 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 Producto codigo: String public String getDesc() nombre: String public String getDetalles() precio: double public String getNombre() stock: int public double getPrecio() desc: String public int getStock() detalles:String public String getCodigo() public Producto () public String getDisponibilidad () public Producto(String codigo, String nombre, double precio, int stock) public Producto(String codigo, String nombre, double precio, int stock, String desc, String detalles) © Jdyb -‐ Mayo 2011 16
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________ 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 nombre: String public String getDir() dir: String public String getMail() mail: String public String getNombre() pass: String public String getPass() permisos: char public char getPermisos() public Usuario () public String getPrintablePermissions () public Usuario(String nombre, String dir, String mail, String pass, char permisos) © Jdyb -‐ Mayo 2011 17
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________ 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 codigo: String public Carrito () user: String public Carrito(String codigo, String user) articulos: Map public Carrito(String codigo, String user, double precio) precio: double public Carrito(String codigo, fecha: String String user, double precio, String fecha, String hora, hora: String String formaPago) public boolean editCant formPago: String (String prod, int cantidad, public Map double prodPrice) getArticulos () public void delProduct (String prod) public int getLenght () public String getUser() public double getPrecio () public void setArticulos (Map public String getCodigo() articulos) public void setPrecio public String getHora() (double price public String getFecha() public void setUser(String user) public String getFormaPago () public void removeProd public void addProduct (String prod, double (String newProd, int prodPrice) cantidad, double prodPrice) © Jdyb -‐ Mayo 2011 18
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________ 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 codigoComentario: String public String getEmail() fecha: String public String getCodigoComentario() hora: String public String getCodigoProducto() codigoProducto: String public String getComentario () Email: String public String getFecha() nombre: String public String getHora() comentario: String public String getNombre() public Comentario(String public String getFechaHora codigoComentario, String () fecha, String hora, String codigoProducto, String Email, String nombre, String comentario) © Jdyb -‐ Mayo 2011 19
Juan Díez-‐Yanguas Barber Programación con Java EE Tienda Online _____________________________________________________________________________ 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. © Jdyb -‐ Mayo 2011 20
También puede leer