Intégration de struts avec spring

L’objectif de cet article est d’exposer les différentes méthodes permettant d’intégrer les frameworks struts et spring dans une même application.
Pour ceci nous allons commencer par une présentation des différentes méthodes d’intégration. Ensuite, dans une deuxième partie nous décrirons un exemple détaillé de l’implémentation d’une application qui se base sur ces deux frameworks.

Introduction

La capacité qu’à spring d’intégrer d’autres frameworks lui a conféré une grande popularité. En effet, les applications se basant sur spring bénéficient d’une grande flexibilité permettant le choix des frameworks spécialisés dans chaque couche de l’application (par exemple hibernate pour la gestion de la persistance, struts pour l’implémentation du modele MVC…)

Intégration de struts avec spring

Il existe deux méthodes pour intégrer les deux frameworks struts et spring dans une même application :
  1. La première méthode consiste à utiliser la classe ActionSupport de spring.
  2. La deuxième c’est d’utiliser le plug-in ContextLoaderPlugin.
  • Utiliser la classe ActionSupport
Pour utiliser cette méthode, les actions doivent hériter de la classe ActionSupport de spring et non de la classe Action de struts, ce qui permet l'accés à la methode getWebApplicationContext() , cette deriniére permet de récupérer le context de spring, à partir de context, ApplicationContext, nous pouvons récupérer les beans définis dans le fichier de configuration de spring.

integration spring struts methode 1


Cette méthode est simple à implémenter mais ne permet pas de manipuler les actions struts comme étant des beans. Pour accéder aux beans il faut les récupérer manuellement en passant par le context. En utilisant cette méthode l'injection de dépendance ne peut pas être implémentée pour les actions. Cette méthode crée aussi une dépendance entre les deux frameworks struts et spring.
  • Utiliser le plug-in ContextLoaderPlugin
le plug-in ContextLoaderPlugin permet de charger le context pour la servlet ActionServlet de struts. Deux méthodes sont disponibles pour intégrer ce plug-in.

La première consiste à utiliser la classe DelegationRequestProcessor de spring au lieu de RequestProcessor de struts.

La deuxième consiste à utiliser la classe DelegationActionProxy et déléguer à spring la gestion des actions struts sous forme de beans.
Dans les deux cas il faut commencer par ajouter le plug-in dans le fichier de configuration de struts : struts-config.xml.

config plugin

Pour utiliser la première méthode il faut remplacer le RequestProcessor de struts par DelegatingRequestProcessor en ajoutant dans le fichier struts-config.xml les lignes suivantes :

config methode1_2

Pour permettre à spring de prendre en charge la gestion des actions sous forme de beans, il faut ajouter aussi la déclaration des actions dans le fichier de configuration de spring applicationContext.xml et dans le fichier action-servlet.xml comme le montre l’exemple ci-dessous :
Dans le fichier applicationContext.xml :

config methode1_3

Dans le fichier action-servlet.xml :

config methode 1_5

Pour utiliser la deuxième méthode, il faut suivre les étapes suivantes :
Dans le fichier struts-config.xml modifier le type des actions : nous ne déclarons plus la classe de l’action mais nous faisons référence à la classe DelegatingActionProxy.
config methode2_1

Ceci permet à spring de prendre en charge la gestion des actions sous forme de beans. Dans le fichier action-servlet.xml il faut déclarer l’action sous forme de bean.

config methode 1_5

L’option singleton="false" permet d’instancier un bean pour chaque requête. Nous discuterons la configuration des beans dans un autre article.
Le plug-in ContextLoaderPlugin permet d’intégrer le framwork struts avec spring sans modifier le code des actions et sans créer de dépendance entre les deux frameworks, tout en assurant la gestion des actions sous forme de beans et de bénéficier des avantages de l’injection de dépendance apporté par spring. Néanmoins, l’utilisation de cette méthode nécessite une double déclaration des actions : dans le fichier struts-config.xml et le fichier action-servlet.xml ce qui peut être un inconvénient pour certain développeur.

Application

Dans cette partie, nous allons implémenter notre première application qui intègre les frameworks struts et spring en utilisant le plugin ContextLoaderPlugin.

L’application est très simple. Elle contient deux pages une première page d’authentification pour saisir le login et le mot de passe et une deuxième qui s'affichée en cas de «success » de l’authentification.
Le schéma ci-dessous présente la structure de l’application.

spring struts app 1

Dans ce qui suit nous allons décrire « step by step » la création de l’application :

1. Sous eclipse créer un nouveau projet web dynamique.

