Tutoriel Spring N°9 : introduction Spring MVC

////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 ?

presentation-objis-conseil-formation-java-soa2.png

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.

tutoriel_spring_objis_introduction_spring_mvc.png

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.

tutoriel_spring_objis_introduction_spring_mvc_2.png

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 :

tutoriel_spring_formation_objis_injection_dependences_13.png

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’.

tutoriel_spring_objis_introduction_spring_mvc_4.png

 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

tutoriel_spring_objis_introduction_spring_mvc_3.png

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

tutoriel_spring_objis_introduction_spring_mvc_5.png

Remarque : la datasource est injectée dans le DAO à l’exécution.

Exemple de configuration de spring-data.xml

tutoriel_spring_objis_introduction_spring_mvc_6.png

Avec un contenu de db.properties (dans com.objis.springmvcdemo.dao) :

tutoriel_spring_objis_introduction_spring_mvc_7.png

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

tutoriel_spring_objis_introduction_spring_mvc_12.png

Analyse

Un développeur propose la déclaration suivante du Manager Employe, dans le fichier objisapp-service.xml.

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

tutoriel_spring_objis_introduction_spring_mvc_14.png

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

tutoriel_spring_objis_introduction_spring_mvc_8.png

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 :

tutoriel_spring_objis_introduction_spring_mvc_13.png

et le bean

tutoriel_spring_objis_introduction_spring_mvc_14.png

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.

tutoriel_spring_objis_introduction_spring_mvc_10.png

À 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

tutoriel_spring_objis_introduction_spring_mvc_11.png

Arborescence Eclipse

Voici l’arborescence juste avant de faire un premier test :

tutoriel_spring_objis_introduction_spring_mvc_22.png

Partie 9 : Déploiement

Cliquez-droit sur le projet puis /Run as/ Run on Server. Vous obtenez un ecran similaire à celui-ci :

tutoriel_spring_objis_introduction_spring_mvc_21.png

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

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

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.

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

correction-tutoriel8-springg-mvc-partie10-annotations-controleur-spring25

exemple 100% spring 3

demospring3mvc

Gestion des paramètres avec @RequestParam

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

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

 Exemple de page Vue dédiée

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

 Testez le rendu final

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

Partie 12 : projet Maven

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

Demo_Spring_MVC_full_annotation

2018-01-27T16:04:51+01:00

Contactez nous

241 rue DUGUESCLIN, 69003 Lyon

Web : Objis : spécialiste formation Java