Servlet 3.0: @WebServlet

DOMANDA:

Come si configurano le Servlet 3.0 con l'Annotation @WebServlet?


RISPOSTA:

Le Servlet 3.0 possono essere configurate in modo tradizionale aggiungendo le seguenti righe al web.xml:

<servlet>
   <servlet-name>MiaServlet</servlet-name>
   <servlet-class>it.blogspot.lancill.TestServlet</servlet-class>
   <init-param> 
      <param-name>parametro1</param-name>
      <param-value>http://lancill.blogspot.it</param-value> 
   </init-param> 
</servlet> 


<servlet-mapping> 
   <servlet-name>MiaServlet</servlet-name> 
   <url-pattern>/servlet/*</url-pattern> 
</servlet-mapping>

Con questa configurazione la nostra Servlet, di nome MiaServlet, riceverà un parametro di inizializzazione (parametro1) valorizzato con "http://lancill.blogspot.it" e risponderà a qualunque url che comincerà per "/servlet/". Quindi se digitiamo nell'url http://www.nomesito.it/servlet/qualsiasicosavabene oppure http://www.nomesito.it/servlet/pippo, il file web.xml indirizzerà la richiesta sempre alla Servlet MiaServlet.


Purtroppo capita spesso, in progetti medio-grandi, di avere miriadi di Servlet che fanno crescere a dismisura il file web.xml rendendolo di difficile consultazione e manutenibilità. 

In tal caso è perfetta la soluzione delle Annotations, introdotte di recente anche per le Servlet nella versione 3.0, che ci permettono di spostare tutti i parametri di configurazione dal web.xml al file .java della Servlet stessa.


Guardiamo come si fa con l'Annotation @WebServlet:

package it.blogspot.lancill;

@WebServlet(name="MiaServlet",
urlPatterns={"/servlet/*"},
initParams={ @InitParam(name="parametro1", 
             value="http://lancill.blogspot.it")})
public class TestServlet extends javax.servlet.http.HttpServlet {
   public void doGet(HttpServletRequest request,
                     HttpServletResponse response){

      String value = getServletConfig().getInitParameter("parametro1"); // prendo il parametro di inizializzazione
      System.out.println("Hai richiamato il metodo GET con il parametro1: " + parametro1);
   }
}

Praticamente abbiamo inserito nell'Annotation tutto quello che ci serviva (e che era contenuto nel file web.xml).

Avviando il webserver su cui gira MiaServlet e digitando da url http://www.nomesito.it/servlet/qualunquecosa, la Servlet restituirà a console il seguente output:

"Hai richiamato il metodo GET con il parametro1: http://lancill.blogspot.it"


ATTENZIONE: un problema frequente che si verifica durante la migrazione di vecchi progetti alle Servlet 3.0 è che la nuova configurazione sembra non rispondere alle richieste come accadeva invece con il file web.xml.
In tal caso è necessario assicurarsi di aver importato correttamente la nuova versione della libreria servlet-api.jar e che all'interno del web.xml stesso ci sia il tag root <web-app> con gli attributi aggiornati come quelli qui di seguito:

<web-app 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns="http://java.sun.com/xml/ns/javaee" 
      xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
      id="WebApp_ID" version="3.0">

Commenti

  1. Ciao Fabrizio, conosci anche la versione di tomcat che prevede il supporto alle servlet 3.0 oppure non è necessario preoccuparsi di questo aspetto?

    Grazie

    RispondiElimina
    Risposte
    1. Ciao Francesco,
      innanzitutto grazie per la domanda che mi permette di precisare questo aspetto fondamentale! Come indicato sul sito Apache (http://tomcat.apache.org/whichversion.html) le Servlet 3.0 sono supportate solo a partire da Tomcat 7, quindi ci dobbiamo preoccupare di questo aspetto!! :o)

      Elimina
  2. Ciao Fabrizio,

    grazie e complimenti per i tuoi contributi. Una dei pochi blog italiani su java veramente fatto bene e di notevole aiuto, soprattutto per me che sono ancora agli inizi come sviluppatore junior junior XD!

    Saluti. Gaetano.

    RispondiElimina
    Risposte
    1. Ciao Gaetano, grazie per i complimenti. Sono contento ti sia utile, spero che ti appassionerai ancora di più al mondo Java seguendoci! :o)

      Elimina
  3. Ciao Fabrizio.
    Utilizzo l'annotation WebServlet, ma ho un problema: non riesco ad assegnare il display name con l'annotation, scrivo @WebServlet(urlMappings="/xxx",displayName="Servlet X"), compilo, tutto okay, ma poi il display name non appare nel Tomcat Manager (uso il 7).
    Se invece scrivo il solo tag del display name in un web.xml, allora compare.
    Hai provato anche tu questo aspetto dell'annotation ?
    ciao e complimenti per il tuo blog
    Virgilio

    RispondiElimina
    Risposte
    1. Ciao Virgilio,
      il displayName è effettivamente un attributo previsto per l'annotazione @WebServlet, ma nella pratica non funziona come dovrebbe e non compare nel Tomcat Manager. Sembrerebbe essere un bug e, purtroppo, nemmeno Tomcat 8 RC5 risolve tale problema. Segnaliamo il bug ad Apache? :o)

      Elimina

Posta un commento

Post popolari in questo blog

Arrotondamento e troncamento in Java

Eclipse: Shortcuts (scorciatoie) da tastiera

Strutture dati: List, Set, Map

Creare un eseguibile Java