Plataforma Java EE / Jakarta EE
Java EE (Java Platform, Enterprise Edition) es la extensión de la plataforma Java orientada al desarrollo de aplicaciones empresariales: aplicaciones web grandes, escalables, confiables y seguras. Se diferencia de J2SE/Java SE (Standard Edition), que es la plataforma para aplicaciones de escritorio: J2EE es una plataforma para aplicaciones empresariales, mientras que J2SE es una plataforma para aplicaciones de escritorio. La sigla "EE" significa Enterprise Edition.
Al pasar de un sistema monolítico a uno más modular, Java EE ayuda a evitar la escritura de código adicional y reduce significativamente el coste y la complejidad, delegando en el contenedor los servicios transversales (transacciones, seguridad, concurrencia). El principal desafío de las empresas en entornos de TI distribuidos es permitir que las aplicaciones se conecten y comuniquen independientemente de su ubicación, idioma u otras características.
Del control de Oracle a la Eclipse Foundation
Oracle transfirió Java EE a la Eclipse Foundation (proceso anunciado el 24-25 de abril de 2018), donde pasó a llamarse Jakarta EE. Por tanto es FALSA la afirmación de que "desde el 24 de abril de 2018 Java EE es gestionado por Oracle": desde esa fecha ya NO lo gestiona Oracle sino Eclipse. Jakarta EE 8 y Java EE 8 son compatibles (mismo conjunto de APIs, con javax.*; el renombrado a jakarta.* llega en Jakarta EE 9). La ventaja de Jakarta EE frente a Java EE es que permite releases más frecuentes, y admite tanto microservicios como aplicaciones monolíticas tradicionales. No obstante, Oracle mantiene la propiedad de Java como lenguaje y de Java EE como extensión.
JVM, bytecode y compilador JIT
El código fuente Java se compila a bytecode, el formato intermedio de instrucciones que la máquina virtual Java (JVM) espera recibir. El bytecode es lo que permite que Java sea multiplataforma ("write once, run anywhere"). En ejecución, el componente JIT (Just-In-Time Compiler) compila el bytecode a código máquina en tiempo de ejecución. Es FALSO que la JVM permita la manipulación directa de punteros (Java no expone aritmética de punteros).
Arquitectura en capas J2EE
Una aplicación J2EE se estructura en capas, con el objetivo de permitir cambios internos en una capa sin afectar a las otras. El lenguaje de programación NO es un factor que influya necesariamente en la arquitectura básica. Capas típicas:
-
Cliente y presentación: clientes web o de escritorio; en la presentación se usan Servlets y páginas JSP. La capa de cliente y los sistemas externos se consideran factores externos a la aplicación.
-
Negocio: lógica de dominio, implementada típicamente con EJBs.
-
Integración o acceso a datos: permite la comunicación con los sistemas donde se almacenan los datos.
Si se añade acceso mediante cliente Swing además del web, la capa que NO debería requerir modificaciones es la de negocio. Un cliente Swing puede requerir RMI, lo que hace conveniente usar EJBs. Con EJBs remotos distintos tipos de cliente comparten la misma capa de negocio (arquitectura distribuida); los EJBs locales aportan menor sobrecarga en las comunicaciones.
EJB, servlets, JSP y contenedores
-
Un EJB (Enterprise JavaBean) es un componente para construir componentes empresariales distribuidos. El contenedor de EJB proporciona un entorno de ejecución para estos componentes. Un servidor de aplicaciones aporta servicios de middleware e infraestructura de ejecución.
-
Un Servlet es un componente web de Java que se ejecuta en un servidor, una clase que amplía las capacidades del servidor. Se implementa extendiendo
javax.servlet.http.HttpServlet. Un servlet se ejecuta en el lado del servidor (un applet, en el cliente). Métodos:doGet()procesa peticiones GET;doPost(), peticiones POST;service()procesa todas las solicitudes entrantes;getParameter()obtiene parámetros;getServletContext()obtiene elServletContext. -
Objetos HTTP:
HttpServletRequest(petición),HttpServletResponse(respuesta),HttpSession(sesión). El métodoinvalidate()deHttpSessioninvalida la sesión y desvincula los objetos ligados a ella. Buena práctica: no almacenar información excesiva en la sesión ni reutilizar elHttpSessionfuera de cada servlet/JSP. -
Un JSP sirve para generar contenido dinámico en un sitio web.
Servicios web y mensajería
-
SOAP es un protocolo estándar que define cómo dos objetos en procesos distintos se comunican mediante intercambio de datos XML; se usa típicamente en lugar de RMI cuando se exponen servicios web (con menor eficiencia en la comunicación como desventaja).
-
JAX-WS = Java API for XML Web Services, para crear servicios web (SOAP).
-
JAX-RS = Java API for RESTful Web Services, da soporte a servicios web REST (en Jakarta se denomina Jakarta RESTful Web Services).
-
Apache ActiveMQ es un bróker de mensajería de código abierto que implementa Java Message Service (JMS) 1.1. Se usa junto a Apache ServiceMix, Apache Camel y Apache CXF. Ofrece características empresariales como clustering y múltiples almacenes de mensajes. Hay dos versiones disponibles: ActiveMQ Classic y el bróker de nueva generación Artemis.
APIs y paquetes de la plataforma
| API / Paquete | Función |
|---|---|
javax.ejb | Clases e interfaces de Enterprise JavaBeans |
javax.json.stream | API de transmisión para analizar/generar JSON (JsonGenerator, JsonGeneratorFactory, JsonLocation, JsonParser, JsonParserFactory) |
javax.batch.operations | Iniciar, administrar y ver resultados de trabajos Batch |
jakarta.enterprise.concurrent | Programación concurrente |
| JNDI | Servicios de directorio |
| StAX | Procesamiento de documentos XML (streaming) |
| XML binding | Asignar componentes de un documento XML a objetos en memoria |
Especificaciones nuevas en Java EE 8: Servlet 4.0 (JSR 369) añade soporte para HTTP/2; CDI 2.0 (JSR 365) añade sucesos asíncronos, ordenación de observadores, SPI de configuración, literales de anotación e interceptores en productores; JSON-B 1.0 (JSR 367) clasifica objetos Java a texto JSON y viceversa.
El lenguaje Java (nivel C1)
-
Herencia: Java soporta herencia simple y polimorfismo; no soporta herencia múltiple de clases (una clase concreta solo tiene una clase padre).
extendsdefine que una clase hereda de otra;implementsdefine una o varias interfaces. Una clase concreta sí puede heredar de una abstracta. -
Clases abstractas: no se pueden instanciar, sirven de plantilla para subclases, pueden estar implementadas de forma incompleta, sí pueden tener constructores e implementar interfaces.
-
Modificadores de acceso (de más restrictivo a más permisivo):
private< package-private (por defecto, "ninguno") <protected(mismo paquete y subclases en cualquier paquete) <public. El acceso por defecto de un método es ninguno de los anteriores (package-private). -
switch: su expresión debe generarchar,byte,shortoint(yString/enum); no puede serbooleano.switchequivale aifanidados, no repite instrucciones (eso es un bucle). -
Paquetes: agrupan clases e interfaces en un espacio de nombres, facilitando organizarlas. Se importan con
import java.util.*;. Palabras reservadas:finally,interface,short,public,break,default,enum,native,strictfp,assert,boolean,return,this, etc. -
Colecciones y Streams:
HashMapalmacena pares clave-valor;Iteratorestá enjava.util.Stream(Java 8) permite operaciones masivas secuenciales o paralelas (map/reduce).Optional<T>evitanull. -
Clases de E/S y sistema:
File(archivo),Socket(conexión TCP),ByteArrayInputStream(entrada de bytes en memoria),ObjectInputStream(leer objetos serializados),StringWriter(generar cadenas),Process(procesos del SO),Runnable(plantilla de threads),java.math(tratamiento numérico). -
Pruebas: JUnit es un conjunto de bibliotecas para pruebas unitarias; permite crear tests de clases Java (no compila clases).
Fuentes
-
Oracle — Java EE 8: https://www.oracle.com/java/technologies/java-ee-8.html
-
Eclipse Foundation — Jakarta Servlet 4.0: https://jakarta.ee/specifications/servlet/4.0/
-
Java EE Platform Specification (JSR 366): https://javaee.github.io/javaee-spec/Specifications
-
Jakarta EE (Eclipse Foundation): https://jakarta.ee/
-
Apache ActiveMQ (proyecto oficial): https://activemq.apache.org/
-
Wikipedia — Apache ActiveMQ (JMS 1.1, Artemis): https://en.wikipedia.org/wiki/Apache_ActiveMQ
-
Oracle — Java Platform, Enterprise Edition overview: https://www.oracle.com/java/technologies/java-ee-glance.html