Découvrez l’offre de Spring pour la création d’écrans web : Spring MVC. Ce concurrent direct de Struts permet de manière flexible de créer des interfaces web modernes, tout en bénéficiant de l’injection de dépendances de Spring (concept technique clé mis en oeuvre dans notre tutoriel Spring N°2). La configuration de l’injection se fait soit par XML, soit depuis Spring2.x par annotations.
Liens utiles
+ de 100 tutoriaux java/jee Objis
10 tutoriaux spring framework objis
Objis, spécialiste formation java depuis 2005
Prérequis, outils et versions
Tutoriel Spring N°2 : injection de dépendances
Objectifs
Analyser par l’exemple le cycle de vie dans SPRING d’une requête HTTP
Comprendre la mise en oeuvre d’une architecture d’application web avec Spring MVC
Créer des controlleurs SPRING
Gérer des exceptions spécifiques
Exécuter un scénario métier impliquant différentes couches d’une application , dont les couches Services et Dao.
Programme
Partie 1 : présentation SpringMVC
Partie 2 : création projet eclipse
Partie 3 : Architecture en couches de notre application
Partie 4 : Configuration web.xml en 2 étapes
Partie 5 : mise en oeuvre Couche Dao
Partie 6 : mise en oeuvre Couche Service
Partie 7 : Handler Mapping page d’accueil.
Partie 8 : codage de la vue en JSP
Partie 9 : déploiement
Partie 10 : Annotations Spring 2.5 @Controller
Partie 11 : projet Maven
Durée
2h.
Qui sommes-nous ?
Partie 1 : présentation architecture SpringMVC
Ci-dessous cinématique et choix techniques types pour la page d’accueil (ici : home.htm) d’une application Spring.
A NOTER : la servlet DispatcherServlet de Spring est l’équivalent strict du controlleur ActionServlet de Struts.
Les étapes sont :
1.Le DispatcherServlet reçoit une requête dont l’URI-pattern est ‘/home.htm’
2.Le DispatcherServlet consulte son Handler Mapping (Ex : BeanNameUrlHandlerMapping) pour connaitre le controlleur dont le nom de bean est ‘/home.htm’ . En effet avec Spring MVC, vous créez vos controlleurs.
3.Le DispatcherServlet dispatche la requête au controlleur identifié (Ex :HomePageController)
4.Le controlleur retourne au DispatcherServlet un objet de type ModelandView possédant comme paramètre au minimum le nom logique de la vue à renvoyer.
5.Le DispatcherServlet consulte son View Resolver lui permettant de trouver la vue dont le nom logique est ‘home’. Ici le type de View Resolver choisit est InternalResourceViewResolver.
6.Le DispatcherServlet forwarde la requête à la vue associé . Ici la page
/WEB-INF/jsp/home.jsp
Partie 2 : création projet eclipse
Création projet et intégration Tomcat
Créez un projet ‘web dynamique’ demospringmvc . Menu File/new/project puis web dynamique.
Ajoutez un serveur Tomcat à votre environnement Eclipse.
Testez que le serveur se lance bien à partir d’Eclipse.
Si besoin , voir ‘notre ‘tutoriel Eclipse : création projet web dynamique avec Tomcat 6 ‘
Ajout des librairies
Dans le répertoire WEB-INFlib du projet eclipse, importez (cliquez droit/import) les librairies du projet, composées de librairie de base ainsi que de librairies Spécifiques Spring MVC
Librairies de base
spring.jar (le framework spring): se trouve dans spring-framework-2.5.4distspring.jar
commons-logging.jar (Interface pour gestion logs)
se trouve dans spring-framework-2.5.4libjakarta-commonscommons-logging.jar
log4j.jar (Implémentation pour les logs) :
spring-framework-2.5.4liblog4jlog4j-1.2.15.jar
Librairies spécifiques Spring MVC
spring-web.jar (conteneur spécifique web)
se trouve dans spring-framework-2.5.4distmodulesspring-web.jar
spring-webmvc.jar (Spring MVC) :
se trouve dans spring-framework-2.5.4distmodulesspring-webmvc.jar
Rendre le projet eclipse ‘Spring Oriented’
Cliquez-droit sur le projet puis Spring tools / Add Spring project Nature
Notez le ‘S’ qui apparaît à gauche du nom du projet. C’est la marque d’un projet Spring dans Eclipse.
Mettre en oeuvre Log4j
En complément des jars commons-logging.jar et log4j.jar , un fichier de configuration de log est mecessaire pour terminer notre infrastructure de logs.
Dans le répertoire WEB-INF, ajoutez le fichier log4j.xml fournit.
Expliquez le contenu de ce fichier.
Partie 3 : Architecture en couche
Il s’agit d’une application en couche avec :
Couche accès données (DAO)
On y trouve des beans implémentant l’interface IEmployeDao permettant de communiquer avec la base à travers des opérations CRUD (Create, Retrieve, Update, Delete).
Couche des services métiers dans package
On y trouvera des beans implémentant l’interface IEmployeManager permettant de gérer les services métiers.
Couche domaine métier
On y trouvera des objets métiers JavaBeans (comme Employe)
Couche controlleur
Avec Spring MVC, vous devez créer vous-même vos Controlleurs (contrairement à Struts, ou il n’ya qu’un controleur : l’ActionServlet).
Vos controleurs doivent impérativement retourner un objet de type Spring ModelAndView
Bonne pratique spring MVC : 1 fichier de définitions par couche
Les concepteurs de l’application ont choisi de ne pas déclarer TOUS les beans dans un seul fichier, par souci de maintenance et de modularité de l’application.
La configuration du chargeur de contexte est necessaire afin que le ou les fichiers de déclaration de bean (à créer) suivant soient pris en charge. Bonne pratique : un fichier xml par couche.
A partir de l’assistant création de fichiers de définitions du plugin Spring IDE, créez les fichiers suivants :
— WEB-INFobjisapp-data.xml : beans de la couche persistence
— WEB-INFobjisapp-service.xml : beans de la couche services métiers
— WEB-INFobjisapp-servlet.xml : beans couche Controleurs, Mapping URL et Vues(viewResolver)
Les fichiers, créés par exemple, ressembleront à ceci :
Aucun bean n’y est déclaré pour le moment.
IMPORTANT : le nom de la servlet du Dispatcher (objisapp) a un impact direct sur le nom des fichiers de déclaration des beans Controleurs, et doivent suivre le modèle ‘nomservlet’-servlet.xml . Ici : objisapp-servlet.xml
Etat livraison après partie 3
Partie 4 : Configuration web.xml en 2 étapes
Etape 1 : Configurez le DispatcherServlet dans le fichier web.xml de l’application. Associez en particulier le DispatcherServlet aux URL-pattren ‘*.htm’ . Nommez la servlet ‘objisapp’.
Etape 2 : Configuration le chargeur de contexte
Afin d’exploiter au mieux toutes les informations présentes dans les différents fichiers de définition, le chargeur de contexte a besoin des 2 paramètres suivants, que vous devez préciser :
La classe écouteur (Listener) de contextes Spring
Le lieu du ou des fichiers à charger : contextConfigLocation
Ajoutez les lignes suivantes au fichier web.xml
Remarque : autre choix possible pour le listener : ContextLoaderServlet . A utiliser uniquement si
Serveur d’application supportant specification servlet 2.2 et inférieur
Serveur d’application n’initialisant pas les écouteurs (listeners) avant les servlets
Partie 5 : mise en oeuvre Couche DAO
Ajoutez dans les librairies de l’application les jars relatifs au pool de connexion DBCP. Ces sont fournits dans Spring (libjakarta-commonscommons-dbcp.jar et libjakarta-commonscommons-pool.jar)
Ajoutez le jar de MySQL : mysql-connector-java-bin.jar , fourni dans le zip de mysql-connector
En utilisant les techniques mises en oeuvre dans le TP ‘Accès aux données avec Spring JDBC‘, mettez en oeuvre dans le fichier objisapp-data.xml une couche d’accès aux données MySQL impliquant :
— Définition d’un bean ‘dataSource‘ : configuration via classe org.apache.commons.dbcp.BasicDataSource, (de Apache DBCP DataBase Connexion Pool) avec informations d’accès à la base récupérées d’un fichier de propriété : db.properties du package com.objis.springmvcdemo.dao .
Rappel : cette technique implique la déclaration d’un bean PropertyPlaceholderConfigurer
— Définition d’un bean ‘employeJdbcDaoSupport‘ correspondant à l’utilisation d’un DAO Support de Spring pour accéder aux données. Le bean implementera l’interface IEmployeDAO ci-dessous.
Interface à implémenter pour la couche DAO
Remarque : la datasource est injectée dans le DAO à l’exécution.
Exemple de configuration de spring-data.xml
Avec un contenu de db.properties (dans com.objis.springmvcdemo.dao) :
Livraison intermédiaire
Etat livraison après Partie 5
Partie 6 : mise en oeuvre couche Service
Codage du Service
Proposez un code pour la classe EmployeManager , dans package com.objis.springmvcdemo.service
Analyse
Un développeur propose la déclaration suivante du Manager Employe, dans le fichier objisapp-service.xml.
Validez-vous sa proposition ? Que manque t’il ?
Injection du DAO
Injectez un le DAO dans le Manager.
Configuration du controleur de la page d’accueil
Rappel : avec Spring MVC, vous devez créer vous-même vos Controlleurs (contrairement à Struts, ou il n’ya qu’un controleur : l’ActionServlet).
Vos controleurs doivent impérativement retourner un objet de type Spring ModelAndView
Cinématique type du controleur – Relation avec DispatcherServlet et le Service métier
Pour la page d’accueil, les développeurs ont choisi un controleur (HomePageController) héritant de org.springframework.web.servlet.mvc.AbstractController .
A partir de la documentation officielle de Spring, expliquez :
Quelle est la particularité de ce type de controlleur ?
Déclaration du controleur
Remarque : le bean service employeManager (défini dans objisapp-service.xml) est injecté à l’exécution dans le controlleur. Le couplage entre les 2 est faible. C’est là un atout qui contribue à la modularité et une meilleure maintenance de l’application
Code source du controlleur de la page d’accueil : HomePageController
EXPLICATION
1) le bean Service est injecté à l’éxécution dans le bean Controleur
2) Un objet de type ModelAndView objet est retournée via méthode handleRequestInternal du controleur. Vous crééez vos controleurs en héritant un des controleurs de Spring, ici de type AbstractController.
Les différents controleurs ont un savoir-faire spécifique. Par exemple AbstractController sait uniquement renvoyer des infos , alors que SimpleForm sait récupérer infos d’un formulaire et aussi renvoyer à l’utilisateur (Aller/Retour)
3) Utilisation du service pour traitement métier.
4) En plus du nom logique de la vue à afficher (View), le controleur peut renvoyer un objet métier (model) .Cet objet métier sera utile pour les données à afficher dans la vue à afficher (jsp, tiles…). L’objet métier aura alors été crée et chargé via un Service métier en relation par exemple avec une base de données.
Exemple : Afficher en page d’accueil les employes de la société.
return new ModelAndView(« home« , »employes« , listeEmployes);
— « home » : nom logique de la vue à afficher. Utilisé par le view-resolver pour pour rechercher la vue
— « employes » : Nom de l’objet du modèle (MVC) à transmettre à la vue
— « listeEmployes » : valeur de l’objet du modèle à transmettre à la vue
Partie 7 : Handler Mapping page d’accueil.
Pour la page d’accueil (url ‘/home.htm’), les développeurs ont choisi un handler de type org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping. Pourquoi ?
Déclaration du Handler Mapping dans WEB-INFobjisapp-servlet.xml
Dans le fichier objisapp-servlet.xml, configurez un tel handler en ajoutant les lignes suivantes :
et le bean
Configuration du View resolver pour la page d’accueil : InternalResourceViewResolver
Le choix de la stratégie de Vue a été porté par les développeurs sur le InternalResourceViewResolver.
Les lignes suivantes à recopier dans le fichier objsiapp-servlet.xml, permettent de configurer un viewResolver par défaut. C’est le choix recommandé et le plus simple si vos vues sont des JSP.
À l’URL ‘home.htm’ sera renvoyé une page JSP suivante : WEB-INFjsphome.jsp
Partie 8 : codage de la vue : fichier JSP
Exemple d’implémentation d’une vue récupérant le modèle identifié par ’employes’ et envoyé par le controleur à travers objet ModelAndView.
Ici la page est une page JSP .
Des balises JSTL et langage EL sont utilisés pour parcourir liste d’employés et les afficher leur propriétés.
Vous aurez besoin d’importer dans vos librairies une implémentation de JSTL, regroupant les jars suivants :
— jstl.jar , à récupérer dans libj2eejstl.jar
— standard.jar , à récupérer dans libjakarta-taglibsstandard.jar
Arborescence Eclipse
Voici l’arborescence juste avant de faire un premier test :
Partie 9 : Déploiement
Cliquez-droit sur le projet puis /Run as/ Run on Server. Vous obtenez un ecran similaire à celui-ci :
Projet Eclipse
Correction Tutoriel Spring Objis N°8 : introduction Spring MVC
livraison WAR
Livraison WAR Tutoriel Objis n°8 introduction Spring MVC
Partie 10 : Annotations Spring 2.5
Avec Spring 2.5 les amateurs d’annotations peuvent se réjouir !
En particulier en ce qui concerne le codage du controleur.
Avantages
— pas besoin d’une interface à implémenter (Ex : interface Controller) ou d’une classe à etendre (Ex : SimpleFormController)
— Permet plusieurs méthod pour gérer requêtes (POST , GET)
— Permet grande flexibilité sur signature des méthodes
Nouvelle configuration Spring
Analysez le nouveau contenu du fichier objisapp-servlet.xml
Expliquez les 5 points de configuration identifiés
Nous allons désormais mettre à profit cette nouvelle configuration.
Implémentation N°1 controleur annoté /home
Mettez en œuvre l’implémentation suivante
Implémentation N°2 controleur annoté
Spring 2.5 vous permet d’aller plus loin dans la simplification du code du controlleur.
— Nous allons supprimer l’objet Response des paramètres d’entrée.
— Au lieu de retourner un objet type ModelAndView, nous allons ajouter une Map comme paramètre d’entrée représentant le model.
INFO : Pour tout objet du modèle ajouté dans la Map, Spring crée automatiquement une clé qui permettra de manipuler le moèdele dans la vue retournée.
Expliquez
Correction spring 2.5
correction-tutoriel8-springg-mvc-partie10-annotations-controleur-spring25
exemple 100% spring 3
Gestion des paramètres avec @RequestParam
Récupérez un paramètre de l’url
Exemple de page Vue dédiée
Testez le rendu final
Partie 12 : projet Maven
Conclusion
Dans ce tutoriel, nous avons introduit Spring MVC, l’offre de Spring pour la création d’écrans / vues web.
DEMO FULL ANNOTATION
Demo_Spring_MVC_full_annotation