Introduzione alle Java Servlet

In principio erano le Applet, piccoli frammenti di codice Java immerse nelle prime pagine html, che venivano scaricate ed eseguite sul pc in locale per realizzare funzionalità complesse nelle applicazioni web. Ora quel meccanismo è stato potenziato lato server e migliorato ed è appannaggio delle Servlet e JSP. Vediamo cosa sono e come usarle.

Introduzione

In queste pagine e nei quarto anno di ITT, viene affrontato l’argomento Java, con particolare interesse alla programmazione visuale mediante la libreria Swing e cenni di JavaFX. Un’applicazione molto interessante di Java però è nell’ambito Enterprise (detto EE) per la realizzazione di applicazioni web. Esistono sostanzialmente due tecnologie utilizzate Servlet e JSP. Entrambe si comportano come linguaggi lato server, ovvero un vero e proprio software, anche complesso, che viene eseguito su un server web che restituisce il risultato dell’elaborazione attraverso una pagina web html da inviare e visualizzare sul browser client. Applicazioni di questo tipo interagiscono con dati inviati dall’utente attraverso le form, interrogano database, immagazzinano dati e restituiscono informazioni articolate in modo “dinamico”, consentendo una navigazione tra pagine con “memoria”. Scolasticamente, è lo stesso comportamento del PHP, decisamente più approfondito e diffuso a livello professionale/lavorativo, almeno in Italia.

Le servlet sono vere e proprie classi Java con metodi opportuni per l’erogazione del servizio web. Al loro interno, nel codice Java coesistono quindi sia le funzionalità di questo linguaggio, sia il risultato da dover restituire mediante pagina html col suo codice. E’ una prassi non molto leggibile ed è facile confondere il codice per i meno esperti, ma per script e pagine piccole è un ottimo sistema per risparmiare tempo. Le Java Server Pages, JSP sono un sistema invece più potente derivato dalla Servlet, con la differenza che si comporta più come un linguaggio di scripting dove vengono mischiati html e java beans, le porzioni lato server vere e proprie, ma con la possibilità rispetto a molti dei linguaggi lato server di suddividere parte grafica e funzionale. Il vantaggio di JSP e Servlet sta nella potenza del linguaggio Java che mantiene sul server un codice “compilato” molto più veloce, in molti casi, di uno script PHP che viene sempre reinterpretato da capo. Delle JSP ce ne occuperemo in altra serie di articoli.

Cosa ci occorre

Banale da dire, ma tanto vale spendere due righe per chi fosse a completo digiuno di Java: ci occorreranno le le librerie JDK e JRE. Se siete su linux potete usare le openjdk con il software apt/aptitude, se siete su windows potete tranquillamente fare riferimento al sito https://openjdk.java.net/ o la versione proprietaria di Oracle https://www.oracle.com/java/technologies/javase-downloads.html Al momento di stesura di questo articolo ci son ole versioni 14 ed 11, non esattamente compatibili tra di loro, quindi consiglio sempre a prescindere l’ultima versione, a meno di particolari esigenze di ambiente di sviluppo o sw/hw a disposizione. Ricordo che è pur sempre possibile avere due versioni ed usare l’ambiente opportuno attraverso IDE di sviluppo avanzati. Non entriamo qui nella storia e scelta tra le due versioni di JDK. Segnaliamo però che, per motivi di compatibilità, è bene scegliere JDK e JRE della stessa versione e tipologia apert/chiusa o il sistema potrebbe dare noie tra compilazione con JDK ed esecuzione con JRE. In genere sui computer preconfigurati e in mano ai meno esperti, è già installata la JRE che serve ad eseguire i programmi: assicuriamoci del suo aggiornamento o disistallazione se usiamo la JDK.

 La seconda fondamentale necessità è avere un server capace di gestire le servlet che andiamo a creare e restituirci la pagina web risultante dalla interpretazione. Nel nostro caso ci affidiamo al classico server Apache Tomcat. Lo potete reperire qui http://tomcat.apache.org/ da installare in locale per i nostri test alal stregua di un qualsiasi servizio Apache/PHP. Potete affittare un dominio con server Tomcat già configurato, solitamente a costi leggermente più elevati degli hosting apache/php che partono anche da 10/15 euro annui contro i 40 circa di quelle Tomcat/Java

Servlet e JAR

Le librerie necessarie a creare ed utilizzare le Servlet non sono incluse nella Java SDK ma si possono reperire con estrema facilità su diversi canali ufficiali. Possiamo scaricare la libreria sotto forma di file .JAR ed andarlo ad importare nel nostro progetto a richiesta. Preleviamo il file a questo link, nella sezione javax.servlet repository. Nel momento in cui scriviamo questa guida, siamo giunti alla versione 4.0.0 

