8.1 Introduzione alle annotazioni servlet

A partire dalla versione 7, Tomcat ha iniziato a supportare la specifica servlet web Servlet API 3.0 . In particolare, è apparso un pacchetto chiamato javax.servlet.annotation. Contiene vari tipi di annotazioni che possono essere utilizzate per annotare una classe servlet. Se utilizzi un'annotazione, il descrittore di distribuzione (web.xml) non è richiesto.

Elenco delle annotazioni più utili:

annotazione Descrizione
1 @WebServlet Dichiara un servlet
2 @WebInitParam Specifica un parametro di inizializzazione
3 @WebFilter Dichiara un filtro web
4 @WebListener Dichiara il web listener
5 @ServletSecurity Consente di configurare le impostazioni di sicurezza

Esempio:

@WebServlet( urlPatterns = {"/api/*"} )
public class Example extends HttpServlet {
    protected void doGet( HttpServletRequest request, HttpServletResponse response) throws Exception {
         response.setContentType("text/html");
         PrintWriter out = response.getWriter();
         out.println("Hello World!");
    }
}

Un'annotazione è sufficiente per dichiarare un servlet e mapparlo per soddisfare tutte le richieste che arriveranno all'URL fornito dal file /api/*.

8.2 Impostazione della mappatura servlet

L'annotazione ha @WebServletmolti parametri che consentono una configurazione molto flessibile del servlet che descrive. Diamo uno sguardo ai principali:

Attributo Descrizione
1 name Nome univoco del servlet (come in web.xml)
2 displayName Nome servlet leggibile dall'utente
3 description Descrizione servlet
4 value Imposta l'URL per la mappatura
5 urlPatterns Specifica un elenco di URL da mappare (utilizzato al posto del valore)
6 initParams Consente di impostare i parametri di avvio del servlet
7 asyncSupported Specifica che il servlet può essere eseguito in modo asincrono (HTTP/2)
8 loadOnStartup Numero di sequenza per controllare la priorità di avvio del servlet
9 smallIcon Imposta una piccola icona servlet
10 largeIcon Imposta una grande icona servlet

Ci sono diversi punti interessanti qui.

Innanzitutto, nota che valuee urlPatternssono attributi intercambiabili. Entrambi consentono di specificare un elenco di URL a cui il servlet deve mappare.

In secondo luogo, il parametro asyncSupportedindica se il servlet elaborerà correttamente le richieste asincrone sul protocollo HTTP/2.

E il terzo attributo importante è initParams, ti consente di impostare un elenco di parametri che verranno inseriti nel ServletContext.

Esempio:

@WebServlet(
        urlPatterns = {"/sendFile", "/uploadFile"},
        loadOnStartup = 1,
        asyncSupported = true,
        initParams = {
            @WebInitParam(name = "saveDir", value = "c:/uploaded"),
            @WebInitParam(name = "allowedTypes", value = "jpg,gif,png")
        }
)
public class ImageUploadServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws Exception {
        String saveDir = getInitParameter("saveDir");
        String fileTypes = getInitParameter("allowedTypes");

        PrintWriter writer = response.getWriter();

        writer.println("saveDir = " + saveDir);
        writer.println("fileTypes = " + fileTypes);
    }
}

8.3 Impostazione della mappatura dei filtri

Come accennato in precedenza, i filtri sono un tipo di utilità di servlet e sono configurati come servlet. Ecco gli attributi di un'annotazione @WebFilter:

Attributo Descrizione
1 filterName Filtro nome univoco (come in web.xml)
2 displayName Nome del filtro leggibile dall'uomo
3 description Filtro Descrizione
4 value / urlPatterns Imposta un elenco di URL da mappare
5 dispatcherTypes Specifica un elenco di DispatcherTypes
6 servletNames Specifica un elenco di servlet a cui applicare
7 initParams Consente di impostare i parametri iniziali del filtro
8 asyncSupported Specifica che il filtro può essere eseguito in modo asincrono (HTTP/2)
9 smallIcon Imposta una piccola icona di filtro
10 largeIcon Imposta un'icona di filtro grande

Un esempio di filtro che intercetta tutte le richieste a servlet specifici :

@WebFilter(servletNames = {"MyOwnServlet", "UploadServlet"})
public class MyFilter implements Filter {
    // implements Filter's methods here...
}

Un esempio di un filtro dati più parametri :

@WebFilter(
        urlPatterns = "/uploadFilter",
        initParams = @WebInitParam(name = "fileTypes", value = "doc;xls;zip;txt;jpg;png;gif")
)
public class UploadFilter implements Filter {
    // implements Filter's methods here...
}

Un esempio di tipi di filtro dati per RequestDispatcher :

@WebFilter(
        urlPatterns = "/admin",
        dispatcherTypes = {DispatcherType.REQUEST, DispatcherType.FORWARD}
)
public class MyFilter implements Filter {
    // implements Filter's methods here...
}

Imparerai di più sullo scopo di filtri e servlet nelle lezioni seguenti.