Guide des annotations Web Java EE

1. Vue d'ensemble

Les annotations Java EE facilitent la vie des développeurs en leur permettant de spécifier le comportement des composants d'application dans un conteneur. Ce sont des alternatives modernes pour les descripteurs XML et, fondamentalement, permettent d'éviter le code standard.

Dans cet article, nous nous concentrerons sur les annotations introduites avec Servlet API 3.1 dans Java EE 7. Nous examinerons leur objectif et leur utilisation.

2. Annotations Web

Servlet API 3.1 a introduit un nouvel ensemble de types d'annotations qui peuvent être utilisés dans les classes Servlet :

  • @WebServlet
  • @WebInitParam
  • @WebFilter
  • @WebListener
  • @ServletSecurity
  • @HttpConstraint
  • @HttpMethodConstraint
  • @MultipartConfig

Nous les examinerons en détail dans les sections suivantes.

3. @WebServlet

En termes simples, cette annotation nous permet de déclarer les classes Java en tant que servlets :

@WebServlet("/account") public class AccountServlet extends javax.servlet.http.HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { // ... } public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { // ... } }

3.1. Utilisation des attributs de l' annotation @WebServlet

@WebServlet a un ensemble d'attributs qui nous permettent de personnaliser le servlet:

  • Nom
  • la description
  • urlPatterns
  • initParams

Nous pouvons les utiliser comme indiqué dans l'exemple ci-dessous:

@WebServlet( name = "BankAccountServlet", description = "Represents a Bank Account and it's transactions", urlPatterns = {"/account", "/bankAccount" }, initParams = { @WebInitParam(name = "type", value = "savings")}) public class AccountServlet extends javax.servlet.http.HttpServlet { String accountType = null; public void init(ServletConfig config) throws ServletException { // ... } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { // ... } public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { // ... } }

L' attribut name remplace le nom de servlet par défaut qui est le nom de classe complet par défaut. Si nous voulons fournir une description de ce que fait le servlet, nous pouvons utiliser l' attribut description .

L' attribut urlPatterns est utilisé pour spécifier la ou les URL sur lesquelles le servlet est disponible (plusieurs valeurs peuvent être fournies à cet attribut comme indiqué dans l'exemple de code).

4. @WebInitParam

Cette annotation est utilisée avec l' attribut initParams de l' annotation @WebServlet et les paramètres d'initialisation du servlet.

Dans cet exemple, nous définissons un type de paramètre d'initialisation de servlet , sur la valeur `` économies '':

@WebServlet( name = "BankAccountServlet", description = "Represents a Bank Account and it's transactions", urlPatterns = {"/account", "/bankAccount" }, initParams = { @WebInitParam(name = "type", value = "savings")}) public class AccountServlet extends javax.servlet.http.HttpServlet { String accountType = null; public void init(ServletConfig config) throws ServletException { accountType = config.getInitParameter("type"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { // ... } }

5. @WebFilter

Si nous voulons modifier la requête et la réponse d'un servlet sans toucher à sa logique interne, nous pouvons utiliser l' annotation WebFilter . Nous pouvons associer des filtres à un servlet ou à un groupe de servlets et de contenu statique en spécifiant un modèle d'URL.

Dans l'exemple ci-dessous, nous utilisons l' annotation @WebFilter pour rediriger tout accès non autorisé à la page de connexion:

@WebFilter( urlPatterns = "/account/*", filterName = "LoggingFilter", description = "Filter all account transaction URLs") public class LogInFilter implements javax.servlet.Filter { public void init(FilterConfig filterConfig) throws ServletException { } public void doFilter( ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response; res.sendRedirect(req.getContextPath() + "/login.jsp"); chain.doFilter(request, response); } public void destroy() { } }

6. @WebListener

Si nous voulons savoir ou contrôler comment et quand un servlet et ses requêtes sont initialisés ou modifiés, nous pouvons utiliser l' annotation @WebListener .

Pour écrire un écouteur Web, nous devons étendre une ou plusieurs des interfaces suivantes:

  • ServletContextListener - pour les notifications sur le cycle de vie ServletContext
  • ServletContextAttributeListener - pour les notifications lorsqu'un attribut ServletContext est modifié
  • ServletRequestListener - pour les notifications chaque fois qu'une demande de ressource est faite
  • ServletRequestAttributeListener - pour les notifications lorsqu'un attribut est ajouté, supprimé ou modifié dans un ServletRequest
  • HttpSessionListener - pour les notifications lorsqu'une nouvelle session est créée et détruite
  • HttpSessionAttributeListener - pour les notifications lorsqu'un nouvel attribut est ajouté ou supprimé d'une session

Voici un exemple de la façon dont nous pouvons utiliser un ServletContextListener pour configurer une application Web:

@WebListener public class BankAppServletContextListener implements ServletContextListener { public void contextInitialized(ServletContextEvent sce) { sce.getServletContext().setAttribute("ATTR_DEFAULT_LANGUAGE", "english"); } public void contextDestroyed(ServletContextEvent sce) { // ... } }

7. @ServletSecurity

Lorsque nous voulons spécifier le modèle de sécurité de notre servlet, y compris les rôles, le contrôle d'accès et les exigences d'authentification, nous utilisons l'annotation @ServletSecurity .

Dans cet exemple , nous allons limiter l' accès à notre AccountServlet en utilisant la @ServletSecurity annotation:

@WebServlet( name = "BankAccountServlet", description = "Represents a Bank Account and it's transactions", urlPatterns = {"/account", "/bankAccount" }, initParams = { @WebInitParam(name = "type", value = "savings")}) @ServletSecurity( value = @HttpConstraint(rolesAllowed = {"Member"}), httpMethodConstraints = {@HttpMethodConstraint(value = "POST", rolesAllowed = {"Admin"})}) public class AccountServlet extends javax.servlet.http.HttpServlet { String accountType = null; public void init(ServletConfig config) throws ServletException { // ... } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { // ... } public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { double accountBalance = 1000d; String paramDepositAmt = request.getParameter("dep"); double depositAmt = Double.parseDouble(paramDepositAmt); accountBalance = accountBalance + depositAmt; PrintWriter writer = response.getWriter(); writer.println(" Balance of " + accountType + " account is: " + accountBalance + ""); writer.flush(); } }

Dans ce cas, lors de l'appel du AccountServlet, le navigateur affiche un écran de connexion pour que l'utilisateur entre un nom d'utilisateur et un mot de passe valides.

Nous pouvons utiliser les annotations @HttpConstraint et @HttpMethodConstraint pour spécifier des valeurs pour la valeur des attributs et httpMethodConstraints, de l' annotation @ServletSecurity .

L' annotation @HttpConstraint s'applique à toutes les méthodes HTTP. En d'autres termes, il spécifie la contrainte de sécurité par défaut.

@HttpConstraint a trois attributs:

  • valeur
  • rôlesAutorisé
  • transportGarantie

Out of these attributes, the most commonly used attribute is rolesAllowed. In the example code snippet above, users who belong to the role Member are allowed to invoke all HTTP methods.

@HttpMethodConstraint annotation allows us to specify the security constraints of a particular HTTP method.

@HttpMethodConstraint has the following attributes:

  • value
  • emptyRoleSemantic
  • rolesAllowed
  • transportGuarantee

In the example code snippet above, it shows how the doPost method is restricted only for users who belong to the Admin role, allowing the deposit function to be done only by an Admin user.

8. @MultipartConfig

This annotation is used when we need to annotate a servlet to handle multipart/form-data requests (typically used for a File Upload servlet).

This will expose the getParts() and getPart(name) methods of the HttpServletRequest can be used to access all parts as well as an individual part.

The uploaded file can be written to the disk by calling the write(fileName) of the Part object.

Now we will look at an example servlet UploadCustomerDocumentsServlet that demonstrates its usage:

@WebServlet(urlPatterns = { "/uploadCustDocs" }) @MultipartConfig( fileSizeThreshold = 1024 * 1024 * 20, maxFileSize = 1024 * 1024 * 20, maxRequestSize = 1024 * 1024 * 25, location = "./custDocs") public class UploadCustomerDocumentsServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { for (Part part : request.getParts()) { part.write("myFile"); } } }

@MultipartConfig has four attributes:

  • fileSizeThreshold - Il s'agit du seuil de taille lors de l'enregistrement temporaire du fichier téléchargé. Si la taille du fichier téléchargé est supérieure à ce seuil, il sera stocké sur le disque. Sinon, le fichier est stocké en mémoire (taille en octets)
  • maxFileSize - C'est la taille maximale du fichier téléchargé (taille en octets)
  • maxRequestSize - Il s'agit de la taille la plus élevée de la demande, y compris les fichiers téléchargés et d'autres données de formulaire (taille en octets)
  • location - Le est le répertoire dans lequel les fichiers téléchargés sont stockés

9. Conclusion

Dans cet article, nous avons examiné quelques annotations Java EE introduites avec l'API Servlet 3.1, leur objectif et leur utilisation.

Le code source lié à cet article est disponible à l'adresse over sur GitHub.