You are on page 1of 30

Proyecto DAM

Juan Carlos Peña Mera


Descripción:

 Consiste en una aplicación móvil para la gestión de la relación con el


cliente para un restaurante.
 La aplicación permite que el cliente pueda consultar la carta del
restaurante, el menú del día y solicitar una reserva.
 Consta de dos partes, un backend para el restaurante (aplicación web) y
la app Android que usa el cliente.
Tecnologías utilizadas

 Backend web  App Android


 Spring Framework  Retrofit
 Spring Security  ButterKnife
 MySQL  Firebase Cloud Messaging
 Hibernate
 JSP/EL
 Jquery
 BootStrap
SPRING FRAMEWORK
Spring MVC

 Principales características.
 Uso del patrón Modelo-Vista-Controlador
 Inyección de dependencias.
 Acceso a datos y persistencia. (JDBC/ORM)
 Incorpora un módulo para test.

Spring Security
 Principales características.
 Control de acceso basado en JDBC
 Manejo de roles
Funcionamiento de Spring MVC
El flujo básico en una aplicación bajo Spring MVC es el siguiente:

• La petición llega a nuestro DispatcherServlet (1)

• El DispatcherServlet tendrá que encontrar que controlador va a


tratar la petición. Para ello el DispatcherServlet tiene que
encontrar el manejador asociado a la url de la petición. Todo
ésto se realiza en la fase de HandlerMapping (2).

• Una vez encontrado ese Controller, nuestro DispatcherServlet le


dejará gestionar a éste la petición (3). En nuestro controlador se
deberá realizar todo la lógica de negocio de nuestra aplicación,
es decir, aquí llamaremos a nuestra capa de servicios. El
controlador devolverá al Dispatcher un objeto de tipo
ModelAndView (4). ¿Qué quiere decir ésto?. En pocas palabras
Model serán los valores que obtengamos de nuestra capa de
servicio y View será el nombre de la vista en la que queremos
mostrar la información que va contenida dentro de ese Model.

• Una vez pasado este objeto ModelAndView al DispatcherServlet,


será éste el que tendrá que asociar el nombre de la vista
retornada por el controlador a una vista concreta (página jsp, jsf,
…). Este proceso viene indicado en la imagen como ViewResolver
(4).

• Finalmente y una vez resuelta la vista, nuestro DispatcherServlet


tendrá que pasar nuestro Model (los valores recogidos en el
controlador a través de nuestra capa de servicios) a la vista
concreta View (5).
Configuración de Spring
Configuración de Spring MVC
 Se puede configurar con XML o con clases JAVA. (He preferido hacerlo
con clases JAVA)
 La clase de configuración es WebConfig.java, debe anotarse
correctamente para que Spring la reconozca como clase de
configuración.
 Clases de configuración:
 WebConfig.java: Configuración de Spring MVC, se define el VierwResolver, el
DataSource, SessionFactory y TransactionManager entre otros Beans necesarios
para el funcionamiento de Spring
 WebSecurityConfig.java: Se define el método de autenticación y los recursos
que pueden ser accedidos sin autenticación y los que necesitan que el usuario
esté autenticado.
Configuración Spring Security
 Spring Security permite controlar el acceso a la aplicación
 Clase de configuración: WebSecurityConfig
 Se inyecta el DataSource para configurar como método de autencicacion
JDBC
 Por defecto Security crea una página login automática. Para personalizar la
página se puede usar una clase que implemente la interfaz
AuthenticationSuccessHandler .
 El logout también es personalizable con una clase que implemente
LogoutSuccessHandler
Modelo
Modelo de datos.
Hibernate
 Versión 5
 Configurado con
anotaciones.
 Pasos a seguir:
 Crear POJO en la que los
atributos se correspondan
con campos de la base de
datos.
 Anotar la clase con @Entity
para indicar que es una
entidad de Hibernate, los
atributos de clase se anotan
con @Column
 Una vez escritas todas las
clases establecer las
relaciones entre ellas.
Relación Uno a Muchos

 La relación uno a muchos consiste simplemente en que un objeto


padre tenga una lista sin ordenar de otros objetos hijo de forma que al
persistirse el objeto principal también se persista la lista de objetos hijo.
Esta relación también suele llamarse maestro-detalle o padre-hijo.
 Para representa esto en Java, en este caso, la clase Clientes debe
tener un atributo que sea una lista de objetos Dispositivos.
 Para cerrar la relación la clase Dispositivos tiene que tener un atributo
Clientes.
Relación Muchos a Muchos
 La relación muchos a muchos consiste en que un objeto A
tenga una lista de otros objetos B y también que el objeto B
a su vez tenga la lista de objetos A.De forma que al
persistirse cualquier objeto también se persista la lista de
objetos que posee
 No se crea una entidad para la tabla intermedia
 Cada clase tiene que tener un atributo con una lista de
objetos de la otra.
Relación Muchos a Muchos con un
campo adicional en la relación

 Caso particular en la relación Muchos a Muchos


 Se crea la entidad intermedia
 La clase intermedia usa como id una clase cuyos atributos son un objeto
