Java
Tutorial Java: Ecosistema Jakarta EE de Java
Descubre el ecosistema Jakarta EE, su evolución, especificaciones clave y cómo desarrollar aplicaciones empresariales robustas con Java.
Aprende Java y certifícateQué es Jakarta EE
Jakarta EE (Enterprise Edition) es una plataforma de desarrollo de aplicaciones empresariales basada en Java que proporciona un conjunto de especificaciones, APIs y tecnologías para crear aplicaciones distribuidas, escalables y robustas. Anteriormente conocida como Java EE (Java Enterprise Edition), esta plataforma cambió su nombre en 2019 cuando Oracle transfirió la tecnología a la Fundación Eclipse.
Esta plataforma extiende las capacidades del Java SE (Standard Edition) añadiendo características específicas para entornos empresariales donde se requiere alta disponibilidad, seguridad, escalabilidad y procesamiento de transacciones. Jakarta EE está diseñada para simplificar el desarrollo de aplicaciones complejas mediante la implementación de componentes modulares que pueden desplegarse en servidores de aplicaciones compatibles.
La arquitectura de Jakarta EE se basa en un modelo de múltiples capas que típicamente incluye:
- Capa de cliente: Interfaces de usuario (navegadores web, aplicaciones de escritorio)
- Capa web: Componentes que manejan la interacción con los clientes
- Capa de negocio: Lógica de la aplicación
- Capa de datos: Interacción con bases de datos y sistemas de almacenamiento
Una de las principales ventajas de Jakarta EE es que proporciona un conjunto estandarizado de APIs que permiten a los desarrolladores crear aplicaciones portables entre diferentes servidores de aplicaciones compatibles como Payara, WildFly, TomEE o GlassFish, entre otros.
Evolución de Java EE a Jakarta EE
La transición de Java EE a Jakarta EE representa un hito importante en la historia de esta plataforma. Este cambio no fue simplemente un renombramiento, sino una transformación en el modelo de gobernanza de la tecnología:
- Java EE (1999-2019): Desarrollada y controlada por Sun Microsystems y posteriormente por Oracle.
- Jakarta EE (2019-presente): Gestionada por la Fundación Eclipse bajo un modelo de código abierto con participación comunitaria.
Esta transición ha permitido una evolución más ágil y colaborativa de la plataforma, con ciclos de lanzamiento más frecuentes y mayor participación de la comunidad en la toma de decisiones. Las versiones recientes de Jakarta EE han introducido mejoras significativas en términos de soporte para microservicios, integración con tecnologías modernas y simplificación de APIs.
Especificaciones principales
Jakarta EE está compuesta por más de 40 especificaciones diferentes que cubren diversos aspectos del desarrollo empresarial. Algunas de las más importantes incluyen:
- Jakarta Persistence (JPA): Para el mapeo objeto-relacional y la gestión de datos persistentes.
- Jakarta Servlets: Proporciona un mecanismo para extender las capacidades de los servidores web.
- Jakarta Enterprise Beans (EJB): Componentes del lado del servidor para encapsular la lógica de negocio.
- Jakarta RESTful Web Services (JAX-RS): Para crear servicios web RESTful.
- Jakarta Contexts and Dependency Injection (CDI): Sistema de inyección de dependencias.
- Jakarta Server Faces (JSF): Framework para interfaces de usuario basadas en componentes.
- Jakarta Bean Validation: Para la validación de datos mediante anotaciones.
- Jakarta Security: Proporciona autenticación y autorización.
- Jakarta Messaging (JMS): Para la comunicación asíncrona entre componentes.
Casos de uso comunes
Jakarta EE es especialmente adecuada para ciertos tipos de aplicaciones empresariales:
- Sistemas bancarios y financieros que requieren alta seguridad y procesamiento de transacciones.
- Aplicaciones gubernamentales con necesidades de integración de sistemas heredados.
- Plataformas de comercio electrónico que necesitan escalabilidad y fiabilidad.
- Sistemas de gestión empresarial como ERP (Enterprise Resource Planning) o CRM (Customer Relationship Management).
- Aplicaciones B2B (Business-to-Business) que requieren integración con múltiples sistemas.
Tendencias actuales
En los últimos años, Jakarta EE ha evolucionado para adaptarse a las tendencias modernas de desarrollo:
- Soporte para microservicios a través de perfiles más ligeros como Jakarta EE Platform.
- Integración con tecnologías cloud-native y contenedores como Docker y Kubernetes.
- Simplificación de APIs para reducir la curva de aprendizaje.
- Mayor compatibilidad con frameworks populares como Spring.
- Mejoras en rendimiento para aplicaciones con alta concurrencia.
Jakarta EE sigue siendo una opción relevante para el desarrollo de aplicaciones empresariales en Java, especialmente cuando se requiere un conjunto estandarizado de APIs respaldado por una comunidad activa y un ecosistema maduro de herramientas y servidores de aplicaciones.
JPA
Jakarta Persistence API (JPA) es una de las especificaciones más importantes dentro del ecosistema Jakarta EE, centrada en proporcionar un marco estándar para el mapeo objeto-relacional (ORM) en aplicaciones Java. Esta especificación simplifica enormemente la forma en que los desarrolladores interactúan con bases de datos relacionales, permitiendo trabajar con objetos Java en lugar de consultas SQL directas.
JPA surge como respuesta a uno de los desafíos más comunes en el desarrollo de aplicaciones empresariales: la disparidad de paradigmas entre la programación orientada a objetos y el modelo relacional de las bases de datos. Esta diferencia fundamental, conocida como "impedancia objeto-relacional", tradicionalmente requería que los desarrolladores escribieran código repetitivo para convertir datos entre estos dos mundos.
Conceptos fundamentales de JPA
El núcleo de JPA se basa en varios conceptos clave:
Entidades: Clases Java simples (POJO) anotadas con
@Entity
que representan tablas en la base de datos. Cada instancia de una entidad corresponde a una fila en la tabla.EntityManager: Interfaz principal que gestiona el ciclo de vida de las entidades, permitiendo operaciones como persistir, actualizar, eliminar y consultar objetos.
Contexto de persistencia: Conjunto de instancias de entidades donde cada entidad representa un registro único en la base de datos.
Unidad de persistencia: Configuración que define un conjunto de entidades que se gestionan juntas, incluyendo detalles de conexión a la base de datos.
JPQL (Jakarta Persistence Query Language): Lenguaje de consulta similar a SQL pero orientado a objetos, que opera sobre entidades en lugar de tablas y columnas.
Beneficios de utilizar JPA
La adopción de JPA en aplicaciones empresariales ofrece numerosas ventajas:
Productividad mejorada: Reduce significativamente la cantidad de código necesario para interactuar con bases de datos.
Portabilidad: Las aplicaciones pueden cambiar entre diferentes bases de datos con mínimas modificaciones.
Mantenibilidad: Centraliza la lógica de acceso a datos y reduce la duplicación de código.
Rendimiento optimizado: Las implementaciones de JPA incluyen características como caché de primer y segundo nivel, carga perezosa (lazy loading) y estrategias de recuperación optimizadas.
Consultas tipificadas: Permite detectar errores en tiempo de compilación en lugar de en tiempo de ejecución.
Implementaciones de JPA
Aunque JPA es solo una especificación, existen varias implementaciones que los desarrolladores pueden utilizar:
Hibernate: La implementación más popular y madura, con características adicionales más allá de la especificación.
EclipseLink: La implementación de referencia para JPA, desarrollada por la Fundación Eclipse.
OpenJPA: Una implementación de código abierto de Apache.
DataNucleus: Una implementación flexible que soporta múltiples tipos de almacenamiento.
Integración con otras tecnologías de Jakarta EE
JPA no funciona de forma aislada, sino que se integra perfectamente con otras especificaciones de Jakarta EE:
- Con CDI para la inyección de componentes de persistencia.
- Con Jakarta Transactions para gestionar transacciones.
- Con Jakarta Bean Validation para validar datos antes de persistirlos.
- Con Jakarta RESTful Web Services para crear APIs que expongan datos persistentes.
Evolución y tendencias
JPA ha evolucionado considerablemente desde sus inicios:
- Las versiones recientes han mejorado el soporte para tipos de datos modernos como JSON y UUID.
- Se han añadido características para trabajar mejor con bases de datos NoSQL.
- Mayor énfasis en la programación asíncrona para mejorar la escalabilidad.
- Mejor integración con frameworks reactivos para aplicaciones de alto rendimiento.
Consideraciones de diseño
Al utilizar JPA en aplicaciones empresariales, es importante tener en cuenta ciertas prácticas recomendadas:
- Diseñar cuidadosamente las relaciones entre entidades para evitar problemas de rendimiento.
- Utilizar adecuadamente las estrategias de carga (eager vs. lazy) según los patrones de acceso.
- Implementar una capa de repositorio que encapsule la lógica de acceso a datos.
- Considerar el impacto en el rendimiento de las consultas complejas y las relaciones entre entidades.
- Planificar una estrategia de caché apropiada para optimizar el rendimiento.
JPA representa una abstracción poderosa que permite a los desarrolladores centrarse en la lógica de negocio en lugar de los detalles de persistencia, facilitando la creación de aplicaciones empresariales robustas y mantenibles dentro del ecosistema Jakarta EE.
Servlets
Los Servlets son uno de los componentes fundamentales de Jakarta EE que permiten extender las capacidades de los servidores web para generar contenido dinámico. Representan la tecnología base para el desarrollo de aplicaciones web en el ecosistema Java, actuando como intermediarios entre las peticiones de los clientes (navegadores) y los recursos del servidor.
Un Servlet es esencialmente una clase Java que procesa solicitudes HTTP y construye respuestas dinámicamente. A diferencia de tecnologías como PHP o ASP que mezclan código y HTML, los Servlets separan claramente la lógica de procesamiento del contenido de presentación, siguiendo el principio de separación de responsabilidades.
Arquitectura básica de Servlets
La arquitectura de Servlets se basa en un modelo de procesamiento de peticiones donde:
- El cliente envía una solicitud HTTP al servidor web
- El servidor web pasa la solicitud al contenedor de Servlets
- El contenedor determina qué Servlet debe manejar la solicitud
- El Servlet procesa la petición y genera una respuesta
- La respuesta se devuelve al cliente a través del servidor web
Esta arquitectura permite crear aplicaciones web escalables y robustas capaces de manejar múltiples solicitudes concurrentes.
Ciclo de vida de un Servlet
Los Servlets siguen un ciclo de vida bien definido gestionado por el contenedor:
- Inicialización: El contenedor carga la clase del Servlet y llama al método
init()
una sola vez durante la vida del Servlet. - Servicio: Por cada solicitud, el contenedor invoca el método
service()
, que a su vez llama a métodos específicos comodoGet()
odoPost()
según el tipo de petición HTTP. - Destrucción: Cuando el Servlet ya no es necesario, el contenedor llama al método
destroy()
para liberar recursos.
Este ciclo de vida permite a los Servlets mantener estado entre peticiones y optimizar recursos, características esenciales para aplicaciones empresariales.
Contenedores de Servlets
Los Servlets no pueden ejecutarse por sí solos; requieren un contenedor de Servlets (también llamado servidor web Java) que proporcione el entorno de ejecución necesario. Algunos de los contenedores más populares incluyen:
- Apache Tomcat: Ligero y ampliamente utilizado
- Jetty: Optimizado para entornos embebidos y microservicios
- Undertow: De alto rendimiento, utilizado en WildFly
- GlassFish: Servidor de aplicaciones completo que incluye soporte para Servlets
Estos contenedores implementan la especificación de Servlets y proporcionan servicios adicionales como gestión de sesiones, seguridad y balanceo de carga.
Características principales
Los Servlets ofrecen varias características que los hacen adecuados para el desarrollo de aplicaciones web empresariales:
- Independencia de plataforma: Funcionan en cualquier servidor que implemente la especificación de Servlets.
- Rendimiento: Una vez cargados, los Servlets permanecen en memoria, eliminando la sobrecarga de inicialización para cada petición.
- Persistencia: Pueden mantener información entre peticiones mediante sesiones HTTP.
- Seguridad: Integración con los mecanismos de seguridad de Jakarta EE.
- Extensibilidad: Pueden utilizar cualquier biblioteca Java para extender su funcionalidad.
- Integración: Se combinan fácilmente con otras tecnologías de Jakarta EE como JPA y CDI.
Evolución de los Servlets
La especificación de Servlets ha evolucionado significativamente desde su introducción:
- Las primeras versiones se centraban en la generación de contenido dinámico básico.
- Versiones posteriores añadieron soporte para filtros, eventos y anotaciones.
- Las versiones recientes han incorporado características como programación asíncrona, no-bloqueo de E/S y soporte para HTTP/2.
Con la transición a Jakarta EE, la especificación de Servlets continúa evolucionando para adaptarse a las arquitecturas modernas y patrones de desarrollo web.
Servlets en la arquitectura moderna
Aunque los frameworks web modernos como Spring MVC o Jakarta Faces abstraen muchos detalles de los Servlets, estos siguen siendo la base sobre la que se construyen estas tecnologías más avanzadas. Entender los Servlets proporciona una base sólida para comprender cómo funcionan internamente estos frameworks.
En arquitecturas de microservicios, los Servlets siguen siendo relevantes, especialmente cuando se utilizan contenedores ligeros como Tomcat o Jetty para desplegar servicios individuales. La capacidad de los Servlets para manejar peticiones HTTP de forma eficiente los hace adecuados para APIs RESTful y servicios web.
Limitaciones y alternativas
A pesar de sus ventajas, los Servlets presentan algunas limitaciones:
- Programación de bajo nivel que requiere escribir mucho código para tareas comunes.
- Modelo de programación síncrono en sus versiones iniciales.
- Separación manual del código de presentación y lógica de negocio.
Estas limitaciones han llevado al desarrollo de frameworks de más alto nivel dentro del ecosistema Jakarta EE, como Jakarta Faces (JSF) para aplicaciones basadas en componentes, o Jakarta RESTful Web Services (JAX-RS) para APIs REST.
Los Servlets representan una tecnología fundamental en el ecosistema Jakarta EE que ha resistido la prueba del tiempo, adaptándose a las cambiantes necesidades del desarrollo web mientras mantiene su papel como componente básico para la creación de aplicaciones web dinámicas en Java.
CDI
Contexts and Dependency Injection (CDI) es una especificación clave de Jakarta EE que proporciona un marco de inyección de dependencias y gestión del ciclo de vida de los componentes. Esta tecnología resuelve uno de los problemas fundamentales en el desarrollo de aplicaciones empresariales: cómo gestionar eficientemente las dependencias entre diferentes componentes de la aplicación.
CDI introduce un enfoque declarativo y tipificado para la inyección de dependencias, permitiendo a los desarrolladores crear aplicaciones más modulares, desacopladas y fáciles de probar. A diferencia de frameworks similares, CDI está completamente integrado con otras especificaciones de Jakarta EE, proporcionando una experiencia coherente en todo el ecosistema.
Principios fundamentales de CDI
La especificación CDI se basa en varios conceptos esenciales:
Beans gestionados: Componentes Java cuyo ciclo de vida es administrado por el contenedor CDI.
Contextos: Entornos donde las instancias de los beans existen con un estado asociado. CDI define varios contextos estándar como solicitud, sesión, aplicación y conversación.
Inyección de dependencias: Mecanismo por el cual el contenedor proporciona automáticamente las dependencias que un bean necesita.
Eventos: Sistema de comunicación desacoplado entre componentes mediante el patrón publicador/suscriptor.
Interceptores: Permiten separar aspectos transversales como logging, seguridad o transacciones del código de negocio.
Decoradores: Mecanismo para modificar o extender el comportamiento de beans existentes sin cambiar su implementación.
Ventajas de utilizar CDI
La adopción de CDI en aplicaciones Jakarta EE ofrece numerosos beneficios:
Código más limpio: Elimina la necesidad de código repetitivo para obtener referencias a otros componentes.
Desacoplamiento: Los componentes no necesitan conocer cómo se crean sus dependencias.
Testabilidad mejorada: Facilita la sustitución de implementaciones reales por mocks durante las pruebas.
Extensibilidad: Permite extender y personalizar el comportamiento de la aplicación sin modificar el código existente.
Integración nativa: Funciona perfectamente con otras especificaciones de Jakarta EE como JPA, Servlets y EJB.
Tipificación segura: Detecta errores de inyección en tiempo de compilación en lugar de en tiempo de ejecución.
Casos de uso comunes
CDI se utiliza ampliamente en diferentes escenarios dentro de aplicaciones Jakarta EE:
Arquitecturas en capas: Para inyectar servicios en controladores, repositorios en servicios, etc.
Configuración de aplicaciones: Para proporcionar diferentes implementaciones según el entorno (desarrollo, pruebas, producción).
Integración de sistemas: Para desacoplar componentes que interactúan con sistemas externos.
Implementación de patrones de diseño: Facilita patrones como Strategy, Observer, Decorator y Factory.
Gestión de transacciones: Para aplicar aspectos transaccionales de forma declarativa.
Evolución y tendencias
CDI ha evolucionado significativamente desde su introducción:
Las versiones recientes han mejorado el soporte para aplicaciones modulares y microservicios.
Mayor integración con tecnologías modernas como MicroProfile para entornos cloud-native.
Mejoras en el rendimiento y la inicialización bajo demanda para reducir el consumo de recursos.
Soporte mejorado para programación reactiva y modelos asíncronos.
Consideraciones de diseño
Al utilizar CDI en aplicaciones Jakarta EE, es importante tener en cuenta ciertas prácticas recomendadas:
Definir claramente los ámbitos (scopes) de los beans según su propósito y ciclo de vida.
Utilizar calificadores (qualifiers) para resolver ambigüedades cuando existen múltiples implementaciones.
Aprovechar los eventos CDI para comunicación desacoplada entre componentes.
Implementar interceptores para aspectos transversales como logging o seguridad.
Considerar el impacto en el rendimiento de beans con ámbitos amplios como ApplicationScoped.
CDI representa una pieza fundamental en el ecosistema Jakarta EE que permite a los desarrolladores crear aplicaciones empresariales modulares, mantenibles y extensibles, siguiendo los principios modernos de diseño de software.
CDI
Contexts and Dependency Injection (CDI) constituye uno de los pilares fundamentales de Jakarta EE, proporcionando un sistema de inyección de dependencias robusto y flexible para aplicaciones empresariales. Esta especificación permite construir aplicaciones Java con componentes débilmente acoplados, facilitando el desarrollo, mantenimiento y prueba del código.
CDI resuelve el problema de la gestión de dependencias entre componentes de una aplicación de forma elegante y declarativa. En lugar de que cada clase sea responsable de crear sus propias dependencias, el contenedor CDI se encarga de instanciar e inyectar automáticamente los objetos necesarios donde se requieren.
Fundamentos de la inyección de dependencias
La inyección de dependencias es un patrón de diseño que implementa el principio de inversión de control. En lugar de que un componente cree o busque sus dependencias, estas son proporcionadas (inyectadas) por un agente externo. En CDI, este agente es el contenedor CDI, que gestiona el ciclo de vida de los beans y sus dependencias.
Los principales mecanismos de inyección en CDI son:
- Inyección en campos: Usando la anotación
@Inject
directamente en un campo de clase. - Inyección en constructores: Aplicando
@Inject
a un constructor. - Inyección en métodos setter: Colocando
@Inject
en un método setter.
Ámbitos (Scopes) en CDI
Los ámbitos determinan el ciclo de vida de las instancias de los beans. CDI define varios ámbitos estándar:
- @RequestScoped: La instancia existe solo durante una solicitud HTTP.
- @SessionScoped: La instancia persiste durante toda la sesión del usuario.
- @ApplicationScoped: Una única instancia para toda la aplicación.
- @ConversationScoped: La instancia persiste durante una "conversación" definida por la aplicación.
- @Dependent: El ámbito por defecto, donde la instancia tiene el mismo ciclo de vida que el bean que la inyecta.
La elección del ámbito adecuado es crucial para el correcto funcionamiento de la aplicación y tiene implicaciones importantes en términos de consumo de recursos y estado compartido.
Calificadores (Qualifiers)
Los calificadores resuelven la ambigüedad cuando existen múltiples implementaciones de una interfaz. Son anotaciones personalizadas que permiten al contenedor CDI determinar qué implementación específica debe inyectarse en cada punto.
Para crear un calificador personalizado:
- Definir una anotación con
@Qualifier
- Aplicar la anotación a las implementaciones
- Usar la misma anotación en el punto de inyección
Los calificadores permiten implementar fácilmente patrones como Strategy o Factory de forma declarativa.
Productores (Producers)
Los métodos productores permiten crear beans que no son directamente instanciables por el contenedor CDI, como:
- Objetos de clases de terceros que no podemos modificar
- Objetos que requieren inicialización compleja
- Objetos cuya implementación se determina en tiempo de ejecución
Un método productor se define con la anotación @Produces
y puede incluir calificadores para distinguir entre diferentes producciones del mismo tipo.
Sistema de eventos
CDI incluye un potente sistema de eventos que implementa el patrón Observer, permitiendo la comunicación desacoplada entre componentes:
- Los observadores se registran para recibir notificaciones de eventos específicos
- Los emisores disparan eventos sin conocer quién los está escuchando
Este mecanismo es ideal para implementar funcionalidades como auditoría, notificaciones o cualquier escenario donde se requiera comunicación sin acoplamiento directo entre componentes.
Interceptores y decoradores
Los interceptores permiten aplicar comportamientos transversales (cross-cutting concerns) como logging, seguridad o transacciones de forma declarativa:
- Se definen mediante anotaciones
- Se aplican a métodos o clases completas
- Interceptan la ejecución para añadir comportamiento antes, después o alrededor del método objetivo
Los decoradores, por su parte, permiten modificar o extender el comportamiento de beans existentes implementando la misma interfaz y añadiendo funcionalidad adicional.
Integración con otras especificaciones
Una de las grandes fortalezas de CDI es su integración nativa con otras especificaciones de Jakarta EE:
- Con JPA para inyectar EntityManager y otros componentes de persistencia
- Con Servlets para acceder a componentes CDI desde controladores web
- Con JAX-RS para inyectar servicios en endpoints REST
- Con EJB para combinar la gestión transaccional con la inyección de dependencias
Esta integración proporciona una experiencia de desarrollo coherente y reduce la necesidad de código repetitivo para conectar diferentes capas de la aplicación.
Extensibilidad
CDI es altamente extensible mediante su SPI (Service Provider Interface), que permite:
- Registrar beans dinámicamente
- Modificar el comportamiento del contenedor
- Añadir nuevos ámbitos personalizados
- Interceptar el proceso de resolución de beans
Esta capacidad de extensión ha permitido el desarrollo de frameworks y bibliotecas que aprovechan CDI como base, ampliando sus capacidades para escenarios específicos.
Beneficios prácticos
La adopción de CDI en proyectos Jakarta EE aporta ventajas tangibles:
- Código más limpio y centrado en la lógica de negocio
- Mayor modularidad y reutilización de componentes
- Facilidad para cambiar implementaciones sin modificar el código cliente
- Mejor testabilidad mediante la sustitución de dependencias reales por mocks
- Reducción del acoplamiento entre componentes de la aplicación
CDI representa una evolución significativa en la forma de estructurar aplicaciones Java empresariales, promoviendo principios de diseño sólidos y facilitando la creación de sistemas mantenibles y escalables.
Otros ejercicios de programación de Java
Evalúa tus conocimientos de esta lección Ecosistema Jakarta EE de Java con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.
Streams: match
Gestión de errores y excepciones
CRUD en Java de modelo Customer sobre un ArrayList
Clases abstractas
Listas
Métodos de la clase String
Streams: reduce()
API java.nio 2
Polimorfismo
Pattern Matching
Streams: flatMap()
Llamada y sobrecarga de funciones
Métodos referenciados
Métodos de la clase String
Representación de Fecha
Operadores lógicos
Inferencia de tipos con var
Tipos de datos
Estructuras de iteración
Streams: forEach()
Objetos
Funciones lambda
Uso de Scanner
Tipos de variables
Streams: collect()
Operadores aritméticos
Arrays y matrices
Clases y objetos
Interfaz funcional Consumer
CRUD en Java de modelo Customer sobre un HashMap
Interfaces
Enumeraciones Enums
API Optional
Interfaz funcional Function
Encapsulación
Interfaces
Uso de API Optional
Representación de Hora
Herencia básica
Clases y objetos
Interfaz funcional Supplier
HashMap
Sobrecarga de métodos
Polimorfismo de tiempo de ejecución
OOP en Java
Sobrecarga de métodos
CRUD de productos en Java
Clases sealed
Creación de Streams
Records
Encapsulación
Streams: min max
Herencia
Métodos avanzados de la clase String
Funciones
Polimorfismo de tiempo de compilación
Reto sintaxis Java
Conjuntos
Estructuras de control
Recursión
Excepciones
Herencia avanzada
Estructuras de selección
Uso de interfaces
Operadores
Variables
HashSet
Objeto Scanner
Streams: filter()
Operaciones de Streams
Interfaz funcional Predicate
Streams: sorted()
Configuración de entorno
Uso de variables
Clases
Streams: distinct()
Streams: count()
ArrayList
Mapas
Datos de referencia
Interfaces funcionales
Métodos básicos de la clase String
Tipos de datos
Clases abstractas
Instalación
Funciones
Excepciones
Estructuras de control
Herencia de clases
La clase Scanner
Generics
Streams: map()
Funciones y encapsulamiento
Todas las lecciones de Java
Accede a todas las lecciones de Java y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.
Instalación De Java
Introducción Y Entorno
Configuración De Entorno Java
Introducción Y Entorno
Tipos De Datos
Sintaxis
Variables
Sintaxis
Operadores
Sintaxis
Estructuras De Control
Sintaxis
Funciones
Sintaxis
Recursión
Sintaxis
Arrays Y Matrices
Sintaxis
Excepciones
Programación Orientada A Objetos
Clases Y Objetos
Programación Orientada A Objetos
Encapsulación
Programación Orientada A Objetos
Herencia
Programación Orientada A Objetos
Clases Abstractas
Programación Orientada A Objetos
Interfaces
Programación Orientada A Objetos
Sobrecarga De Métodos
Programación Orientada A Objetos
Polimorfismo
Programación Orientada A Objetos
La Clase Scanner
Programación Orientada A Objetos
Métodos De La Clase String
Programación Orientada A Objetos
Excepciones
Programación Orientada A Objetos
Records
Programación Orientada A Objetos
Pattern Matching
Programación Orientada A Objetos
Inferencia De Tipos Con Var
Programación Orientada A Objetos
Enumeraciones Enums
Programación Orientada A Objetos
Generics
Programación Orientada A Objetos
Clases Sealed
Programación Orientada A Objetos
Listas
Framework Collections
Conjuntos
Framework Collections
Mapas
Framework Collections
Funciones Lambda
Programación Funcional
Interfaz Funcional Consumer
Programación Funcional
Interfaz Funcional Predicate
Programación Funcional
Interfaz Funcional Supplier
Programación Funcional
Interfaz Funcional Function
Programación Funcional
Métodos Referenciados
Programación Funcional
Creación De Streams
Programación Funcional
Operaciones Intermedias Con Streams: Map()
Programación Funcional
Operaciones Intermedias Con Streams: Filter()
Programación Funcional
Operaciones Intermedias Con Streams: Distinct()
Programación Funcional
Operaciones Finales Con Streams: Collect()
Programación Funcional
Operaciones Finales Con Streams: Min Max
Programación Funcional
Operaciones Intermedias Con Streams: Flatmap()
Programación Funcional
Operaciones Intermedias Con Streams: Sorted()
Programación Funcional
Operaciones Finales Con Streams: Reduce()
Programación Funcional
Operaciones Finales Con Streams: Foreach()
Programación Funcional
Operaciones Finales Con Streams: Count()
Programación Funcional
Operaciones Finales Con Streams: Match
Programación Funcional
Api Optional
Programación Funcional
Transformación
Programación Funcional
Reducción Y Acumulación
Programación Funcional
Mapeo
Programación Funcional
Streams Paralelos
Programación Funcional
Agrupación Y Partición
Programación Funcional
Filtrado Y Búsqueda
Programación Funcional
Api Java.nio 2
Entrada Y Salida Io
Fundamentos De Io
Entrada Y Salida Io
Leer Y Escribir Archivos
Entrada Y Salida Io
Httpclient Moderno
Entrada Y Salida Io
Clases De Nio2
Entrada Y Salida Io
Api Java.time
Api Java.time
Localtime
Api Java.time
Localdatetime
Api Java.time
Localdate
Api Java.time
Executorservice
Concurrencia
Virtual Threads (Project Loom)
Concurrencia
Future Y Completablefuture
Concurrencia
Spring Framework
Frameworks Para Java
Micronaut
Frameworks Para Java
Maven
Frameworks Para Java
Gradle
Frameworks Para Java
Lombok Para Java
Frameworks Para Java
Quarkus
Frameworks Para Java
Ecosistema Jakarta Ee De Java
Frameworks Para Java
Introducción A Junit 5
Testing
Certificados de superación de Java
Supera todos los ejercicios de programación del curso de Java y obtén certificados de superación para mejorar tu currículum y tu empleabilidad.
En esta lección
Objetivos de aprendizaje de esta lección
- Comprender qué es Jakarta EE y su evolución desde Java EE.
- Identificar las especificaciones clave dentro del ecosistema Jakarta EE, como JPA, Servlets y CDI.
- Entender el ciclo de vida y arquitectura básica de los Servlets.
- Conocer los fundamentos y beneficios de la inyección de dependencias con CDI.
- Reconocer la integración y casos de uso comunes de las tecnologías Jakarta EE en aplicaciones empresariales.