# Java EE

Java Platform, Enterprise Edition o Java EE (anteriormente conocido como Java 2 Platform, Enterprise Edition o J2EE hasta la versión 1.4; traducido informalmente como Java Empresarial) es una plataforma de programación —parte de la Plataforma Java— para desarrollar y ejecutar software de aplicaciones en el lenguaje de programación Java. Permite utilizar arquitecturas de N capas distribuidas y se apoya ampliamente en componentes de software modulares ejecutándose sobre un servidor de aplicaciones. La plataforma Java EE está definida por una especificación. Similar a otras especificaciones del Java Community Process (JCP), Java EE es también considerado informalmente como un estándar debido a que los proveedores deben de cumplir ciertos requisitos de conformidad para declarar que sus productos son conformes a Java EE; estandarizado por JCP.
Java EE tiene varias especificaciones de API, tales como JDBC, RMI, e-mail, JMS, Servicios Web, XML, etc y define cómo coordinarlos. Java EE también configura algunas especificaciones únicas para Java EE para componentes. Estas incluyen Enterprise JavaBeans, servlets, portlets (siguiendo la especificación de Portlets Java), JavaServer Pages y varias tecnologías de servicios web. Ello permite al desarrollador crear una aplicación de empresa portable entre plataformas y escalable, a la vez que integrable con tecnologías anteriores. Otros beneficios añadidos son, por ejemplo, que el servidor de aplicaciones puede manejar transacciones, la seguridad, escalabilidad, concurrencia y gestión de los componentes desplegados, significando que los desarrolladores pueden concentrarse más en la lógica de negocio de los componentes en lugar de en tareas de mantenimiento del bajo nivel.

## Historia

La especificación original J2EE fue desarrollada por la empresa Sun Microsystems.
* J2EE 1.3 fue desarrollada bajo el Java Community Process. JSR 58 especifica J2EE 1.3, el SDK de J2EE 1.3 fue distribuida inicialmente como beta en abril de 2001.
* La beta del SDK de J2EE 1.4 definida en JSR 151 fue distribuida por Sun en diciembre de 2002.
* La especificación Java EE 5 fue desarrollada bajo el JSR 244 y el lanzamiento final se hizo el 11 de mayo de 2006.
* La versión Java EE 6 cumple la especificación JSR 316 y fue lanzada el 10 de diciembre de 2009.
* La versión Java EE 7 cuya especificación es la JSR 342, de 28 de mayo de 2013.
* La versión Java EE 8 fue lanzada el 31 de agosto de 2017, y sigue la especificación JSR 366.
Desde el 24 de abril de 2018 Java EE es gestionado por la Fundación Eclipse. La Fundación Eclipse fue forzada a eliminar la palabra Java del nombre debido a que Oracle posee el registro de la marca "Java". El 26 de febrero de 2018 se anunció que el nuevo nombre de Java EE sería Jakarta EE.

## Arquitectura Java EE

La arquitectura Java EE está basada en tres conceptos clave:
* Servicios: Permiten que el programador se concentre en su lógica de negocio y use estos servicios para su aplicación. Estos servicios pueden tener funcionalidades de seguridad, comunicaciones de red, logging, integridad de datos, etc. Estos servicios son proporcionados por un contenedor.
* Contenedores: Son entornos en tiempo de ejecución; es decir, un programa que se está ejecutando y tu aplicación se monta sobre este como si fuera un plugin o el casete para una consola de juegos. Hay varios tipos de contenedores y la agrupación de ellos forman un servidor de aplicaciones.
* Componentes: Son objetos Java que contienen la lógica de negocio de la aplicación y usan los servicios proporcionados por el contenedor. Hay varios tipos de componentes y según ese tipo son desplegados en un contenedor u otro.
Estos tres conceptos permiten a Java EE definir una arquitectura de capas:
* Capa cliente: Con componentes que corren en la máquina del cliente (como un navegador, un teléfono inteligente o un ordenador de escritorio)
* Capa web: Corre en el servidor Java EE o servidor de aplicaciones y se comunica con la capa web(capa cliente?) y la de capa de negocio de tal manera que transforma la información al formato adecuado (por ejemplo HTML).
* Capa de servidor/negocio: Proporciona los datos y persiste la información de la capa cliente y contiene la capa de negocio. También se ejecuta en el servidor de aplicaciones.
* Capa de datos: Donde se persisten los datos, por ejemplo una bbdd.
Esta arquitectura intenta independizar evitando dependencias entre capas.
El uso de estas capas, nos permite a la hora de desarrollar dividir nuestra aplicación en distintas capas. El modelo más típico es el Modelo Vista Controlador MVC en el cual se separa la capa de presentación, la de negocio y la de acceso a datos. Una arquitectura multicapas promueve la separación de responsabilidades por capas. En el caso particular de 3-capas se separa la presentación de la lógica de negocio y ésta de la de datos. La capa de presentación no accede directamente a la base de datos, sino que lo hace únicamente a través de la capa de negocio. La arquitectura multicapas introduce muchas mejoras importantes dentro del diseño de la aplicación, incluyendo la flexibilidad a través de una adecuada separación entre la capa de presentación y la lógica de negocio.

