Introduzione a Java Servlet

1. Panoramica

In questo articolo, daremo uno sguardo a un aspetto fondamentale dello sviluppo web in Java: i servlet.

2. Il servlet e il contenitore

In poche parole, un Servlet è una classe che gestisce le richieste, le elabora e risponde con una risposta.

Ad esempio, possiamo utilizzare un servlet per raccogliere input da un utente tramite un modulo HTML, eseguire query sui record da un database e creare pagine web dinamicamente.

I servlet sono sotto il controllo di un'altra applicazione Java chiamata Servlet Container. Quando un'applicazione in esecuzione in un server Web riceve una richiesta , il Server passa la richiesta al Servlet Container, che a sua volta la passa al Servlet di destinazione.

3. Dipendenze di Maven

Per aggiungere il supporto Servlet nella nostra app web, il javax . è richiesta la dipendenza servlet-api :

 javax.servlet javax.servlet-api 3.1.0 

L'ultima dipendenza da Maven può essere trovata qui.

Ovviamente, dovremo anche configurare un contenitore Servlet in cui distribuire la nostra app; questo è un buon punto di partenza su come distribuire un WAR su Tomcat.

4. Ciclo di vita dei servlet

Esaminiamo l'insieme di metodi che definiscono il ciclo di vita di un servlet.

4.1. dentro()

Il metodo init è progettato per essere chiamato una sola volta. Se un'istanza del servlet non esiste, il contenitore web:

  1. Carica la classe servlet
  2. Crea un'istanza della classe servlet
  3. Lo inizializza chiamando il metodo init

Il metodo init deve essere completato correttamente prima che il servlet possa ricevere qualsiasi richiesta. Il contenitore servlet non può mettere in servizio il servlet se il metodo init genera una ServletException o non restituisce entro un periodo di tempo definito dal server Web.

public void init() throws ServletException { // Initialization code like set up database etc.... }

4.2. servizio()

Questo metodo viene chiamato solo dopo che il metodo init () del servlet è stato completato con successo .

Il contenitore chiama il metodo service () per gestire le richieste provenienti dal client, interpreta il tipo di richiesta HTTP ( GET , POST , PUT , DELETE , ecc.) E chiama i metodi doGet , doPost , doPut , doDelete , ecc. Come appropriato.

public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { // ... }

4.3. distruggere()

Chiamato dal Servlet Container per mettere fuori servizio il Servlet.

Questo metodo viene chiamato solo una volta terminati tutti i thread all'interno del metodo di servizio del servlet o dopo che è trascorso un periodo di timeout. Dopo che il contenitore ha chiamato questo metodo, non chiamerà più il metodo di servizio sul servlet.

public void destroy() { // }

5. Servlet di esempio

Impostiamo ora un esempio completo di gestione delle informazioni utilizzando un modulo.

Per iniziare, definiamo un servlet con un mapping / calcolaServlet che acquisirà le informazioni POST inserite dal form e restituirà il risultato utilizzando un RequestDispatcher:

@WebServlet(name = "FormServlet", urlPatterns = "/calculateServlet") public class FormServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String height = request.getParameter("height"); String weight = request.getParameter("weight"); try { double bmi = calculateBMI( Double.parseDouble(weight), Double.parseDouble(height)); request.setAttribute("bmi", bmi); response.setHeader("Test", "Success"); response.setHeader("BMI", String.valueOf(bmi)); RequestDispatcher dispatcher = request.getRequestDispatcher("index.jsp"); dispatcher.forward(request, response); } catch (Exception e) { response.sendRedirect("index.jsp"); } } private Double calculateBMI(Double weight, Double height) { return weight / (height * height); } }

Come mostrato sopra, le classi annotate con @WebServlet devono estendere la classe javax.servlet.http.HttpServlet . È importante notare che l' annotazione @WebServlet è disponibile solo da Java EE 6 in poi.

L' annotazione @WebServlet viene elaborata dal contenitore al momento della distribuzione e il servlet corrispondente viene reso disponibile nei pattern URL specificati. Vale la pena notare che utilizzando l'annotazione per definire i pattern URL, possiamo evitare di utilizzare il descrittore di distribuzione XML denominato web.xml per la nostra mappatura servlet.

Se desideriamo mappare il Servlet senza annotazioni, possiamo invece utilizzare il tradizionale web.xml :

  FormServlet com.root.FormServlet   FormServlet /calculateServlet  

Successivamente, creiamo un modulo HTML di base :


    
Your Weight (kg) :
Your Height (m) :

${bmi}

Infine, per assicurarci che tutto funzioni come previsto, scriviamo anche un breve test:

public class FormServletLiveTest { @Test public void whenPostRequestUsingHttpClient_thenCorrect() throws Exception { HttpClient client = new DefaultHttpClient(); HttpPost method = new HttpPost( "//localhost:8080/calculateServlet"); List nvps = new ArrayList(); nvps.add(new BasicNameValuePair("height", String.valueOf(2))); nvps.add(new BasicNameValuePair("weight", String.valueOf(80))); method.setEntity(new UrlEncodedFormEntity(nvps)); HttpResponse httpResponse = client.execute(method); assertEquals("Success", httpResponse .getHeaders("Test")[0].getValue()); assertEquals("20.0", httpResponse .getHeaders("BMI")[0].getValue()); } }

6. Servlet, HttpServlet e JSP

È importante capire che la tecnologia Servlet non è limitata al protocollo HTTP.

In pratica lo è quasi sempre, ma Servlet è un'interfaccia generica e HttpServlet è un'estensione di tale interfaccia - aggiungendo il supporto specifico HTTP - come doGet e doPost , ecc.

Infine, la tecnologia Servlet è anche il driver principale di una serie di altre tecnologie web come JSP - JavaServer Pages, Spring MVC, ecc.

7. Conclusione

In questo rapido articolo, abbiamo introdotto le basi dei servlet in un'applicazione web Java.

Il progetto di esempio può essere scaricato ed eseguito così com'è come un progetto GitHub.