8.1 Introduction aux annotations de servlet

À partir de la version 7, Tomcat a commencé à prendre en charge la spécification de servlet Web Servlet API 3.0 . En particulier, un package y est apparu appelé javax.servlet.annotation. Il contient différents types d'annotations qui peuvent être utilisées pour annoter une classe de servlet. Si vous utilisez une annotation, le descripteur de déploiement (web.xml) n'est pas requis.

Liste des annotations les plus utiles :

annotation Description
1 @WebServlet Déclare une servlet
2 @WebInitParam Spécifie un paramètre d'initialisation
3 @WebFilter Déclare un filtre Web
4 @WebListener Déclare le lecteur Web
5 @ServletSecurity Permet de configurer les paramètres de sécurité

Exemple:

@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!");
    }
}

Une annotation suffit pour déclarer un servlet et le mapper pour servir toutes les requêtes qui arriveront à l'URL donnée par le /api/*.

8.2 Configuration du mappage de servlet

L'annotation a @WebServletde nombreux paramètres qui permettent une configuration très flexible du servlet qu'elle décrit. Voyons les principales :

Attribut Description
1 name Nom unique du servlet (comme dans web.xml)
2 displayName Nom de servlet lisible par l'homme
3 description Description du servlet
4 value Définit l'URL pour le mappage
5 urlPatterns Spécifie une liste d'URL à mapper (utilisée à la place de la valeur)
6 initParams Permet de définir les paramètres de démarrage du servlet
7 asyncSupported Spécifie que le servlet peut s'exécuter de manière asynchrone (HTTP/2)
8 loadOnStartup Numéro de séquence pour contrôler la priorité de démarrage du servlet
9 smallIcon Définit une petite icône de servlet
dix largeIcon Définit une grande icône de servlet

Il y a plusieurs points intéressants ici.

Tout d'abord, notez que valueet urlPatternssont des attributs interchangeables. Ils vous permettent tous les deux de spécifier une liste d'URL vers lesquelles la servlet doit être mappée.

Deuxièmement, le paramètre asyncSupportedindique si le servlet traitera correctement les requêtes asynchrones via le protocole HTTP/2.

Et le troisième attribut important est initParams, il vous permet de définir une liste de paramètres qui seront placés dans le ServletContext.

Exemple:

@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 Configuration du mappage des filtres

Comme mentionné ci-dessus, les filtres sont un type utilitaire de servlets, et ils sont configurés comme des servlets. Voici les attributs d'une annotation @WebFilter:

Attribut Description
1 filterName Nom unique du filtre (comme dans web.xml)
2 displayName Nom du filtre lisible par l'homme
3 description Description du filtre
4 value / urlPatterns Définit une liste d'URL à mapper
5 dispatcherTypes Spécifie une liste de DispatcherTypes
6 servletNames Spécifie une liste de servlets à appliquer
7 initParams Permet de définir les paramètres de démarrage du filtre
8 asyncSupported Spécifie que le filtre peut s'exécuter de manière asynchrone (HTTP/2)
9 smallIcon Définit une petite icône de filtre
dix largeIcon Définit une grande icône de filtre

Un exemple de filtre qui intercepte toutes les requêtes vers des servlets spécifiques :

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

Un exemple de filtre avec plusieurs paramètres :

@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 exemple de type de filtre donné pour RequestDispatcher :

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

Vous en apprendrez plus sur le but des filtres et des servlets dans les conférences suivantes.