## Componentes

Con el fin de construir aplicaciones por componentes basados en JEE, se han definido diferentes componentes:
* Componentes de cliente: Son todos aquellos que se ejecutan en la máquina del cliente y hay de dos tipos, aplicaciones de clientes y clientes web. Los clientes web se conocen como Thin Clients y son páginas web generadas dinámicamente por los componentes web con lenguajes como HTML o XML que se envían a la máquina del cliente como respuesta a una petición, en la que habrá un navegador web que se encargará de mostrarle al cliente el contenido. Incluso esa web puede llevar un applet integrado. En este caso, se conectan directamente con la capa web del servidor JEE la cual es la encargada de acceder a la capa de negocio. Por otro lado las aplicaciones de cliente o Smart Clients, las cuales se ejecutan también en cliente, y ofrecen una interfaz más rica no basadas en un navegador web. En este caso se “saltan” la conexión con la capa web y tiran directamente contra la capa de negocio.
* Componentes web: Se ejecutan en el contenedor web del servidor JEE y son servlets, páginas web dinámicas como JSF y/o JSPs y JavaBeans. Los servlets son clases java que procesan dinámicamente las peticiones del cliente y generan respuestas adecuadas. Los JSP es un servlet pero más orientado a la presentación, es más sencillo para el programador. Los JSF es una evolución de los JSP pero con una interfaz de usuario más potente ya que soporta, por ejemplo Ajax. Por último los Javabeans son componentes de servidor que encapsulan la lógica de negocio de una aplicación.
* Componentes de la capa de negocio: Son los que implementan la lógica de negocio y se ejecutan en la capa de negocio. Son los EJB Enterprise Java Beans. Los EJBs los hay de tres tipos, de sesión de entidad y dirigidos por mensajes. Las tecnologías básicas de esta capa son los EJBs, la api-Rest o las de persistencia
* Componentes de la capa de datos: No son componentes de java en si,sino que son 3party. Nos permite explotar las características de esos servicios. Para ello Java EE nos proporciona un API de conectividad con bbdd, otro de persistencia para poder guardar información, API de transacciones, etc.

## Seguridad y Persistencia

Persistencia: Los datos y la información son clave en las aplicaciones actuales. Las organizaciones y las aplicaciones necesitan guardar datos porque necesitan almacenar la información sobre su actividad. Hoy en día vamos a que todo tiene que ser almacenado y todo tiene que ser recuperable para poder explotar esa información. Cualquier aplicación hoy en día debe tener almacenada información y debe poder recuperarla en cualquier momento. En el mundo de java existen múltiples maneras de almacenar información, desde lo más sencillo que sería serializando una serie de datos en algún tipo de archivo como guardarlos en formato json, xml, guardarlos en formato binario como con protocolbuffer o incluso en el peor de los casos con la API serializable de java o en el caso más profesional con el uso de bbdd o almacenes de datos.
Este último caso, que es el más habitual, tiene un problema, ya que cuando hablamos de bbdd, en muchos casos nos referimos a bbdd relacionales, donde se almacenan los datos en tablas. Sin embargo java es un lenguaje orienta a objetos y trabajar con estos dos conceptos puede tener sus pequeños problemas ya que necesitamos algo que nos convierta entre objetos y relaciones que tenemos en nuestra bbdd relacional.
Existen distintas formas de hacerlo, como por ejemplo con el uso de JDBC que permite especificar consultas SQL.
Existe un mecanismo que se encarga de hacer esto por nosotros, los ORMs, que son librerías que nos permiten convertir entre objetos y entidades relacionales. Las dos tecnologías más extendidas en este aspecto son JPA (una API que permite almacenar de forma persistente información simplemente etiquetando cada uno de los elementos que necesitamos recordar)e Hibernate que es uno de los ORM más utilizados.
Seguridad. La seguridad es un aspecto fundamental de las aplicaciones empresariales. La seguridad en Java EE está basada en el Servicio Java de Autentificación y Autorización (JAAS). JAAS separa el sistema de autentificación de la aplicación Java EE mediante el uso de un API bien definida que es implementada por el servidor de aplicaciones.

