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>