# Jakarta EE

In informatica Jakarta EE (conosciuta, prima della versione 8, col nome di Java EE; e prima della versione 5, col nome di Java 2 Enterprise Edition o J2EE) è un insieme di specifiche le cui implementazioni vengono principalmente sviluppate in linguaggio di programmazione Java e ampiamente utilizzata nella programmazione Web. Tale nome è un riferimento all'omonima capitale dell'Indonesia.

## Caratteristiche

I software che implementano tale specifica vengono detti Referencing Runtimes Jakarta EE. L'implementazione può essere totale (in tal caso detta Full Platform) o limitata al Web Profile, ovvero il sottoinsieme delle specifiche che è stato pensato appositamente per le applicazioni web.
Inizialmente, la specifica incoraggiava la creazione di applicazioni che seguono una architettura multi-tier. Tale architettura aveva come scopo la separazione delle funzionalità relative alla visualizzazione delle pagine web da quelle per la gestione della logica di business e del salvataggio delle informazioni sulla base dati.
Recentemente, con tecnologie come Eclipse MicroProfile, WildFly Swarm e Payara Micro, è possibile sviluppare anche microservizi. Ciò ha comportato anche un cambiamento del nome che viene dato alle implementazioni: prima si chiamavano application server, adesso referencing runtimes.
Questo insieme di specifiche è stato creato inizialmente da Sun Microsystems, portato avanti da Oracle, e nella seconda metà del 2017 trasferito alla Eclipse Foundation, col nome di Eclipse Enterprise for Java.

## Specifiche di Jakarta EE

L'insieme di specifiche detto Jakarta EE include molte tecnologie che estendono le funzionalità di base della piattaforma Java. L'elenco che segue non riporta tutte le componenti, ma solo quelle di maggiore importanza. Le uniche componenti che richiedono strettamente l'uso di un referencing runtime sono quelle enterprise, cioè quelle che hanno bisogno, ad esempio, delle transazioni distribuite e delle code distribuite. Le componenti per il web e per la base dati possono essere usate anche all'interno di un semplice web server.

### Specifiche web

Le componenti che rientrano in questa categoria sono quelle legate alla visualizzazione delle pagine web. Nel caso in cui si vogliano usare solo le componenti lato web, non è necessario ricorrere ad un complesso referencing runtime di tipo full profile, ma è sufficiente usare un referencing runtime Web Profile o un più snello Web Server.
* Servlet, ovvero la tecnologia che permette di trasmettere pagine HTML (ad esempio utilizzando la tecnologia Java Server Pages) al client e di esporre web services;
* Java Server Faces, un framework web basato su componenti e che permette lo sviluppo di siti con funzionalità AJAX.

### Specifiche enterprise

In questa categoria ci sono le componenti che sono specifiche di Jakarta EE. L'uso di queste componenti è richiesto solamente in applicativi di medie e grandi dimensioni.
* Contexts and Dependency Injection che permettono di usare l'inversione di controllo in modo molto simile a come si fa con Spring framework e forniscono la maggior parte delle funzionalità che viene fornita dagli Enterprise JavaBeans;
* Gli Enterprise JavaBeans definiscono un sistema a componenti distribuito che rappresentava il cuore della specifica Java EE. Tale sistema, infatti, forniva le tipiche caratteristiche richieste dalle applicazioni enterprise, come scalabilità, sicurezza, persistenza dei dati e altro. Molte di tali caratteristiche sono oggi disponibili anche con Contexts and Dependency Injection;
* Il Java Message Service descrive un sistema per l'invio e la gestione di messaggi;
* Java EE Security API definisce la gestione degli utenti, delle password, dei gruppi e dell'autenticazione.

### Specifiche per i web service

In Jakarta EE è possibile realizzare sia web service di tipo REST, che di tipo SOAP. Le specifiche sono:
* JSON Processing, per elaborare informazioni codificate in formato JavaScript Object Notation;
* JSON Binding, per trasformare oggetti Java in stringhe JavaScript Object Notation e vice versa;
* RESTful Web Services, per realizzare web services mediante una architettura di tipo Representational State Transfer
* JAX-WS per i web service di tipo SOAP
* Java Architecture for XML Binding per trasformare oggetti Java in stringhe XML e vice versa.

### Specifiche per l'interazione con la base dati

Questa categoria contiene le tecnologie che permettono la persistenza dei dati all'interno di una base dati relazionale. Anche le componenti di questa categoria possono essere usate al di fuori di un referencing runtime.
* Il Java Transaction API è un sistema per il supporto alle transazioni distribuite;
* Il Java DataBase Connectivity è un'interfaccia per l'accesso a qualsiasi tipo di basi di dati (compresa anche in Java Platform, Standard Edition);
* Il Jakarta Persistence è l'insieme di classi che possono essere usate per la gestione della persistenza dei dati.

