Migration de Strut 2.3 vers 2.5


Nous avons développé pour le compte d’un client des applications web s’appuyant sur le framework Struts dont la version était la 2.3.35.
Cette version est bien plus ancienne que la dernière version proposée par la Fondation Apache. Le site officiel annonce que Struts 6.0.3 GA est disponible depuis le 15 septembre 2022 (https://struts.apache.org/).

Or, certaines failles de sécurité ont été annoncées sur Struts 2.3.35. Pour contourner ce problème, il nous est demandé de monter en version Struts 2.5.
Durant les travaux de la mise à jour, nous avons constaté qu’il ne suffisait pas de changer quelques valeurs dans les fichiers pom (ces applications utilisent Maven).

Il m’est paru intéressant de noter les difficultés rencontrées pour ceux qui ont besoin de faire la même opération (car parfois, il faut maintenir les applications historiques…).

Tout d’abord, il existe un site web officiel qui décrit les étapes à suivre pour la migration de la version 2.3 vers 2.5 (https://cwiki.apache.org/confluence/display/WW/Struts+2.3+to+2.5+migration).
Ensuite, la première chose que j’ai faite était de suivre toutes les étapes proposées dans ce guide de la migration.
Cependant, malgré le fait d’avoir suivi toutes ces étapes, j’ai découvert que mon application ne fonctionnait plus comme avant.
Ce qui a rendu difficile cette migration, c’est qu’elle utilise la bibliothèque Tiles et le plugin JQuery.
Le guide de la migration ne parle pas vraiment de l’impact sur la migration de ces bibliothèques.

Dans cet article, je vais aborder les travaux supplémentaires que j’ai effectués pour répondre à la migration.

1. Tiles

Le guide de la migration indique que la version du Tiles supportée est passée de Tiles2 à Tiles3.
Par ailleurs, le guide de la migration a été mis à jour fin 2020. Cela veut dire que 2 ans se sont écoulés au moment de mes travaux.
Lorsque je me suis rendu sur le site du Tiles, une mauvaise surprise m’attendait : =>

Avec le projet Tiles en « retrait », la bibliothèque ne sera plus maintenue. Or, mon application s’appuie sur cette bibliothèque….
Il faudrait réécrire les codes html/jsp sans Tiles un jour. En attendant, la dernière version 3.0.8 est utilisée.;

2. Plugin JQuery

Le guide de la migration ne mentionne pas la version compatible du plugin JQuery. Heureusement, le site du plugin (https://github.com/struts-community-plugins/struts2-jquery) détaille la compatibilité de version :

Pour Struts 2.5, le plugin Jquery est la version 4.0.3. Dans le pom, les versions sont modifiées comme suit :
Avant :
<struts.version>2.3.35</struts.version>
<jquery.plugins.version>3.7.1</jquery.plugins.version>
<tiles.version>2.2.2</tiles.version>

Après :
<struts.version>2.5.30</struts.version>
<jquery.plugins.version>4.0.1</jquery.plugins.version>
<tiles.version>3.0.8</tiles.version>

3. Modification en Java

Le changement de la version Tiles a eu un impact sur le code Java. La classe ci-dessous n’existe plus :
org.apache.tiles.context.TilesRequestContext

La méthode execute() de la classe FormPrepare prenait un paramètre de TitlesRequestContext. Celui-ci a été remplacé par le paramètre objet Request comme le montre l’image :

4. Modification en JSP

Le guide de la migration indique les modifications suivantes :

1. Remplacement de l’attribut id par var pour certains tags struts :
Après vs Avant (cf. image).

2. Remplacement de l’attribut id et name par var pour le tag

3. Suppression du tag à remplacer par l’attribut html :
Après vs Avant dans l’image. Remarquez que l’attribut cssClass est aussi remplacé par class.

En plus de ces points, d’autres modifications étaient nécessaires. J’ai découvert diverses anomalies au fur et à mesure en testant l’application.

  1. S :password

Avant :

<s:password id=“password” key=“password” required=“true” cssClass=“formField”
cssErrorClass=“errorInput”/>

Après
<s:password id=”password” key=”password” requiredlabel=”true” cssClass=”formField”
cssErrorClass=”errorInput”/>

  1. <sj:submit>
    Il faut ajouter l’attribut formids si la balise est à l’extérieur de <form>