## API generales estructura de control y manejo

Las API de Java EE incluyen varias tecnologías que extienden la funcionalidad de las API base de Java SE.

### javax/ejb.*

* javax.ejb
La API Enterprise JavaBeans define un conjunto de API que un contenedor de objetos distribuidos soportará para suministrar persistencia, RPCs (usando RMI o RMI-IIOP), control de concurrencia, transacciones y control de acceso para objetos distribuidos.

### javax/naming

* javax.naming (enlace roto disponible en Internet Archive; véase el historial, la primera versión y la última).
Los paquetes javax.naming, javax.naming.directory, javax.naming.event, javax.naming.ldap y javax.naming.spi definen la API de Java Naming and Directory Interface (JNDI).

### java.sql

Los paquetes java.sql y javax.sql definen la API de JDBC.

### javax/transaction.*

* javax.transaction
Estos paquetes definen la Java Transaction API (JTA).

### javax/xml.*

* javax.xml (enlace roto disponible en Internet Archive; véase el historial, la primera versión y la última).
Estos paquetes definen la API JAXP.

### javax/jms.*

* javax.jms
Estos paquetes definen la API JMS.

### javax/persistence

* javax.persistence (enlace roto disponible en Internet Archive; véase el historial, la primera versión y la última).
Este paquete provee las clases e interfaces para gestionar la interacción entre los proveedores de persistencia, las clases administradas y los clientes de la Java Persistence API (JPA).

## Beneficios

Uno de los beneficios de Java EE es que es posible empezar con poco o ningún coste. La implementación Java EE de Oracle Corporation puede ser descargada gratuitamente, y hay muchas herramientas de código abierto disponibles para extender la plataforma o para simplificar el desarrollo.
Ejemplos de herramientas de desarrollo Java de código abierto de terceras partes son:
* NetBeans IDE, un IDE basado en Java.
* La plataforma Eclipse, un IDE basado en Java.
* Expand, un plugin de Eclipse, para desarrollo rápido.
* Jedit, de código abierto, un IDE basado en Java.
* Apache Software Foundation Apache Ant, una herramienta de construcción automática.
* Apache Software Foundation Apache Maven, una herramienta de construcción automática y gestión de dependencias.
* JUnit, un framework para Pruebas de unidad automatizadas.
* Apache Software Foundation Apache Tomcat, un contenedor web de Servlet/JSP.
* Jetty, un servidor web y un contenedor web Servlet/JSP.
* Spring, un framework para desarrollo de aplicaciones Java EE.
* Struts, un framework para desarrollar aplicaciones web EE conforme al patrón Modelo Vista Controlador.
* OpenXava, un framework de código abierto para desarrollo fácil de aplicaciones de negocio J2EE.
* JDeveloper, un IDE basado en Java y desarrollado por Oracle.
* JBuilder, desarrollado por Borland.
* JavaServer Faces, un framework para desarrollar aplicaciones web EE conforme al patrón Modelo Vista Controlador, desarrollado por Sun.
* Aries, un framework de código abierto para desarrollo rápido de aplicaciones de gestión Java EE.

## Servidores de aplicaciones certificados
### Servidores de Aplicaciones Java EE 5 certificados

* JOnAS, un servidor de aplicaciones de código abierto de ObjectWeb.
* JBoss, desarrollado inicialmente por JBoss Inc y adquirido posteriormente por Red Hat. Existe una versión de código abierto soportada por la comunidad y otra empresarial.
* Sun Java System Application Server Platform Edition 9.0, basado en GlassFish.
* Oracle WebLogic Application Server 10.0 (Antes BEA Systems).
* Servidor de Aplicaciones SAP NetWeaver, Java EE 5 Edition de SAP.
* JEUS 6, un Servidor de aplicaciones específico de Linux de TmaxSoft.
* Apache Geronimo 2.0
* IBM WebSphere Application Server.
* Oracle Containers for Java EE 11.
* GlassFish, un servidor de aplicaciones de código abierto de Sun.
* Apache OpenEJB vía Apache Geronimo.

### Servidores de Aplicaciones J2EE 1.4 certificados

* Geronimo, un servidor de aplicaciones de código abierto de Apache.
* JOnAS, un servidor de aplicaciones de código abierto de ObjectWeb.
* Servidor de Aplicaciones SAP NetWeaver, Java EE 5 Edition de SAP.
* Sun Java System Web Server
* Sun Java System Application Server
* IBM WebSphere Application Server (WAS) de IBM.
* Servidor de aplicaciones WebLogic de BEA Systems.

### Servidores de Aplicaciones J2EE 1.3 certificados

* Servidor de Aplicaciones JRun de Macromedia.