Jakarta EE Flashcards
J2EE - JEE - Jakarta EE
Qué es Jakarta EE
Conjunto de especificaciones que extienden Java SE. Lo soporta la Eclipse Foundation.
Objetivo: Crear aplicaciones empresariales, web y multisuario en lenguaje Java
Objetivo Secundario: Dedicate a lo tuyo
Que son los JVM Languages. Ejemplos
Lenguajes “java friendly” que se programan en su sintaxis pero se compilan a .class y se ejecutan en le JRE
- Java
- Kotlin
- Scala
- Groovy
- Clojure
Perfiles Jakarta
- Core Profile: lo minimo indispensable
- Web Profile: todos los componentes para el desarrollo de una aplicación web
- Full Profile / Jakarta entreprise: todos los componentes de la especificación
- Microprofile: No pertenece a jakarta pero lo integra (Core Profile). Componentes para realizar aplicaciones con microservicios.
Componentes Jakarta EE: Capa de presentacion
- JSP: html + < % codigo java% > + objetos predefinidos. Código incrustado.
- JSTL: html + taglib presonalizados. Ej.: < report>. Código separado del fichero html.
- JSF: tags UI predefinidos. Ej: < database> Etiquetas orientadas solo a clase de presentación sin mezclar negocio.
- Servlets / Filters: Capa de control
Componentes Jakarta EE: Capa de Negocio
- API EJB (Enterprise JavaBeans)
- EJB Sesion (Logica de negocio). Con y sin estado.
- EJB MDB (Logica de negocio async). Listener, reciben mensajes de una cola
- Web Services (SOAP y REST).
Componentes Jakarta EE: Servicios definidos App Server
Antiguamente nos apoyabamos en frameworks para dar la funcionalidad que faltaba en JEE. Pero las últimas versiones han aumentado los servicios haciendo una especificación mucho más completa.
- JTA (Servicio de transacciones)
- JNDI (Servicio de nombres – Arbol de objetos). Objetos que se crean automaticamente y que siempre tenemos disponibles. Ya no se hace new
- JPA (Servicio de persistencia – ORM)
- JMS (Servicio de colas de mensajes)
- JSON-P (Servicio para documentos JSON. bajo nivel) JSON-B (Alto nivel)
- CDI (Servicio de inyección de dependencias)
- Jakarta MVC
- Jakarta NoSQL
Productos que implementan la especificación Jakarta EE
- JBoss
- WildFly
- Payara
- Weblogic
- Open Liberty -> sin volverse loco
- WebSphere Liberty
- Eclipse GlassFish
- Apache TomEE
Servicio JTA
Java Transaction Api
Servicio de transacciones distribuidas.
UserTransaction –> begin, commit, rollback
jakarta.transaction.UserTransaction
TP: Transaction Processor. Tiene la inteligencia para mantener la transacción en entornos distintos. Ej.: se hace una operación que guarda parte en Oracle y parte en DB2, pero necesitamos asegurar que la información estará en las dos BBDD o en ninguna, en este caso el que gestiona que se mantenga esa consistencia es el TP.
import javax.transaction.*; public class JtaExample { public static void main(String[] args) { try { // Get the UserTransaction object UserTransaction utx = (UserTransaction) new InitialContext().lookup("java:comp/UserTransaction"); // Begin the transaction utx.begin(); // Perform some transactional operations // For example, update data in a database // ... // ... // Commit the transaction utx.commit(); System.out.println("Transaction committed successfully."); } catch (Exception e) { // Handle exception and rollback the transaction if necessary e.printStackTrace(); try { utx.rollback(); System.out.println("Transaction rolled back."); } catch (Exception ex) { ex.printStackTrace(); } } } }
Servicio JNDI
Java Naming and Directory Interface
Servicio de directorio.
InitialContext (método lookup(String) / bind(String, Object))
javax.naming.InitialContext
import javax.transaction.*; public class JtaExample { public static void main(String[] args) { try { // Get the UserTransaction object /*********************/ UserTransaction utx = (UserTransaction) new InitialContext().lookup("java:comp/UserTransaction"); /*********************/ // Begin the transaction utx.begin(); // Perform some transactional operations // For example, update data in a database // ... // ... // Commit the transaction utx.commit(); System.out.println("Transaction committed successfully."); } catch (Exception e) { // Handle exception and rollback the transaction if necessary e.printStackTrace(); try { utx.rollback(); System.out.println("Transaction rolled back."); } catch (Exception ex) { ex.printStackTrace(); } } } }
Servicio JDBC
Java DataBase Connectivity
Servicio de persistencia de bajo nivel
Driver / DataSource
Connection
Statement / PreparedStatement / CallableStatement
ResultSet
-
java.sql.Driver.
- Connection
- Statement
- PreparedStatement
- CallableStatement
- ResultSet
- javax.sql.dataSource
Servicio JMS
Java Message Service
Servicio de mensajería (colas)
COLA: Relacion 1:1, un emisor y un receptor
TOPIC: Relacion 1:N, un emisor, n receptores
MessageListener (onMessage(Message))
Queue / Topic
Session (createProducer(Destination),createMessage())
jakarta.jms
Servicio JPA IMPORTANTE
Java Persistent API
Servicio de persistencia de alto nivel (ORM - Object Relational Mapping)
EntityManager (métodos persist(), find(), delete())
@Entity / @Table / @Id / @Column / @OneToMany / @OneToOne / @ManyToMany
jakarta.persistence.EntityManager
Servicio JAX-WS
Java API for XML Web Services
Web Services SOAP
@WebService / @WebMethod / @WebParam
jakarta.xml.ws
javax.jws / jakarta.jws
package ee.jakarta.tutorial.helloservice; import jakarta.jws.WebService; import jakarta.jws.WebMethod; @WebService public class Hello { private final String message = "Hello, "; public Hello() { } @WebMethod public String sayHello(String name) { return message + name + "."; } }
Servicio JAX-RS
Java API for RESTful Web Services
Web Services REST
@Path / @GET / @POST
jakarta.ws.rs
@Path("/hello") public class HelloResource { @GET public String sayHello() { return "Hello World"; } @POST @Produces(MediaType.TEXT_PLAIN) @Consumes(MediaType.APPLICATION_JSON) public String handlePersonRequest(Person person) { return person.toString(); } }
Servicio CDI
Contexts and Dependency Injection
Inyeccion de dependencias
@Inject / @RequestScoped / @Named
jakarta.enterprise.context
NOTA: @Autowired
Ciclo de vida de un Servlet
Ojo!!! el servlet es un interfaz genérico, no asociado en exclusiva a peticiones http. Su ciclo de vida son estos tres métodos:
- init(config)
- service(req, res)
- destroy()
Métodos HttpServlet
Métodos HttpServletRequest
Métodos HttpServletResponse
Flujo de aplicación web
- req, res –> se crean continuamente por cada petición (junto con su Thread correspondiente)
- HttpSesión –> se crea por cada usuario conectado (cookie JSESSIONID)
- Servlet / Filter –> se crea un objeto de cada clase al inicio de la app
- ServletContext –> se crea un objeto global compartido por todos los servlets
- Pool de threads (hilos) –> No se crean hilos por cada petición, sino que existe un pool y se van usando. Cuando ya no quedan libre la petición quedara en espera (wait)
Empaquetado de una app Jakarta EE
- Parte Web: .war (web container: servlet, filtros, jsp, jspf)
- Parte EJB: .jar (EJB container)
- Empaquetado completo war + jar: .ear
web.xml
Fichero de configuración de los .war
<web-app> <filter> <filter-name> SecurityFilter </filter-name> <filter-class>com.jee.filter.SecurityFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <!-- Se aplica el filtro a todo el mundo--> <filter-mapping> <filter-name> SecurityFilter </filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- Indicamos la url y la clase que lo va a tratar--> <servlet> <servlet-name>AltaEmpleadoServlet</servlet-name> <servlet-class>com.jee.servlet.AltaEmpleadoServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name> AltaEmpleadoServlet </servlet-name> <url-pattern>/altaEmpleado</url-pattern> </servlet-mapping> <!-- Reglas de seguridad simple por perfil de usuario--> <security-constraint> <web-resource-collection> <web-resource-name>admin</web-resource-name> <url-pattern>/admin/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>ADMIN</role-name> </auth-constraint> <user-data-constraint> <transport-guarantee>NONE</transport-guarantee> </user-data-constraint> </security-constraint> <login-config> <auth-method>FORM</auth-method> <form-login-config> <form-login-page>/logon.jsp</form-login-page> </form-login-config> </login-config> <error-page> <error-code>500</error-code> <location>/errors/servererror.jsp</location> </error-page> <session-config> <session-timeout>-1</session-timeout> </session-config> </web-app>
Cómo se compone un .war
- html/css/jsp (componentes estáticos)
- Directorio WEB-INF:
- classes*.class
- lib*.jar (librerías de terceros)
- web.xml (mapeado de url a las clases java)
ejb-jar.xml
Fichero de configuración de los .jar de EJB’s
<ejb-jar> <session> <session-type>Stateless</session-type> <transaction-type>Container</transaction-type> <ejb-class></ejb-class> </session> </ejb-jar>
Cómo se compone un .jar de ejb
- Directorio META-INF\ejb-jar.xml
- *.class
application.xml
Ficerho de configuracion de los .ear
<module> <web> <web-uri> admin.war </web-uri> <context-root>administracion</context-root> </web> <ejb> calculos.jar </ejb> ….
Cómo se compone un .ear
- application.xml
- .war
- .jar (ejb’s)
Métodos principales del EntityManager (JPA)
jakarta.persistence
- persist(obj) –> almacenar nuevas entidades en la BBDD
- contains(obj) –> comprueba si una entidad está “manejada” por el EM
- find(pk) –> localizar una entidad a través de un clave primaria
- flush() –> provoca que los cambios pendientes del EM se sincronicen en la BBDD
- merge(obj) –> convierte una entidad “no manejada” por el EM en “manejada”
- remove(ojb) –> eliminar una entidad de la BBDD
Ej.:
@Inject EntityManager em; //Creal el SQL, lo lanza contra la BBDD y crea el obj //factura 'f' con el resultado Factura f = em.find("1234");
Anotaciones de una entidad (JPA)
jakarta.persistence
- @Entity –> identifica a la clase como una “entidad”
- @Id –> Clave primaria
- @Table –> Para elegir la tabla donde guardar el objeto
- @Column –> Para elegir la columna donde guardar un atributo
- @OneToMany –> Para especificar relaciones 1:N con otras clases
- @Transient –> Indica que ese atributo no hay que guardarlo
- @NamedQuery –> Para especificar consultas JPQL con nombre
- @Query(value=”código SQL”, nativeQuery=true) Código SQL a pincho
Ej.:
@Entity @Table("FACT") public class Factura{ @id //Identificador de la tabla String id; @Column("FECHA_FACT") //Columna en BBDD que corresponde Date fechaFactura }
@OneToMany / @OneToOne
NOTA: Las relaciones @OneToOne, @OneToMany son por defecto de tipo FetchType.LAZY, quiere decir, que no se van a cargar esos objetos relacionados hasta que no haga falta. Fetch.LAZY / Fetch.EAGER
/** * @ManyToOne(targetEntity="Cart", cascade={"all"}, fetch="EAGER") */ /** * @ManyToOne(targetEntity="Cart", cascade={"all"}, fetch="LAZY") */
Ej.:
@Entity @Table("PAG") public class Pagos{ .... } .... @Entity @Table("FACT") public class Factura{ @id //Identificador de la tabla String id; @Column("FECHA_FACT") //Columna en BBDD que corresponde Date fechaFactura //Obtenemos todos los pagos de la facutura cuando //pidamos la 'factura @OneToMany List<Pagos> pagos; }
Providers JPA
- Hibernate
- EclipseLink
- DataNucleus
- OpenJPA
Estructura de la arquitectura JPA
En nuestra aplicación Java, ¿qué paquetes usaríamos para establecer la conexión a la base de datos de NOTIFICACION?
a) java.database
b) javax.naming y javax.sql
c) javax.io y javax.serviet
d) javax.serviet
b) javax.naming y javax.sql
Se quiere desarrollar un microservicio para que el personal funcionario pueda consultar el estado de una notificación enviada. ¿Qué especificación de la comunidad, alineada con Jakarta EE Core Profile, es la indicada para desarrollarlo?
a) Jakarta Authentication
b) Jakarta Batch
c) Microprofile
d) Jakarta Connectors
c) Microprofile
En JAVA podemos utilizar el interface PreparedStatement para:
a) Inicializar las variables locales del programa con valores preestablecidos.
b) Preparar los valores que introduciremos en un archivo de texto externo al programa.
c) Permitir ejecutar muchas veces una sentencia SQL.
d) Administrar el consumo de memoria que utilizan los objetos creados.
c) Permitir ejecutar muchas veces una sentencia SQL.
En el contexto de Java EE (ahora Jakarta EE), ¿en qué paquete se encuentran las clases e interfaces de Enterprise JavaBeans?
a) java.ejb2
b) javax.ejb
c) javax.persistence.ejb
d) java.transaction.ejb
b) javax.ejb
jakarta.ejb
Spring Boot es:
a) Una plataforma de desarrollo móvil basada en Javascript que permite desarrollo de apps muliplataforma.
b) Una plataforma que permite el desarrollo de aplicaciones web “autocontenidas” que llevan embebido el contenedor de serviets.
c) Una plataforma que permite, entre otras cosas, la conexión lógica entre bases de datos relacionales clásicas y bases de datos NOSQL.
d) Una plataforma que permite automatizar las pruebas de software para aplicaciones con lenguaje de programación JAVA.
b) Una plataforma que permite el desarrollo de aplicaciones web “autocontenidas” que llevan embebido el contenedor de serviets.
¿Cuál de los siguientes NO es un ORM (Mapeador Objeto-Relacional)?
a) ADO.NET Entity Framework
b) Ruby Hibernation
c) NHibernate
d) Hibernate
b) Ruby Hibernation
Para la construcción de servicios web en Java podría usar la API Java denominada:
a) JPA
b) Java DOM
c) SOAP
d) JAX-WS
d) JAX-WS
¿Cual es la clase principal que se usa para acceder a un arbol JNDI?
clase InitialContext –> javax.naming
Metodos:
- Object lookup(String etiqueta) –> Buscar en el árbol
- void bind(Name name, Object obj) –> para registrar un objeto en el árbol
NOTA: Los componentes/objetos que se registran en el árbol automaticamente, o bien por configuración del server, o bien por configuración de la aplicación web, serian:
- Datasources (pool de conexiones)
- EJB’s
- JavaMail
- JMS (colas / topics)
- JTA (user transaction)
¿Qué tipos de EJB’s existen?
- Tipo Sesión (@Statefull o @Stateless). Desde 3.1 EJB @Singleton
- Tipo MDB (Receptores de mensajes)
NOTA: De un EJB el servidor crea un pool de instancias. En el caso de Singleton solo tenemos UNA instancia
¿Cuál es la utilidad del interface Datasource? ¿Cómo se utiliza el contexto de un servidor JEE?
- Crear/Definir un objeto que representa un pool de conexiones. NOTA: Su método más importantes es getConnection()
- Tenemos que ir al árbol JNDI a por el (lookup). Se configura por un admin en la consola del servidor
¿Cual es la anotacion que se usa para definir una entidad JPA?
@Entity
NOTA: otras anotaciones–> @Table, @Column, @OneToMany, @Id, @Transient
En JAX-RS, ¿qué anotacion se utiliza para especificar la URL base de un recurso REST?
@Path
¿Cuál de las siguientes es una especificación Java EE para trabajar con colas de mensajes?
API JMS
¿Cuál es el interface principal para acceder a las funcionalidades de JPA?
Interface EntityManager (jakarta.persistence)
NOTA: métodos importantes–>
- persist
- find
- merge
- remove
¿Qué tipo de bean de EJB se recomienda para gestionar datos compartidos entre multiples usuarios?
@Singleton –> es un subtipo nuevo de EJB de tipo sesion
¿Qué tecnologíaJava EE proporciona una interfaz para desarrollar vistas web basadas en componentes?
JavaServerFaces (API JSF)
Implementaciones típicas de JSF –> PrimeFaces, ICE Faces, ZK
¿Cuál de las siguientes anotaciones de JPA se usa para especifcar una clave primaria generada automaticamente?
@GeneratedValue(strategy=SEQUENCE, generator=”CUST_SEQ”), especificamos que es valor automatico y con esa secuencia.
NOTA: Con @Id especificamos que el atributo es clave primaria
NOTA: El objeto CUST_SEQ se ha tenido que crear en BBDD con el comando SQL –> CREATE SEQUENCE CUST_SEQ ……