mika-el
4/3/2018 - 1:27 PM

Annotations

  • L'annotations est un système introduit avec Java EE 5 qui va nous permettre de nous débarrasser de notre fichier web.xml !
  • Une annotation est tout simplement une description d'un élément. Elle peut ainsi s'appliquer à un package, une classe, une interface, un constructeur, une méthode, un champ, un argument de méthode, une variable locale ou encore à une autre annotation.
  • La raison d'être des annotations est de permettre de simplifier considérablement le processus de développement et de maintenance d'une application.
  • Elles permettent de simplifier le processus de développement et de maintenance d'une application parce qu'une annotation est écrite directement dans le code, au sein d'une classe ou d'une méthode. Ainsi, l'information associée à un élément du code est accessible et visible directement. Il n'est pas nécessaire de se référer à des données écrites dans des fichiers externes. De même, lors de la phase de développement il n'est pas nécessaire de créer et maintenir ces fichiers externes.
  • Une annotation, sous sa forme la plus simple, est uniquement constituée d'un mot-clé précédé du signe @.
  • Il est possible de créer ses propres annotations si besoin.
  • les valeurs précisées dans toutes vos annotations sont en réalité considérées par le conteneur comme des valeurs par défaut:
    • Si vous déclarez à la fois une annotation et une section dans le fichier web.xml, alors les données de la section du web.xml seront prises en compte quoi qu'il arrive.
    • Si vous mappez en même temps une servlet sur une URL depuis une section dans le web.xml, et sur une autre URL depuis une annotation, alors la servlet sera en fin de compte mappée sur les deux URL.
    • Dans le cas de paramètres à valeur unique comme les @WebInitParam, en cas de double définition c'est la valeur contenue dans le web.xml qui sera prise en compte, et celle contenue dans l'annotation sera ignorée.

Syntaxe sans paramètres

@Override

Une annotation, sous sa forme la plus simple, est uniquement constituée d'un mot-clé précédé du signe @.

Syntaxe avec paramètres

@WebServlet(name="TestServlet", urlPatterns = {"/test", "/ok"})

  • une annotation peut attendre un ou plusieurs paramètres, séparés par une virgule et placés entre parenthèses juste après l'annotation. Dans cet exemple, les paramètres sont nommés name et urlPatterns.
  • un paramètre peut attendre une ou plusieurs valeurs :
    • si une seule valeur est attendue, celle-ci est placée entre guillemets et liée au paramètre par le symbole =. Ici, le paramètre name attend une unique valeur définie à "TestServlet".
    • si plusieurs valeurs sont attendues, celles-ci sont placées entre guillemets, séparées par une virgule et l'ensemble ainsi formé est placé entre accolades, puis lié au paramètre par le symbole = (en somme, la syntaxe d'initialisation d'un tableau). Ici, le paramètre urlPatterns reçoit deux valeurs définies respectivement à "/test" et "/ok".

@Override

  • Elle est constituée du caractère @ suivi du mot-clé Override, et elle est placée juste avant le début de la méthode.
  • Cette annotation est doublement utile :
    • Elle permet de préciser au compilateur qu'une méthode redéfinit une méthode d'une interface. En cas d'erreur - c'est-à-dire si le nom de la méthode ne correspond à aucune méthode d'aucune interface - alors le compilateur doit prévenir le développeur et éventuellement faire échouer la compilation.
    • Elle rend le code plus lisible, en différenciant les méthodes redéfinies des autres. Ceci est renforcé par les comportements intuitifs introduits dans la plupart des IDE, qui marquent visuellement de telles méthodes.

@WebServlet

@WebServlet(urlPatterns = {"/test", "/ok"}) ou @WebServlet(urlPatterns = "/test")

  • Elle peut accepter tous les paramètres qu'il est possible de définir dans une section <servlet> ou <servlet-mapping> du fichier web.xml.
  • Il faut placer l'annotation juste avant la déclaration de la classe dans le code de votre servlet.
  • Il n'est pas nécessaire de préciser le contenu de <servlet-class> dans l'annotation : puisque celle-ci se trouve directement dans le code de la servlet, le compilateur sait déjà à quelle classe elle s'applique.
  • La propriété name de la servlet n'est plus utile. Dans le fichier web.xml, le champ <servlet-name> servait à établir un lien entre les sections et <servlet-mapping>, mais maintenant que nous précisons directement l'url-pattern dans l'annotation de la servlet, son nom ne nous sert plus à rien.
  • Puisque les méta-données sont maintenant présentes directement dans le code de votre servlet, il n'est plus nécessaire de redémarrer Tomcat à chaque modification du nom de la servlet ou encore de son url-pattern : les modifications sont prises en compte presque instantanément !

