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ícate

Qué 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 como doGet() o doPost() 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.

Aprende Java online

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

Test

Gestión de errores y excepciones

Código

CRUD en Java de modelo Customer sobre un ArrayList

Proyecto

Clases abstractas

Test

Listas

Código

Métodos de la clase String

Código

Streams: reduce()

Test

API java.nio 2

Puzzle

Polimorfismo

Código

Pattern Matching

Código

Streams: flatMap()

Test

Llamada y sobrecarga de funciones

Puzzle

Métodos referenciados

Test

Métodos de la clase String

Código

Representación de Fecha

Puzzle

Operadores lógicos

Test

Inferencia de tipos con var

Código

Tipos de datos

Código

Estructuras de iteración

Puzzle

Streams: forEach()

Test

Objetos

Puzzle

Funciones lambda

Test

Uso de Scanner

Puzzle

Tipos de variables

Puzzle

Streams: collect()

Puzzle

Operadores aritméticos

Puzzle

Arrays y matrices

Código

Clases y objetos

Código

Interfaz funcional Consumer

Test

CRUD en Java de modelo Customer sobre un HashMap

Proyecto

Interfaces

Código

Enumeraciones Enums

Código

API Optional

Test

Interfaz funcional Function

Test

Encapsulación

Test

Interfaces

Código

Uso de API Optional

Puzzle

Representación de Hora

Test

Herencia básica

Test

Clases y objetos

Código

Interfaz funcional Supplier

Puzzle

HashMap

Puzzle

Sobrecarga de métodos

Test

Polimorfismo de tiempo de ejecución

Puzzle

OOP en Java

Proyecto

Sobrecarga de métodos

Código

CRUD de productos en Java

Proyecto

Clases sealed

Código

Creación de Streams

Test

Records

Código

Encapsulación

Código

Streams: min max

Puzzle

Herencia

Código

Métodos avanzados de la clase String

Puzzle

Funciones

Código

Polimorfismo de tiempo de compilación

Test

Reto sintaxis Java

Proyecto

Conjuntos

Código

Estructuras de control

Código

Recursión

Código

Excepciones

Puzzle

Herencia avanzada

Puzzle

Estructuras de selección

Test

Uso de interfaces

Test

Operadores

Código

Variables

Código

HashSet

Test

Objeto Scanner

Test

Streams: filter()

Puzzle

Operaciones de Streams

Puzzle

Interfaz funcional Predicate

Puzzle

Streams: sorted()

Test

Configuración de entorno

Test

Uso de variables

Test

Clases

Test

Streams: distinct()

Puzzle

Streams: count()

Test

ArrayList

Test

Mapas

Código

Datos de referencia

Test

Interfaces funcionales

Puzzle

Métodos básicos de la clase String

Test

Tipos de datos

Código

Clases abstractas

Código

Instalación

Test

Funciones

Código

Excepciones

Código

Estructuras de control

Código

Herencia de clases

Código

La clase Scanner

Código

Generics

Código

Streams: map()

Puzzle

Funciones y encapsulamiento

Test

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

Accede GRATIS a Java y certifícate

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.