## Programmi base
### Applet

La piattaforma Java fu uno dei primi sistemi a fornire un largo supporto per l'esecuzione del codice da sorgenti remote. Un Java applet è un particolare tipo di applicazione che può essere avviata all'interno del browser dell'utente eseguendo codice scaricato da un server web remoto. Questo codice viene eseguito in un'area (sandbox) altamente ristretta per proteggere l'utente da codice malevolo o che abbia un comportamento non desiderato; chi pubblica il codice può applicare un certificato che usa per firmare digitalmente gli applet dichiarandoli "sicuri", dando loro il permesso di uscire dall'area ristretta e accedere al filesystem e al network, presumibilmente con l'approvazione e sotto il controllo dell'utente. In realtà gli applet non hanno avuto molta fortuna. Infatti si presuppone che il client in cui essi vengono eseguiti abbia installata la JRE che deve eseguire il codice dell'applet. Hanno avuto fortuna le applicazioni che prevedono il cosiddetto thin-client, cioè un client 'leggero' che non ha bisogno di particolari strumenti per eseguire il codice remoto, a volte è necessario solo il browser.

### Servlet

In informatica, nell'ambito della programmazione Web, i servlet sono oggetti scritti in linguaggio Java che operano all'interno di un server web (es. Tomcat, Jetty) oppure un server per applicazioni (es. WildFly, GlassFish) permettendo la creazione di applicazioni web (elaborazione lato server).
Il nome deriva in contrapposizione alle Java applet, piccoli programmi scritti in linguaggio Java che si eseguono all'interno del browser dell'utente client (elaborazione lato client).
L'uso più frequente delle servlet è la generazione di pagine web dinamiche a seconda dei parametri di richiesta inviati dal client browser dell'utente al server. Negli ultimi anni non viene eseguita la programmazione diretta delle servlet, ma si preferisce usare dei framework web che implementano la specifica servlet, oppure delle JavaServer Pages che vengono poi tradotte (compilate) in servlet a runtime.

## Implementazioni certificate

Esistono diversi referencing runtimes open source, che vengono spesso usati anche in ambiente di produzione.
Tra quelli open source ci sono:
* Apache TomEE, del quale esiste una versione avente supporto commerciale chiamata Tomitribe
* WildFly, precedentemente noto come JBoss
* GlassFish, creata da Oracle ma passata alla Eclipse Foundation. Esiste una versione che ha il supporto commerciale e si chiama Payara
Tra quelli commerciali, oltre a quelli riportati sopra:
* WebLogic di Oracle;
* WebSphere di IBM;
* Cosminexus di Hitachi;
* Interstage Application Server di Fujitsu;
* InforSuite di InforBus;
* Jeus di TmaxSoft;
* WebOTX di NEC;

## Microservizi ed Eclipse MicroProfile

Eclipse MicroProfile è un progetto per innovare le specifiche di Jakarta EE e renderle più adatte per un'architettura a microservizi. L'idea è quella di eseguire solo le componenti di Jakarta EE che sono strettamente necessarie per l'applicativo che si sta sviluppando.
Tra le implementazioni disponibili, troviamo:
* Open Liberty
* Apache TomEE
* Payara Micro
* kumuluzEE

## Critiche

Nel dicembre 2016 Gartner, in un rapporto ha dichiarato che le iniziative imprenditoriali informatiche hanno bisogno di nuove caratteristiche e funzionalità e che Java EE non è riuscita a tenere l'andatura. Nel rapporto si consigliava di sviluppare una strategia per gestire l'obsolescenza di Java EE. Si aspettano che per il 2019, meno del 35% degli applicativi aziendali sarà fatto funzionare all'interno di application server Java EE. A tale critica è stato risposto che Java EE continua ad evolvere e sviluppare funzionalità che la rendono più snella, mediante tecnologie come MicroProfile, WildFly Swarm e Payara Micro.

## Alternative

Diversi altri software forniscono funzionalità simili, tra i quali:
* Spring framework che ha funzionalità estremamente simili a quelle di Java EE;
* ASP.NET, che può essere usato con linguaggi quali C# e Visual Basic.net;
* Akka e Play framework, scritti in Scala, possono essere usati anche in Java;
* Node.js, una piattaforma guidata da eventi per il motore JavaScript dei browser;
* Vert.X, un insieme di strumenti per lo sviluppo di applicazioni reattive sulla JVM