Manual Java Ee
Manual Java Ee
MI7
[NOMBRE DE LA EMPRESA] [Dirección de la compañía]
Contenido
¿Cómo funcionan las aplicaciones Java EE?.......................................................... 3
Hola Mundo con JSP ............................................................................................... 4
Java Servlets ........................................................................................................... 5
Java Beans.............................................................................................................. 7
MVC en nuestra aplicación...................................................................................... 8
Archivos War empaquetados y su estructura .......................................................... 9
Asistentes Inteligentes Maven ................................................................................. 9
Gradle ................................................................................................................... 11
Aplicaciones orientadas a presentación vs servicios ............................................. 12
Creando un proyecto de Java que se conecta a la base de datos. ....................... 13
¿Qué es Hibernate? .............................................................................................. 14
Configurando Hibernate en Spring Tool Suite ....................................................... 15
version para intellig ............................................................................................ 16
Integrando Hibernate al proyecto y conectando a la base de datos ...................... 16
Pasos en intellij idea .......................................................................................... 17
Mapeo y Anotaciones con Hibernate JPA ............................................................. 22
Mapeando nuestro proyecto con Hibernate JPA ................................................... 22
Anotaciones básicas en nuestro proyecto ............................................................. 23
Relaciones o Asociaciones en Hibernate [One To One, One To Many y Many to
Many]. ................................................................................................................... 24
Mapeando Relaciones a nuestro proyecto ............................................................ 26
- One to Many - Uno a muchos .......................................................................... 26
- Many to Many - Muchos a muchos .................................................................. 26
Queries a la base de datos usando Hibernate ...................................................... 28
Importante.......................................................................................................... 28
¿Qué es un DAO? ................................................................................................. 28
Manejo de Session en Hibernate .......................................................................... 29
Hql en Hibernate ................................................................................................... 29
Consultas basicas en Hibernate ............................................................................ 30
https://www.mkyong.com/hibernate/hibernate-query-examples-hql/ ..................... 30
¿Qué es un Framework? ....................................................................................... 31
¿Qué es Spring Framework? ................................................................................ 32
Spring Bean Factory .............................................................................................. 35
Composición de Spring, Spring MVC y Spring Boot .............................................. 38
La composición de todo el Spring framework .................................................... 38
La composición de Spring MVC ......................................................................... 39
Spring Boot ........................................................................................................ 39
Integrando Spring al proyecto ............................................................................... 40
Componentes de un proyecto en Spring Boot ....................................................... 41
Capas de nuestra aplicación.............................................................................. 41
Configurando Hibernate con Spring ...................................................................... 43
Configurando DAO's con Spring y Filtros con HQL Hibernate .............................. 44
HQL Hibernate Query Language ....................................................................... 44
Hibernate HQL Joins ............................................................................................. 45
¿Qué es y cómo funciona API Rest? .................................................................... 47
Configurando Service ............................................................................................ 47
Creando Controller API Rest por Entidad .............................................................. 48
Definiendo métodos, Get y Post ............................................................................ 48
Métodos Patch y Delete ........................................................................................ 49
Manejando mensajes de error personalizados ...................................................... 49
Manejando Filtros en REST .................................................................................. 50
Subir imágenes en un api rest ............................................................................... 51
@JsonIgnore ......................................................................................................... 53
¿Cómo funcionan las aplicaciones Java EE?
** COMENTARIO
Un contenedor web es un servidor que se limita solamente a entregar información
solicitada por el cliente (solicitud y entrega) y esta funcion es posible gracias a los
servlets, normalmente el software que se utiliza es Apache Tomcat.
Un servidor de aplicaciones es un servidor dedicado para dar servicio de una
aplicación a una cantidad grande de usuarios (dependiendo de la capacidad de tu
servidor) por medio de la red, todas las operaciones que hagas en la aplicacion
utiliza recursos del servidor y muy pocos de tu ordenador, es como si manejaras
una computadora remota desde tu navegador web, a diferencia de los
contenedores web, el software como WebSphere, GlassFIsh gestiona la seguridad
y el manejo de usuarios de la aplicación cuando acceses a la red a esta aplicación
montada.
JEE nace por la necesidad de aplicaciones distribuidas, es decir que funcione en
entornos separados. Por tanto es necesario que exista un servidor, sobre una red,
de manera que las aplicaciones sean transaccionales.
Existen servidores que son de pago (WebLogic, JBoss, WebSphere) y otros no
(JOnAS, Wildfly, GlassFish, Gerónimo y TomEE). Apache Tomcat se considera
como un contenedor de aplicaciones, trabaja únicamente con Servlets
(Aplicaciones JAVA).
Utilizaremos el IDE Eclipse para hacer nuestro primer Hola Mundo usando JSP.
Iremos al menú File -> New -> Dynamic Web Project
Colocaremos el nombre de nuestro proyecto HolaMundo
Damos click en Finish
Ahora para crear un archivo jsp
Iremos a la carpeta WebContent click derecho New -> JSP File
Colocaremos en nombre de nuestro archivo index.jsp
Damos Next dejamos todo como está y damos click en Finish
Este archivo jsp será nuestra vista en nuestra arquitectura MVC de Java EE.
Un jsp significa Java Server Pages, y está diseñado para crear páginas web
dinámicas
** COMENTARIO
POJO (Plain Old Java Object): Es una instancia de una clase (Objeto) que no
extiende ni implementa nada en especial, sirve para enfatizar el uso de clases
simples y que no dependen de un framework en especial.
Por ejemplo, un Controller de Spring tiene que extender de SimpleFormController,
e implementar los métodos abstractos de ese tipo: por eso, no es un POJO. Un
Servlet, tiene que extender de HttpServlet por lo que tampoco es un POJO. En
cambio, si defines una clase Vehículo con atributos y unas cuantas operaciones,
tienes un POJO.
EJB (Enterprise Java Bean): Simplifica la construcción de soluciones
empresariales y permite el manejo de transacciones, seguridad, persistencia, etc.
JavaBean (Bean): Es una clase simple en Java que cumple con ciertas normas
con los nombres de sus propiedades y métodos. Debe tener:
- un constructor sin argumentos.
Java Servlets
Hemos creado la vista del proyecto nuestro archivo jsp, ahora crearemos un
archivo que controle la visata y el acceso al proyecto, un controlador que aquí lo
conoceremos como Servlet.
Un Servlet es una clase de java con super poderes pues hereda de la clase
HttpServlet a partir de la cual podemos sobreescribir los métodos doGet y
doPost.
Veremos cómo funciona un Servlet en un control de acceso a un sistema, un
Login.
** COMENTARIO
Servlet: Es una clase que hereda métodos de la clase HttpServlet, una vez
heredados tiene la capacidad de manejar cualquier tipo de request, para
identificarlo puedes ubicar dentro del código sus métodos doGet o doPost o
atraves de su anotación (@WebServlet) + el nombre que le quieras dar como
URL.
**
Un Servlet es el controlador y maneja las rutas a través de @WebServlet("/path").
Se trata de una clase que hereda de HttpServlet para tener acceso a los métodos
doGet y doPost.
Java Beans
public LoginBean() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
Para poder utilizar todos los mapeos y configuraciones que hemos hecho al
proyecto es necesario utilizar las siguientes clases:
SessionFactory
Configuration
Session
Ellos nos dan acceso a nuestra base de datos leyendo nuestro archivo de
configuración que tiene los parámetros de conexión y las clases mapeadas que
fungirán como entidades.
Una vez obtenido nuestro objeto session si queremos ejecutar un query en
Hibernate debemos iniciar una transacción, posteriormente declarar el query
y finalmente ejecutar la transacción con commit.
Importante
Es importante tener el archivo .cfg en resources para que puede leerlo la
sesión, además que en el archivo especifiquemos el user y password
¿Qué es un DAO?
Hql en Hibernate
Hql significa Hibernate Query Language el cual es completamente orientado a
objetos.
Si quisieramos ejecutar un query SELECT podemos hacer lo siguiente:
platziSession.getSession().createQuery("from Teacher").list();
Consultas basicas en Hibernate
.setMaxResults(1) = el numero de registros que queremos que
extraiga de la base de datos
https://www.mkyong.com/hibernate/hibernate-query-examples-
hql/
https://docs.jboss.org/hibernate/orm/3.5/reference/es-ES/html/queryhql.html
¿Qué es un Framework?
Librería: conjunto de clases, métodos etc. que son invocadas por el flujo del
programa y que posteriormente devuelven el control a este.
Framework: Un framework controla el flujo del código, él decide cuándo llamar
nuestro código.
Librería - Programación secuencial.
Framework - Programación por eventos.
Inversión de Flujo o de control
Se da cuando el programador deja de tener el control del flujo del código y en su
lugar el framework toma el control del programa, llamando al código cuando
suceda un evento específico.
¿Qué es Spring Framework?
Spring usa inversión de control, específicamente controlará la creación y
destrucción de objetos.
Un programa tradicional de java tendrá en su método main todas las llamadas a
los objetos secuencialmente.
Con Spring framework tendremos las llamadas a los objetos se concentrarán en
un contenedor y de este se encargará Spring.
Podemos decir que la clase A para ser llamada y convertirse en objeto,
depende de la clase Principal (la que contiene el método main) la llame.
Entonces si se implementa el contenedor de Spring en la clase Principal
decimos que Spring está inyectando el objeto A, es decir Spring está
inyectando la dependencia.
Tenemos lo siguiente:
Clase Vehículo - A
Clase Motor - B
En el ejemplo la clase Vehículo inyecta directa y explícitamente la clase Motor, la
clase A inyecta la clase B.
Debemos evitar que la clase B decida qué objetos crear.
La forma de desacoplar esta dependencia directa es creando una clase más
genérica, nos referimos a una interfaz que tenga métodos que puedan ser
implementados en varias clases, esta Interfaz será la indicada a inyectar en
la clase A (Vehículo) pues al ser genérica se puede crear no solo un tipo de
objeto sino varios.
Recuerda que cuando sobreescribimos métodos y le damos diferente
comportamiento a ese comportamiento le llamamos Polimorfismo
Spring Bean Factory
Los objetos que son la columna vertebral de tu aplicación y que son administrados
por el contenedor Spring se denominan beans.
Un bean en Spring será un objeto que tenga consigo un CRUD de acciones
Los DAO’s son Beans, pero usaremos su interfaz pues es el elemento más
abstracto y reutilizable.
También tendremos objetos de servicio y objetos que nos permitan conectarnos
con otras partes del sistema como Bases de Datos.
Cuando nuestra interfaz implementa solo a una clase usaremos la anotación
@Autowired
Cuando la interfaz implementa a varias clases usaremos la anotación
@Configuration y @Bean
Composición de Spring, Spring MVC y Spring Boot
Spring Boot
Va a simplificar toda la configuración de Spring, se encarga del servidor,
seguridad, etc.
Integrando Spring al proyecto
** COMENTARIO
La anotación Bean se maneja solo para aquellos objetos que quieras que se
controlen por el container de Spring. Si necesitas que el ciclo de vida de un objeto
sea administrado por Spring entonces requieres de esta anotación de Bean.
La anotación de Autowired se utiliza para inyectar una instancia de un objeto que
ya se encuentre en el contenedor de Spring. Es decir, un objeto en el que ya
hayas seteado la anotación Bean.
Podríamos decir que la anotación Bean es para almacenar instancas de objetos
en el container y la anotación Autowired es para recuperar instancias de objetos
del container. Claro que esta es información a grajdes razgos, aún hay mucho por
detras que puedes revisar en la documentación de spring 😃
Complementando, la razón por la que en el último metodo se utilizó ambas
anotacioes es por:
En el caso de la anotación Bean, la utilizamos por que necesitamos que la
instancia del objeto hibernateTransactionManager sea almacenada en el
contenedor de Spring
En el caso de la anotación Autowired, la utilizamos por que requerimos recuperar
un objeto del contenedor de spring. Si te fijas para setear el SessionFactory al
objeto hibernateTransactionManager estamos haciendo uso de sessionFactory().
Este objeto sessionFactory ya lo almacenamos en el contenedor (con la anotacion
bean) anteriormente de esta manera:
@Bean public LocalSessionFactoryBean sessionFactory(){}
Los archivos del modelo que teníamos en el proyecto hibernate los copiaremos y
pegaremos en nuestro proyecto ProfesoresPlatzi.
Crearemos nuestro paquete dao y copiaremos la clase TeacherDaoImpl y la
interfaz TeacherDao.
Crearemos una clase abstracta llamada a AbstractSession la cual se encargará de
llamar a la sesión que gestionamos en el archivo de configuración. Estaremos
heredando de esta clase en todos nuestros DAO’s.
HQL Hibernate Query Language
Si queremos ejecutar un SELECT hacemos:
getSession().createQuery("from Teacher").list();
Si queremos ejecutar un UPDATE hacemos:
getSession().update(teacher);
Si queremos encontrar un Teacher a partir de un Id:
getSession().get(Teacher.class, idTeacher);
Si queremos encontrar un Teacher a partir de un nombre:
(Teacher) getSession().createQuery("from Teacher where name =
:name").setParameter("name", name).uniqueResult();
Si queremos ejecutar un DELETE hacemos:
getSession().delete(teacher);
(List<Course>) getSession().createQuery("from Course c join c.teacher t where
t.idTeacher = :idTeacher").setParameter("idTeacher", idTeacher).list();
Para crear Joins en HQL es importante mantener los elementos como objetos con
sus propiedades respectivas.
Por ejemplo, si tienes la clase:
Gato
nombre
color
raza
Si quisieras ejecutar un query debes poner algo como esto:
from Gato g
Por último si quisieras ejecutar un filtro, es decir, obtener los gatitos de esa
persona que se llamen kitty, podríamos hacer algo como:
from Persona p join p.gatitos g where g.nombre = :nombre_gatito
Configurando Service
Ponemos los métodos por que es la capa de lógica del negocio, esos métodos son
los que definen las accines de todo el proyecto para cada objeto, como ves la
siguiente capa es la de Repositorio, la cuál puede significar muchas fuentes de
datos, entonces para guardar un Teacher por ejemplo, el método puede ser
guardar()Service puede coordinar la fuente de datos donde queremos que se
guarde Teacher.
El modelo de negocio es guardar un Teacher, eso lo tiene Service y este puede
llamar al Repositorio que implementa una base de datos o llamar al Repositorio
que implementa guardar Teacher en un archivo o un servidor externo etc. 😃
Debemos de crear una clase con las propiedades que queremos que se muestren
en este caso solo mostramos el mensaje de error;
Manejo del error desde el controller
Aquí depende de qué estés manejando a veces necesitas enviar más de un parámetro cuando
envías datos de un objeto en particular en ese caso puedes usar la anotación
@JsonIgnore
Hola, se le agrega @JsonIgnore a la propiedad teacher de la entidad TeacherSocialMedia,
por que la entidad Teacher tiene la propiedad teacherSocialMedia con el fetch type Eager,
esto quiere decir que cuando pides un teacher te traera sus teacherSocialMedia relacionados
pero la entidad TeacherSocialMedia tambien tiene su propiedad teacher como _Eager _ por
lo que pedira a su teacher relacionado y este a su vez a sus teacherSocialMedia relacionados,
ocasionando un bucle infinito, por lo que se agrega @JsonIgnore para no hacerle get a esa
propiedad.
No se le agrega a la propiedad socialMedia de la entidad TeacherSocialMedia por que la
entidad SocialMedia en su propiedad teacherSocialMedia ya tiene el @JsonIgnore, cortando
con el bucle infinito, TeacherSocialMedia trae los SocialMedia relacionados, pero
SocialMedia no puede traer los TeacherSocialMedia gracias a @JsonIgnore, Es lo mismo
que el anterior solo que este corta el bucle al pedir la entidad SocialMedia
SPRING-JPA-DATA
LINKS
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/
https://docs.spring.io/spring-data/data-
commons/docs/1.6.1.RELEASE/reference/html/repositories.html
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
Conexion a la base de datos
En el archivo de application.properties
spring.datasource.url=jdbc:mysql://localhost/db_springboot?useSSL=false
spring.datasource.username= root
spring.datasource.password=
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.database=mysql
spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect
spring.jpa.hibernate.ddl-auto=create-drop
logging.level.org.hibernate.SQL = debug
Dentro de los archivos HTML debemos incluir la siguien etiqueta para implementar
el motor de plantillas
@Autowired
private ClienteService clienteService;
if (cliente == null) {
return "redirect:/listar";
}
model.put("cliente", cliente);
return "form";
}
// Este metodo es para procesar los datos que nos enviaron desde la vista
@RequestMapping(value = "/form", method = RequestMethod.POST)
public String guardarCliente(@Valid Cliente cliente, BindingResult result, SessionStatus
sessionStatus) {
// @Valid habilita la validacion del objeto mapeado(entity) al form
if (result.hasErrors()) {
return "form";
}
clienteService.saveCliente(cliente);
sessionStatus.setComplete(); // Eliminamos el objeto de la sesion
return "redirect:listar"; // cuando se guarde el cliente, rdegirlo a la vista con la lista de
clientes
}
Href
For each
Tenemos que obtener la lista recibida desde el controlador
If
Texto
Nombre al input
Errores
Class
Noempty
La cadena no venga vacia
Email
Que cumpla con el formato de un Email
NotNull
Temporal
DateTimeFormat
Declaramos
Validaciones personalizadas
Creamos un archivo de properties dentro de la carpeta sources
Services
Se hace con la finalidad de que todo se concentre en un solo lugar y ademas
poder implementar DAOs diferentes