2. Ajouter les librairies nécessaires pour struts ajouter les lib common-xxx.jar et struts.jar (struts 1.2) et pour intégrer spring ajouter spring.jar.

3. Modifier le fichier web.xml :

integration spring struts app 2

4. Créer le fichier action-servlet.xml :

ss app 3
5. Créer le fichier applicationContext.xml :

ss app4
6. Créer le fichier struts-config.xml :

ss 10 app

7. Créer les actions :
LoginAction : permet de récupérer le login et le mot de passe ensuite utilise un UserManager pour vérifier leur validité. La dépendance entre l’action LoginAction et la classe UserManager est gérée par spring en utilisant l’injection de dépendance.

ss11 app
LogOutAction : permet de retourner à la page de login.
8. Créer la classe User : un java bean qui contient les attributs login et password.

9. Créer la classe UserManagerImpl :

La classe UserManagerImpl implémente l’interface UserManager. Cette classe possède la méthode getUser (String login, String password) qui permet de vérifier la validité du login et le mot de passe. Pour simplifier l’application, la vérification du login et le mot de passe se fait en comparant respectivement le login et le mot de passe aux chaînes de caractères « login » et « pass ».Cependant,  l’utilisation du service UserManager permettra par la suite de modifier la vérification en ajoutant par exemple un accès à la base de données et ceci sans modifier le code des actions.

ss12 app

Conclusion

Dans cet article nous avons exposé comment intégrer les deux frameworks struts et spring dans une même application : comment récupérer les beans dans une action struts, comment configurer les actions struts comme étant des beans gérés par spring et bénéficier de l’injection de dépendance.


Download application :
Vous pouvez télécharger l'application en cliquant sur ce lien application.zip

9 commentaires:

jack a dit…

merci vous bien Monsieur l'auteur,
j'ai vraimant compris boucoups de chose de ce document.
et une autre fois merci

hamza a dit…

je te tire le chapeau monsieur tres tres intéressant l'article, mais j'aurais une toute petite question quel apporte struts par rapport a spring mvc ou autrement ce n'est-il pas mieux d'utilisé spring mvc dans la couche présentation pour ne pas complexé l'application ?

jeefacile a dit…

Merci hamza.
Personnellement je trouve spring MVC plus flexible que struts (surtout struts 1) intégré avec spring je pense que spring MVC est plus intéressant que struts 1, mais quoi choisir dans un projet ça c'est un autre pb, ça dépend des besoins, des compétences de l'équipe ....
j'espère que mon article sur spring MVC t'aidera à comprendre la différence entre spring MVC et struts.

Morsi a dit…

Merci pour cet article, est ce qu'on peut utiliser cette méthode pour intégrer hibernate?

en faite, j'ai un projet web Spring/struts/hibernate à réaliser.

y a t'il un article montrant comment intégrer ces technologies?

Merci de me répondre

jeefacile a dit…

Merci Morsi pour ton commentaire.
j'ai déjà écrit un article qui explique comment intégrer hibernate et spring 'Intégration d’Hibernate avec Spring' et un autre article sur spring DAO qui peux t'interesser si tu choisiras ce module pour intégrer hibernate et spring.
Bonne chance

ProgX73 a dit…

Clair, net et concis, tu m'as épargné quelques bonnes prises de tête! Merci ;)

NABIL a dit…

Bonjour Monsieur,
Je vous remercie pour votre effort ,mais comme je suis débutant en J2EE ,j'aimerai bien avoir plus de détaille concernant l'utilisation HIBERNATE+SPRING+ STRUT ? avec la configuration sur eclipse Svp
si c'est possible de poster un petit Démo SVP .je vous remercie d'avance.

jeefacile a dit…

merci Nabil,
j'ai déjà écrit un article pour intégrer spring et hibernate donc tu peux créer ton demo à partir de ces deux articles.
Si tu as besoin d'aide n'hésiter pas à me laisser un comm ou de m'envoyer un mail

Nabil a dit…

Je vous remercie bien Monsieur,,Franchement j'ai une base un peu complexe ,mais au niveau du mapping avec hibernante je le fais mais je n'arrive pas à configurer!! et je veux aussi intégrer spring .surtout le premier problème c'est au niveau d'hibernante si vous pouvez SVP ,mettre un démo avec une petite base ,et montrer les étapes à faire avec éclipse ,et c'est quoi les fichier ce qu'il faut configurer? est ce que correspond à toutes les tables de la base??

Je vous remercie d'avance .

Nabil
lesigny@yahoo.fr