Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici

Gestion des exceptions et des erreurs sous Struts 2

Introduction

La gestion des exceptions est primordiale dans un projet web, elle apporte une sécurité de traitement au code.

La gestion des erreurs permet de gérer les messages émis par une application durant son exécution et donc est très utile dans les phases de mise au point du logiciel. Elle est également primordiale lors de l’exploitation en production d’une application web. Elle permet notamment d’analyser rapidement la nature du dysfonctionnement intervenu si, par exemple, l’application ne démarre plus ou n’est plus disponible.

Balise exception

L’attribut exception permet de spécifier le type d’erreur à intercepter.

Par exemple, s’il s’agit d’intercepter une erreur de type SQL dans le cas d’une classe d’action qui exécute une requête, nous spécifierons la valeur java.sql.SQLException pour le type de l’exception.

<global-exception-mappings 
    <exception-mapping exception="java.sql.SQLException"  
result="dbError"/> 
</global-exception-mappings> 

Par exemple, s’il s’agit d’intercepter une erreur de type NullPointerException, nous spécifierons la valeur java.lang.NullPointerException pour le type de l’exception.

<global-exception-mappings 
    <exception-mapping exception= 
"java.lang.NullPointerException" result="result"/> 
</global-exception-mappings> 

Balise global-exception

Struts 2 permet de spécifier, dans le fichier struts.xml, la façon dont il faut gérer les exceptions non interceptées. La logique de gestion peut s’appliquer à toutes les actions (gestion globale des exceptions) ou à une action spécifique. Voyons d’abord comment activer la gestion globale des exceptions.

Pour activer la gestion globale des exceptions, vous devez ajouter deux nœuds à struts.xml : global-exception-mapping et global-results. Par exemple, examinez le fichier struts.xml du projet de gestion des exceptions.

<global-exception-mappings> 
    <exception-mapping exception="java.lang.Exception"  
result="error"/> 
    <exception-mapping exception="java.sql.SQLException"  
result="dbError"/> 
</global-exception-mappings> 
 
<global-results> 
    <result name="error">/Error.jsp</result> 
    <result name="dbError">/DBError.jsp</result> 
</global-results> 

Ici, la balise global-exception-mappings indique au framework Struts 2 ce qu’il faut faire si une exception non interceptée du type spécifié (ou un enfant de ce type) est levée par l’application. Par exemple, si une SecurityBreachException est levée mais pas interceptée, la classe Struts 2 action renvoie un résultat de type securityerror. Toutes les autres exceptions non interceptées entraînent la classe Struts 2 action à renvoyer un résultat d’erreur.

La balise global-results, nœud de mappage des résultats globaux, associe la valeur du résultat à une page de type JSP spécifique. Par exemple...

Balise exception-mapping

Concernant la gestion des exceptions, Struts met à disposition la balise <exception-mapping/>. Elle permet de gérer les exceptions qui ne sont pas traitées dans les classes de type action.

Cette balise contient deux attributs qui sont exception, pour spécifier le type d’exception à attraper et result qui permet de préciser le résultat à déclencher en cas de levée d’exception.

Voici un exemple d’utilisation de la balise <exception-mapping>.

Tout d’abord définissons la classe d’action ClientAction.java, puis le mapping entre l’action et la page JSP dans struts.xml avec l’introduction de la balise <exception-mapping> et enfin la page JSP qui correspondra à la page de redirection en cas d’erreur.

Voici la classe de type action ClientAction.java :

import com.opensymphony.xwork2.ActionSupport; 
@SuppressWarnings("serial") 
public class Client extends ActionSupport { 
private String identifiant; 
private String motdepasse; 
public ClientAction() 
{ 
} 
... 
// ajouter les informations du client dans la session 
public String ajouter() 
{ 
// forcer le déclenchement d'une exception 
int exception=Integer.parseInt(this.motdepasse); 
// vérifier les saisies, en cas d'erreur retourner sur la page de saisie 
if(this.identifiant.equals("") || 
this.motdepasse.equals("")) 
{ 
return "input"; 
} 
// pas d'erreur 
else 
{ 
return "success"; 
} 
} 
} 

Voici le fichier struts.xml :

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE struts PUBLIC 
"-//Apache Software Foundation//DTD Struts Configuration...

Log4j 2

Depuis la version 2.5 de Struts, c’est la librairie Log4j 2 qui est utilisée pour la gestion des erreurs. Nous allons utiliser la dernière version de la librairie Log4j 2, la version 2.19.0. Il ne faut pas utiliser de version antérieure car en décembre 2021 une version de Log4j a présenté d’importantes vulnérabilités qui permettaient d’exécuter du côté malveillant à distance.. La vulnérabilité identifiée a affecté les versions de Log4j 2 à partir de ma version 2.0-beta9 à la version 2.14.1.

1. Ajouter Log4j 2 au projet

Pour rajouter Log4j 2 à votre projet, il suffit d’ajouter les dépendances log4j-api et log4j-core ci-dessous dans le fichier Maven pom.xml :

<dependencies> 
  <dependency> 
    <groupId>org.apache.logging.log4j</groupId> 
    <artifactId>log4j-api</artifactId> 
    <version>2.19.0</version> 
  </dependency> 
 
  <dependency> 
    <groupId>org.apache.logging.log4j</groupId> 
    <artifactId>log4j-core</artifactId> 
    <version>2.19.0</version> 
  </dependency> 
</dependencies> 

 Faites un clic droit sur le projet puis cliquez sur Maven et sur Update Project afin que les jar soient bien importés dans Maven Dependencies.

images/09ET01.png

2. Acquisition d’un logger

La méthode statique LogManager.getLogger. permet d’acquérir un logger, il faut utiliser la classe LogManager.

 Pour cela, ajoutez dans la classe Java les deux imports ci-dessous :

import org.apache.logging.log4j.LogManager; 
import...