Tutoriel Spring N°9 : introduction Spring MVC

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 ?

PNG - 102.4 ko

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-INF\lib 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.4\dist\spring.jar
- commons-logging.jar (Interface pour gestion logs) se trouve dans \spring-framework-2.5.4\lib\jakarta-commons\commons-logging.jar
- log4j.jar (Implémentation pour les logs) : \spring-framework-2.5.4\lib\log4j\log4j-1.2.15.jar

Librairies spécifiques Spring MVC

- spring-web.jar (conteneur spécifique web) se trouve dans \spring-framework-2.5.4\dist\modules\spring-web.jar
- spring-webmvc.jar (Spring MVC) : se trouve dans \spring-framework-2.5.4\dist\modules\spring-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-INF\objisapp-data.xml : beans de la couche persistence
— \WEB-INF\objisapp-service.xml : beans de la couche services métiers
— \WEB-INF\objisapp-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

Zip - 3.3 Mo
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 (\lib\jakarta-commons\commons-dbcp.jar et \lib\jakarta-commons\commons-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

Zip - 3.9 Mo
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.

PNG - 14.6 ko
tutoriel-spring-mvc-proposition-config-couche-service

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-INF\objisapp-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-INF\jsp\home.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 \lib\j2ee\jstl.jar
— standard.jar , à récupérer dans \lib\jakarta-taglibs\standard.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

Zip - 4.3 Mo
Correction Tutoriel Spring Objis N°8 : introduction Spring MVC

livraison WAR

Zip - 4.3 Mo
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

PNG - 154.5 ko
tutoriel-springmvc-config-controleur-annotations-spring-2-5-etapes

- 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

PNG - 16.1 ko
tutoriel-springmvc-config-controleur-annotations-spring-2-5-code-controlleur

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.

PNG - 37.7 ko
tutoriel-springmvc-config-controleur-annotations-spring-2-5-code-controlleur-v2

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

Zip - 4.8 Mo
correction-tutoriel8-springg-mvc-partie10-annotations-controleur-spring25

exemple 100% spring 3

Zip - 4.3 Mo
demospring3mvc

Gestion des paramètres avec @RequestParam

- Récupérez un paramètre de l’url

PNG - 4.5 ko
tutoriel-springmvc-config-controleur-annotations-spring-2-5-page-employe-url-employe-requestParam

- Exemple de page Vue dédiée

PNG - 9 ko
tutoriel-springmvc-config-controleur-annotations-spring-2-5-page-employe-url-employe

- Testez le rendu final

PNG - 9.4 ko
tutoriel-springmvc-config-controleur-annotations-spring-2-5-page-employe-url-employe-demo

Partie 12 : projet Maven

Zip - 13.4 ko
demomvc-2

Conclusion

Dans ce tutoriel, nous avons introduit Spring MVC, l’offre de Spring pour la création d’écrans / vues web.

DEMO FULL ANNOTATION

Zip - 32.5 ko
Demo_Spring_MVC_full_annotation