de cada clase, luego con anotaciones se incrusta en la entidad.
Capa DAO/ Capa service

 La capa DAO se encarga de las  La capa Service se encarga de la


operaciones básicas de acceso a lógica de negocio.
datos.
 Se declara una interfaz por servicio.
 Cada tabla de la base de datos se
 Se debe implementar una clase por
considera un DAO.
cada servicio.
 Se declara una interfaz con los
 Se anotan con @Service para
métodos a implementar. Son
indicar a Spring que son
operaciones CRUD
componentes de tipo servicio.
 Luego se implementan en una
 En la implementación los métodos
clase.
que requieran transacciones se
 Las clases de anotan con anotan con @Transactional para
@Repository para indicar a Spring indicar a Spring que debe manejar
que son clases DAO las transacciones.
Controlador
Controlador
 Para que spring lo reconozca como
controlador hay que usar la
anotación @Controller
 Con la anotación @Autowired se
inyectan las dependencias
necesarias
 Con @RequestMapping indicamos a
spring que petición y tipo están
asociadas a cada método.
 @PathVariable y @Param son
anotaciones para indicar que los
parámetros del método son
parámetros o parte de la url.
 Con @ModelAttribute podemos
crear un modelo para pasar a la
vista
Controlador REST

 Para que Spring reconozca la clase


como controlador REST se anota con
@RestController
 Los métodos devuelven un objeto de la
clase ResponseEntity, clase de spring
que modela la respuesta Http con la
que se pueden devolver objetos
serializados y códigos de estado.
Vistas
JSP
 JavaServer Pages (JSP) es una tecnología que ayuda a los desarrolladores de
software a crear páginas web dinámicas basadas en HTML y XML, entre otros
tipos de documentos. JSP es similar a PHP, pero usa el lenguaje de
programación Java.
 Se usan etiquetas para añadir funcionalidad. Hay bibliotecas de etiquetas
(TagLib) estándar y también se pueden crear propias.

Declaración de las etiquetas antes de la etiquetas HTML

Uso de las etiquetas


JQUERY
 jQuery es una biblioteca multiplataforma de JavaScript que permite simplificar
la manera de interactuar con los documentos HTML, manipular el árbol DOM,
manejar eventos, desarrollar animaciones y agregar interacción con la técnica
AJAX a páginas web.
 Jquery Validate. Plug in para Jquery que permite realizar validaciones de
formularios.
 Jquery.UI. Biblioteca de componentes para Jquery, la he usado para el
componente DatePicker en las vistas en las que es necesario seleccionar una
fecha.
Test
Configuración de los Test
 WebTestConfig -> Clase de configuración para los test
 Igual que WebConfig pero sustituyendo DataSource por uno con base de
datos H2
 En /src/main/resources hay un fichero create.sql con la estructura de la
base de datos y import.sql con datos de prueba.

Test unitarios
 Se realizan test unitarios de la capa DAO usando JUnit y algunos test de
servicios usando Mockito.

Test Integración
 Se realizan test de integración de controladores
Aplicación Android
Modelo

 En el modelo se encuentran las clases POJO necesarias para intercambiar


datos con el servicio REST
 Están generadas a partir de la salida JSON que da el servicio con la utilidad
jsonschema2pojo
 La clase Plato implementa la interfaz Parcelable para poder pasarlo como
parámetro al fragment CartaDetalle.
A
c

Controlador t
i
v
i
LoginCliente RecordarContrasena Principal RegistroActivity t
y

LoginClienteFragment RecordarContrasenaFragment RegistroActivityFragment

F
r
a
CartaFragment MenuFragment NotificacionesFragment ReservasFragment g
m
e
n
TabsFragment CartaDetalleFragment CrearNotificacionesFragment DatePickerFragment CrearReservaFragment t
s
Controlador I

 Las vistas se inyectan con ButterKnife


 El acceso al servicio REST se hace a través de Retrofit una librería que
permite configurar un cliente REST para Android.
 Para presentar los datos en las vistas que necesitan algún tipo de lista
(Menu, carta, notificaciones) se usa el componente RecyclerView que en
el controlador una un Adapter que es el que se encarga de obtener datos
del modelo.
Vistas
 Archivos XML
 Para el diseño he usado ConstraintLayout
 Para los datos que hay que presentar en forma de lista he usado
RecyclerView

Constraint Layout RecyclerView + CardView RecyclerView Tabs + RecyclerView


Bibliografía
 Curso de Hibernate con Spring [Curso Hibernate]
 Desarrollando una aplicación Spring Framework MVC v4 + JPA paso a paso
 Hibernate Many-to-Many Association with Extra Columns in Join Table Example
 Retrofit — Synchronous and Asynchronous Requests
 Consumiendo una API con Retrofit 2 en Android – devStories
 GitHub - Raudius/Pushraven: A simple Java library to interface with Firebase
Cloud Messaging (FCM) API. Pushraven allows you to push notifications to clients
in very few lines of code.
 JUnit Testing Spring Service and DAO (with In-Memory Database) | Java Code
Geeks - 2018
 https://stackoverflow.com/