@WebFilter

@WebFilter(urlPatterns = "/restreint/*")

  • Très similaire @WebServlet, @WebFilter permet de déclarer un filtre.
  • Elle accepte toutes les propriétés définissables depuis une section <filter> ou <filter-mapping> du fichier web.xml.
  • Il est impossible de préciser dans quel ordre vous souhaitez appliquer différents filtres mappés sur une même requête. Ainsi, si vous souhaitez organiser vos filtres et définir un ordre d'exécution précis, vous devrez continuer à les déclarer dans votre fichier web.xml.
  • Toutefois, si vous souhaitez limiter l'encombrement de votre web.xml, vous pourrez toujours utiliser des annotations pour remplacer les sections , et vous contenter d'y écrire les sections <filter-mapping>. C'est tout ce dont le conteneur a besoin pour définir l'ordre d'exécution des filtres !
  • Notez cependant que ce découpage, à savoir les annotations d'un côté pour remplacer les sections , et le fichier web.xml de l'autre pour écrire les sections <filter-mapping>, ne fonctionne avec Tomcat que depuis la version 7.0.28 !
  • Il existe un cas particulier dans lequel vous ne pourrez pas utiliser l'annotation @WebFilter : lorsque le filtre que vous appliquez ne fait pas partie de votre application ! Par exemple, dans notre projet nous utilisons le filtre natif de Tomcat nommé Set Character Encoding, afin de compléter la gestion de l'UTF-8. Eh bien pour ce cas précis, nous n'avons pas d'autre choix que de déclarer le filtre à la main dans le web.xml de notre application.

@WebInitParam

@WebServlet(urlPatterns = "/fichiers/*", initParams = @WebInitParam(name = "chemin", value = "/fichiers/"))

  • @WebInitParam est une annotation qui ne peut être utilisée qu'au sein d'une annotation @WebServlet ou @WebFilter.
  • Elle est destinée à remplacer la section <init-param> qu'il est possible d'inclure aux déclarations d'une servlet ou d'un filtre dans le fichier web.xml.
  • Seuls deux attributs sont requis : un attribut name et un attribut value, remplaçant respectivement <param-name> et <param-value>.

@WebListener

@WebListener

  • Remplace <listener> du fichier web.xml.
  • Il faut placer l'annotation juste avant la déclaration de la classe dans le code de votre listener.

@MultipartConfig

  • Remplace <multipart-config> du fichier web.xml.
  • Nous pouvons préciser quatre paramètres : location, fileSizeThreshold, maxFileSize et maxRequestSize.
  • @MultipartConfig est indépendante et doit donc être spécifiée à part.
  • Côté syntaxe, vous pouvez relever deux points intéressants :
    • Lorsqu'un paramètre attendu est de type numérique, il ne faut pas l'entourer de guillemets comme nous le faisions jusqu'alors pour tous nos paramètres de type String.
    • Lorsqu'un paramètre attendu est de type numérique, il est possible d'utiliser des opérateurs mathématiques simples dans sa valeur. Ici, j'ai utilisé l'opérateur de multiplication * afin de rendre visible au premier coup d’œil le fait que notre servlet limite les tailles respectivement à 10 Mo, 5x10 Mo et 1 Mo.
@WebServlet(urlPatterns = "/upload", initParams = @WebInitParam(name = "chemin", value = "/fichiers/"))
@MultipartConfig(location = "c:/fichiers", maxFileSize = 10 * 1024 * 1024, maxRequestSize = 5 * 10 * 1024 * 1024, fileSizeThreshold = 1024 * 1024)
public class Upload extends HttpServlet {
  ...
}