https://javaee.github.io/servlet-spec/

Ne alleghiamo anche una versione in questa pagina per semplificare la vita al lettore meno pratico.

Una volta reperito il jar, va aggiunto al nostro progetto. In genere, cliccando col tasto destro sul nome del progetto nel vostro IDE preferito ci sono delle voci per la gestione delle librerie o similari. Sconsiglio IntelliJ IDEA, seppur un ottimo IDE, nella versione gratuita Community non prevede esplicitamente tool ed esempi per la gestione di applicazioni EE, rendendoci la vita un po’ più complicata. Se volessimo usarlo clicchiamo sul nome del progetto col destro del mouse, cerchiamo e clicchiamo la voce Open Module Settings -> Libraries -> Tasto + -> scegliamo il percorso dove abbiamo scaricato il file JAR. Se invece usiamo Apache NetBeans, possiamo creare un progetto con Gradle, scegliere la voce “Web application”. Dopo qualche secondo, ci viene creata la struttura del nostro progetto.

 

Il codice della servlet

Veniamo al codice finalmente. Creiamo nel nostro progetto, nella cartella src, se prevista, un nuovo file .java, lo rinominiamo CiaoMondo.java e ci incolliamo il seguente codice che andiamo a commentare:

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;

public class CiaoMondo extends HttpServlet
{

    private String msg;

    public void init() throws ServletException
    {
         msg = "Ciao Mondo!";
    }

    //Metodo std che scatta quando arriva una richiesta GET el server su cui gira il nostro codice
    public void doGet(HttpServletRequest request,
                      HttpServletResponse response)  throws ServletException, IOException
    {
        // Imposta il tipo di risposta, ovvero una pagina html
        response.setContentType("text/html");

        // La logica semplice del nostro script
        PrintWriter out = response.getWriter();
            out.println("<!DOCTYPE html>");
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet Ciao Mondo</title>");            
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>" + msg + "</h1>");
            out.println("</body>");
            out.println("</html>");
    }

    public void destroy() {}
}

Come si vede, la forma è in tutto e per tutto quella di una classe Java, preceduta dall’importazione delle librerie necessarie. La classe estende necessariamente la classe madre HttpServlet e contiene oggetti pubblici e privati a piacere per gestire la funzionalità da raggiungere. Quello che non deve mancare sono i metodi init e destroy per la inizializzazione e distruzione della istanza della classe e un metodo per restituire un risultato come il doGet dell’esempio. Ne esistono diversi altri specifici:

  • doGet per la gestione di richieste HTTP GET
  • doPost per la gestione delle richieste HTTP POST
  • doHead per la gestione di richieste HTTP HEAD

Meno interessanti per i nostri esercizi:

  • doPut per la gestione delle richieste HTTP PUT
  • doDelete per la gestione HTTP DELETE
  • doOptions per la gestione di richieste HTTP OPZIONI
  • doTrace per la gestione delle richieste HTTP TRACE

In alcuni IDE, viene aggiunta la dicitura @override sopra questi metodi per indicare che sono appunto estensione di quelli standard esistenti.

Compilazione ed esecuzione

E’ giunto il momento di compilare la nostra applicazione. Se abbiamo usato un IDE con funzionalità EE, in fase di build verrà compilata la classe e verrà creato tutto quello che occorre al server Tomcat per interagire con la classe in questione. In particolare assicuriamoci che ci sia oltre ad una cartella contenitore del progetto, la cartella META-INF e WEB-INF con all’interno due file xml che possiamo lasciare invariati. NElla cartella WEB-INF dovremo assicurarci che ci sia la cartella CLASSES con dentro il nostro file classe “compilato” CiaoMondo.class. PReleviamo tutto e portiamo nella cartella di runtime di tomcat. Se siamo su Linux, /var/lib/tomcat9/webapps e piazziamo li la nostra cartella CiaoMondo. Apriamo un browser e nella barra digitiamo

http://localhost:8080/CiaoMondo/CiaoMondo

La porta 8080 è quella usata dal mio server tomcat che coesiste con quello apache sulla porta :80. La prima CiaoMondo è la cartella che contiene i nostri file (e potete chiamarla come volete). la seconda è CiaoMondo è l’invocazione della classe creata che di default restituisce il metodo doGet col suo codice.

Ultima modifica 27 Gennaio 2022

Lascia un commento