Développez - static.fnac-static.com · utilisé (Java 8, Eclipse Mars, Tomcat 8 et MySQL 5.7). Les...

23
Java EE Développez des applications web en Java Thierry RICHARD Nouvelle édition

Transcript of Développez - static.fnac-static.com · utilisé (Java 8, Eclipse Mars, Tomcat 8 et MySQL 5.7). Les...

Java EE Développez

des applications web en Java

Thierry RICHARD

2e édition

Nouvelle éditionJava EE Développez des applications web en Java

Thierry RICHARD Après 8 ans en tant qu’ingénieur d’études dans différentes SSII, Thierry RICHARD est aujourd’hui formateur à ENI Ecole. Il est spé-cialisé dans les techniques de développement objet en environnement .NET et Java. Son expérience s’allie à ses compétences pédago-giques pour fournir au lecteur un livre réel-lement opérationnel sur le développement d’applications web en Java.

Ce livre s’adresse aux développeurs souhaitant monter en compétences sur le développement d’applications web, côté serveur, avec les technologies essentielles de la plateforme Java EE 7 (Java Enterprise Edition 7). Des connaissances sur le langage Java sont un prérequis nécessaire à la bonne compréhension du livre. Tout au long des chapitres, l’auteur aide le lecteur à mettre en place des projets au travers de l’IDE Eclipse lui permettant d’explorer le fonctionnement des technologies décrites.Le premier chapitre présente Java EE 7, le protocole HTTP et l’environnement de développement utilisé (Java 8, Eclipse Mars, Tomcat 8 et MySQL 5.7). Les deux chapitres suivants présentent en détail les fondamentaux du développement web avec les servlets et les JSP ainsi que les techno-logies suivantes : les filtres, les événements, les sessions, les cookies, l’EL et les balises JSTL. Le quatrième chapitre traite de la persistance des données, un élément incontournable pour créer une application. La première partie de ce chapitre détaille l’utilisation de l’API JDBC et la seconde partie montre la puissance d’un ORM en présentant la spécification JPA. À l’issue de ces quatre premiers chapitres, le lecteur est capable de créer ses premières applications web en Java.Pour aller encore plus loin dans la connaissance et la maîtrise des technologies Java liées au déve-loppement web, le cinquième chapitre présente la notion de Framework qui permet d’architectu-rer les applications et d’industrialiser le développement. À ce titre, les bases des Frameworks JSF et Struts 2 sont présentées. L’avant-dernier chapitre est dédié à la mise en œuvre de technologies complémentaires : les Services Web REST et les WebSockets. Enfin, le dernier chapitre s’attarde sur le déploiement d’une application sur Tomcat 8 en traitant des sujets incontournables que sont la sécurité (l’authentification, l’autorisation, HTTPS) et la journalisation.Des éléments complémentaires sont en téléchargement sur le site www.editions-eni.fr.

Introduction à Java EE • Le traitement métier avec les servlets • La présentation avec les JSP • La persistance des données avec JDBC et JPA • Les frameworks JSF et Struts • Introduction à des technologies complémentaires • Déploiement d’applications sur Tomcat

Les chapitres du livre

Téléchargementwww.editions-eni.fr.fr

sur www.editions-eni.fr : b Le code source de tous

les exemples du livre.

ISSN : 1960-3444ISBN : 978-2-409-00691-3

54 €

Pour plus d’informations : Ja

va E

EA

pplic

atio

ns w

eb e

n Ja

va

1Table des matières

Avant-propos

Chapitre 1Introduction à Java EE

1. Introduction. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

2. L'écosystème Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182.2 La plateforme Java SE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

2.2.1 Introduction. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192.2.2 Les outils nécessaires au développement . . . . . . . . . . . . . . . . . 202.2.3 Les librairies disponibles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

2.3 La plateforme Java EE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212.3.1 Introduction. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212.3.2 Les spécifications Java EE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232.3.3 La répartition des spécifications . . . . . . . . . . . . . . . . . . . . . . . . 25

3. Le protocole HTTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273.2 Les URI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283.3 La requête . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

3.3.1 La structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293.3.2 Les types de requêtes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303.3.3 Les attributs de requêtes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

3.4 La réponse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333.4.1 La structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333.4.2 Les codes de statut. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343.4.3 Les attributs de réponses. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

3.5 La gestion du cache. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363.6 La gestion de l'authentification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383.7 Les types de médias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

Les éléments à télécharger sont disponibles à l'adresse suivante :http://www.editions-eni.fr

Saisissez la référence de l'ouvrage EPJEE dans la zone de recherche et validez. Cliquez sur le titre du livre puis sur le bouton de téléchargement.

2Développez des applications web en Java

Java EE

4. L'environnement de développement. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404.1 Tomcat. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

4.1.1 Téléchargement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404.1.2 Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

4.2 MySQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414.2.1 Téléchargement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414.2.2 Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

4.3 Eclipse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514.3.1 Téléchargement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514.3.2 Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 524.3.3 Configuration. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534.3.4 Création d'un projet d'application web . . . . . . . . . . . . . . . . . . 614.3.5 Déploiement et exécution d'une application web . . . . . . . . . . 634.3.6 Gestion de l'instance Tomcat . . . . . . . . . . . . . . . . . . . . . . . . . . 66

4.4 Maven . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 684.4.1 Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 684.4.2 La gestion des dépendances. . . . . . . . . . . . . . . . . . . . . . . . . . . . 684.4.3 Mise en place . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71

5. Les exemples du livre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 745.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 745.2 Description fonctionnelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 755.3 Le diagramme de classes d'analyses . . . . . . . . . . . . . . . . . . . . . . . . . . . . 755.4 La base de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76

6. Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

Chapitre 2Le traitement métier avec les servlets

1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79

2. La structure d'une application web. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 802.1 Présentation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 802.2 La structure logique d'une application web. . . . . . . . . . . . . . . . . . . . . . 802.3 La structure physique d'une application web . . . . . . . . . . . . . . . . . . . . 81

2.3.1 Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 812.3.2 Le paramétrage. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83

3Table des matières

3. Le projet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 853.1 La création du projet. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 853.2 La mise en place de la Javadoc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87

4. Les servlets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 884.1 Qu'est-ce qu'une servlet ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 884.2 Le cycle de vie d'une servlet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 894.3 La première servlet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91

4.3.1 La création de la servlet. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 914.3.2 La déclaration d'une servlet. . . . . . . . . . . . . . . . . . . . . . . . . . . . 954.3.3 Les paramètres d'initialisation d'une servlet . . . . . . . . . . . . . . 964.3.4 La mise en évidence du cycle de vie d'une servlet . . . . . . . . . . 98

4.4 La classe HttpServlet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1004.5 Les différents contextes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100

4.5.1 Le contexte d'application . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1014.5.2 Le contexte de session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1014.5.3 Le contexte de requête . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101

4.6 La lecture de la requête . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1024.6.1 Lecture des informations de l'URL . . . . . . . . . . . . . . . . . . . . . 1024.6.2 Lecture de l'en-tête de la requête . . . . . . . . . . . . . . . . . . . . . . 1034.6.3 Lecture des paramètres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104

4.7 La création de la réponse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1104.7.1 Écriture de l'en-tête de la réponse . . . . . . . . . . . . . . . . . . . . . . 1104.7.2 Écriture du corps de la réponse . . . . . . . . . . . . . . . . . . . . . . . . 1124.7.3 La gestion de l'envoi de la réponse . . . . . . . . . . . . . . . . . . . . . 1134.7.4 Premier exemple de mise en œuvre . . . . . . . . . . . . . . . . . . . . 1144.7.5 Déléguer la création de la réponse . . . . . . . . . . . . . . . . . . . . . 1154.7.6 Second exemple de mise en œuvre . . . . . . . . . . . . . . . . . . . . . 1184.7.7 La redirection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1214.7.8 La gestion des erreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122

4.8 Les servlets asynchrones. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124

5. Le suivi de l'activité de l'utilisateur. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1275.1 Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1275.2 Les cookies. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128

5.2.1 Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1285.2.2 La création d'un cookie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1295.2.3 La lecture d'un cookie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131

4Développez des applications web en Java

Java EE

5.3 La session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1335.3.1 Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1335.3.2 Le suivi de session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1345.3.3 La création d'une session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1355.3.4 L'utilisation d'une session . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1355.3.5 La liaison d'attributs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138

6. Les filtres. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1396.1 Présentation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1396.2 Mise en œuvre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140

6.2.1 La création d'un filtre. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1406.2.2 La déclaration du filtre. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1446.2.3 L'utilisation d'un filtre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147

7. Les événements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1487.1 Présentation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1487.2 Le paramétrage des classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1487.3 Les événements liés au contexte d'application . . . . . . . . . . . . . . . . . . 1497.4 Les événements liés au contexte de session. . . . . . . . . . . . . . . . . . . . . 1507.5 Les événements liés au contexte de requête . . . . . . . . . . . . . . . . . . . . 151

8. La sécurité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153

9. Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153

Chapitre 3La présentation avec les JSP

1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155

2. Le projet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1562.1 La création du projet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1562.2 La création d'une JSP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158

2.2.1 La modification des templates disponibles . . . . . . . . . . . . . . 1582.2.2 La création de la première JSP . . . . . . . . . . . . . . . . . . . . . . . . . 160

3. Le principe d'exécution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162

4. Le paramétrage d'une JSP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166

5Table des matières

5. Les directives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1675.1 Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1675.2 La directive page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168

5.2.1 Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1685.2.2 Les attributs de la directive . . . . . . . . . . . . . . . . . . . . . . . . . . . 1685.2.3 Un exemple de mise en œuvre . . . . . . . . . . . . . . . . . . . . . . . . 169

5.3 La directive taglib . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1705.3.1 Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1705.3.2 Les attributs de la directive . . . . . . . . . . . . . . . . . . . . . . . . . . . 1705.3.3 Un exemple de mise en œuvre . . . . . . . . . . . . . . . . . . . . . . . . 170

5.4 La directive include . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1715.4.1 Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1715.4.2 Les attributs de la directive . . . . . . . . . . . . . . . . . . . . . . . . . . . 1715.4.3 Un exemple de mise en œuvre . . . . . . . . . . . . . . . . . . . . . . . . 171

6. Les éléments de script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1726.1 Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1726.2 Les déclarations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173

6.2.1 Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1736.2.2 Un exemple de mise en œuvre . . . . . . . . . . . . . . . . . . . . . . . . 173

6.3 Les scriptlets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1746.3.1 Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1746.3.2 Un exemple de mise en œuvre . . . . . . . . . . . . . . . . . . . . . . . . 174

6.4 Les expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1766.4.1 Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1766.4.2 Un exemple de mise en œuvre . . . . . . . . . . . . . . . . . . . . . . . . 177

6.5 Les commentaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1776.6 L'EL (Expression Language) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177

7. Les objets disponibles dans une JSP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1777.1 Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1777.2 Un exemple de mise en œuvre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179

8. La gestion des erreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1828.1 Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1828.2 Les erreurs à la transformation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1828.3 Les erreurs à l'exécution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1848.4 L'utilisation de l'instruction try/catch. . . . . . . . . . . . . . . . . . . . . . . . . 1848.5 L'utilisation des pages d'erreur JSP. . . . . . . . . . . . . . . . . . . . . . . . . . . . 184

6Développez des applications web en Java

Java EE

8.6 L'utilisation des pages d'erreur globales . . . . . . . . . . . . . . . . . . . . . . . . 187

9. L'utilisation de fragments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1879.1 Présentation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1879.2 L'inclusion statique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1889.3 L'inclusion dynamique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1889.4 Un exemple d'inclusion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1889.5 Une inclusion variable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191

10. Les actions standards . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19110.1 Présentation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19110.2 Qu'est-ce qu'un JavaBean ?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19110.3 <jsp:useBean> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192

10.3.1 Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19210.3.2 Exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194

10.4 <jsp:setProperty> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19410.4.1 Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19410.4.2 Exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195

10.5 <jsp:getProperty> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19610.5.1 Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19610.5.2 Exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196

10.6 <jsp:include> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19610.7 <jsp:forward> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19710.8 <jsp:param>. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197

11. L'EL (Expression Language) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19811.1 Présentation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19811.2 La syntaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19811.3 Les objets disponibles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19911.4 La recherche dans les différents contextes. . . . . . . . . . . . . . . . . . . . . . 20211.5 Les opérateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202

11.5.1 Les opérateurs arithmétiques . . . . . . . . . . . . . . . . . . . . . . . . . 20211.5.2 L'opérateur de concaténation des chaînes de caractères . . . . 20211.5.3 Les opérateurs de comparaison . . . . . . . . . . . . . . . . . . . . . . . . 20311.5.4 Les opérateurs logiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20311.5.5 L'opérateur empty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20311.5.6 L'opérateur conditionnel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20411.5.7 L'opérateur d'assignation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20411.5.8 L'opérateur point-virgule . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204

7Table des matières

11.5.9 Les parenthèses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20411.5.10 La précédence des opérateurs . . . . . . . . . . . . . . . . . . . . . . . . . 205

11.6 La manipulation des énumérés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20511.7 La manipulation des variables et méthodes statiques . . . . . . . . . . . . 20611.8 La manipulation des collections. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206

11.8.1 La création . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20611.8.2 L'exploitation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207

11.9 La gestion des erreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210

12. Les balises JSTL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21312.1 Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21312.2 Les modifications du projet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21412.3 L'utilisation d'une librairie dans une JSP . . . . . . . . . . . . . . . . . . . . . . . 21612.4 La librairie de base (core) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216

12.4.1 <c:out> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21612.4.2 <c:set> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21712.4.3 <c:remove> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21712.4.4 <c:catch> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21712.4.5 <c:if> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21812.4.6 <c:choose>, <c:when>, <c:otherwise>. . . . . . . . . . . . . . . 21812.4.7 <c:forEach> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21912.4.8 <c:forTokens> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22012.4.9 <c:import> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22012.4.10 <c:url> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22112.4.11 <c:redirect> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22112.4.12 <c:param> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221

12.5 La librairie d'internationalisation et de formatage (fmt) . . . . . . . . . . 22212.5.1 Les principes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22212.5.2 La définition de la Locale. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22412.5.3 Le chargement des ressources . . . . . . . . . . . . . . . . . . . . . . . . . 22412.5.4 L'affichage des messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22612.5.5 Un exemple de mise en œuvre . . . . . . . . . . . . . . . . . . . . . . . . 22612.5.6 <fmt:timeZone> et <fmt:setTimeZone> . . . . . . . . . . . . . 23012.5.7 <fmt:formatDate> et <fmt:parseDate>. . . . . . . . . . . . . . . 23112.5.8 <fmt:formatNumber> et <fmt:parseNumber>. . . . . . . . . 233

12.6 La librairie de fonctions (fn). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23512.6.1 fn:contains . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23512.6.2 fn:containsIgnoreCase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235

8Développez des applications web en Java

Java EE

12.6.3 fn:endsWith . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23512.6.4 fn:escapeXml . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23612.6.5 fn:indexOf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23612.6.6 fn:join . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23612.6.7 fn:length . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23612.6.8 fn:replace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23612.6.9 fn:split . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23712.6.10 fn:startsWith . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23712.6.11 fn:substring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23712.6.12 fn:substringAfter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23712.6.13 fn:substringBefore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23812.6.14 fn:toLowerCase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23812.6.15 fn:toUpperCase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23812.6.16 fn:trim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238

13. Les balises personnalisées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23813.1 Présentation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23813.2 La création d'une balise personnalisée . . . . . . . . . . . . . . . . . . . . . . . . . 23913.3 L'utilisation d'une balise personnalisée . . . . . . . . . . . . . . . . . . . . . . . . 24113.4 L'envoi d'informations à une balise personnalisée . . . . . . . . . . . . . . . 24113.5 La récupération d'informations d'une balise personnalisée . . . . . . . . 243

14. Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246

Chapitre 4La persistance des données avec JDBC et JPA

1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247

2. La spécification JDBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2482.1 Description . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2482.2 Les différents types de pilotes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2482.3 L'API JDBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2492.4 Le projet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251

2.4.1 La création du projet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2512.4.2 Le référencement du pilote JDBC . . . . . . . . . . . . . . . . . . . . . . 252

2.5 La connexion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2612.5.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2612.5.2 La première connexion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261

9Table des matières

2.5.3 La mise en place d'un pool de connexion . . . . . . . . . . . . . . . . 2662.5.4 Compléments sur l'interface Connection . . . . . . . . . . . . . . . 270

2.6 L'exploitation des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2732.6.1 L'interface Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2732.6.2 L'interface PreparedStatement . . . . . . . . . . . . . . . . . . . . . . . . 2782.6.3 L'interface CallableStatement. . . . . . . . . . . . . . . . . . . . . . . . . 2832.6.4 L'utilisation du ResultSet . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2852.6.5 La gestion des exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291

2.7 La gestion des transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2952.8 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296

3. La spécification JPA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2973.1 Description . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2973.2 Les principales implémentations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2973.3 L'API JPA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298

3.3.1 Les entités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2983.3.2 Le gestionnaire d'entités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2993.3.3 Les transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301

3.4 Le projet. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3013.5 La connexion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303

3.5.1 Le fichier persistence.xml . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3033.5.2 L'EntityManager et l'EntityManagerFactory. . . . . . . . . . . . . 307

3.6 Le mappage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3103.6.1 Le contexte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3103.6.2 Les annotations indispensables : @Entity et @Id . . . . . . . . 3113.6.3 La gestion des tables : @Table, @SecondaryTable . . . . . . . . 3133.6.4 La gestion des variables membres : @Column, @Basic,

@Transient . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3153.6.5 La gestion avancée des variables membres. . . . . . . . . . . . . . . 3173.6.6 La gestion de l'héritage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3193.6.7 La gestion des clés primaires simples : @Id,

@GeneratedValue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3213.6.8 La gestion des clés primaires composites avec @IdClass . . . 3223.6.9 La gestion des clés primaires composites

avec @EmbeddedId, @Embeddable et @MapsId . . . . . . . . . 3273.6.10 La gestion des relations 1:1 . . . . . . . . . . . . . . . . . . . . . . . . . . . 3293.6.11 La gestion des relations 1:n. . . . . . . . . . . . . . . . . . . . . . . . . . . 3343.6.12 La gestion des relations n:m . . . . . . . . . . . . . . . . . . . . . . . . . . 339

10Développez des applications web en Java

Java EE

3.6.13 Les annotations @JoinColumn et @JoinTable . . . . . . . . . . . 3413.6.14 La gestion des collections . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3423.6.15 La gestion des Map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343

3.7 L'exploitation des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3433.7.1 Les méthodes de l'EntityManager. . . . . . . . . . . . . . . . . . . . . . 3433.7.2 L’utilisation des transactions . . . . . . . . . . . . . . . . . . . . . . . . . 3453.7.3 L’enregistrement d’une entité . . . . . . . . . . . . . . . . . . . . . . . . . 3463.7.4 La recherche d’une entité par son identité . . . . . . . . . . . . . . . 3483.7.5 La modification d’une entité . . . . . . . . . . . . . . . . . . . . . . . . . . 3493.7.6 La suppression d’une entité. . . . . . . . . . . . . . . . . . . . . . . . . . . 3513.7.7 Les traitements complexes . . . . . . . . . . . . . . . . . . . . . . . . . . . 3523.7.8 Le chargement différé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3573.7.9 Le tri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3613.7.10 La manipulation d’une entité détachée . . . . . . . . . . . . . . . . . 3613.7.11 La validation des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364

3.8 Le JPQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3643.8.1 Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3643.8.2 L'exécution d'une requête JPQL . . . . . . . . . . . . . . . . . . . . . . . 3643.8.3 Les requêtes simples. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3653.8.4 Les requêtes avec restrictions . . . . . . . . . . . . . . . . . . . . . . . . . 3663.8.5 Les requêtes imbriquées. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3673.8.6 Les requêtes paramétrées. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3683.8.7 Les requêtes avec jointure . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3693.8.8 Les calculs d'agrégats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3703.8.9 Les requêtes nommées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3703.8.10 Les fonctions disponibles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3713.8.11 L'exploitation du résultat . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372

3.9 L'API Criteria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3753.10 JPA et l'injection de dépendances. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376

3.10.1 Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3763.10.2 L'implémentation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3763.10.3 La mise en place . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377

4. Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 382

11Table des matières

Chapitre 5Les frameworks JSF et Struts

1. Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383

2. JSF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3842.1 Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 384

2.1.1 Généralités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3842.1.2 Principes de fonctionnement . . . . . . . . . . . . . . . . . . . . . . . . . 384

2.2 Le projet. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3872.3 Le paramétrage général . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395

2.3.1 Le fichier faces-config.xml . . . . . . . . . . . . . . . . . . . . . . . . . . . 3952.3.2 Le fichier web.xml . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395

2.4 L'exemple. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3972.5 Les managedBeans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397

2.5.1 Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3972.5.2 Mise en œuvre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398

2.6 Les facelets. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4002.6.1 Les librairies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4002.6.2 L'EL (Expression Language). . . . . . . . . . . . . . . . . . . . . . . . . . . 4042.6.3 Mise en œuvre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404

2.7 Les conversions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4102.8 Les validations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414

2.8.1 La validation dans la facelet . . . . . . . . . . . . . . . . . . . . . . . . . . 4152.8.2 La validation dans un validateur . . . . . . . . . . . . . . . . . . . . . . 4182.8.3 La validation avec la spécification Bean Validation . . . . . . . 419

2.9 L'internationalisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4212.9.1 La création des fichiers .properties . . . . . . . . . . . . . . . . . . . . . 4212.9.2 La déclaration dans le fichier faces-config.xml . . . . . . . . . . . 4222.9.3 La modification des facelets . . . . . . . . . . . . . . . . . . . . . . . . . . 4232.9.4 L'internationalisation des validateurs . . . . . . . . . . . . . . . . . . 4272.9.5 Bean Validation et l'internationalisation . . . . . . . . . . . . . . . . 4272.9.6 L'utilisation des messages paramétrés . . . . . . . . . . . . . . . . . . 428

12Développez des applications web en Java

Java EE

3. Struts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4293.1 Présentation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429

3.1.1 Généralités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4293.1.2 Principes de fonctionnement . . . . . . . . . . . . . . . . . . . . . . . . . 429

3.2 Le projet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4313.3 Le paramétrage général . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4343.4 La première page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4353.5 Les actions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437

3.5.1 Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4373.5.2 La configuration des URL . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438

3.6 Les composants graphiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4443.6.1 Les composants standards. . . . . . . . . . . . . . . . . . . . . . . . . . . . 4443.6.2 L'OGNL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4453.6.3 Les moteurs de templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446

3.7 Mise en œuvre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4473.7.1 Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4473.7.2 Le préremplissage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4483.7.3 Le traitement du formulaire . . . . . . . . . . . . . . . . . . . . . . . . . . 4513.7.4 Les premiers tests. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452

3.8 L'accès au contexte d'exécution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4533.9 Les intercepteurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4553.10 Les conversions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4573.11 Les validations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 459

3.11.1 La validation par annotations propres à Struts . . . . . . . . . . . 4603.11.2 La validation au niveau de l'action . . . . . . . . . . . . . . . . . . . . . 464

3.12 L'internationalisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4653.12.1 La création des fichiers .properties . . . . . . . . . . . . . . . . . . . . . 4653.12.2 La modification des pages de résultat. . . . . . . . . . . . . . . . . . . 4673.12.3 La modification de la classe action . . . . . . . . . . . . . . . . . . . . . 4683.12.4 L'utilisation des messages paramétrés . . . . . . . . . . . . . . . . . . 4703.12.5 L'exemple complet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471

4. Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474

13Table des matières

Chapitre 6Des technologies complémentaires

1. Introduction. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475

2. Les services web REST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4762.1 Définition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 476

2.1.1 Les principes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4762.1.2 Les caractéristiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4772.1.3 Vers les services web REST. . . . . . . . . . . . . . . . . . . . . . . . . . . 4782.1.4 Les limitations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478

2.2 La mise en place de l'environnement de développement . . . . . . . . . . 4782.2.1 Le choix d'une implémentation . . . . . . . . . . . . . . . . . . . . . . . 4782.2.2 La mise en place du projet et des dépendances . . . . . . . . . . . 479

2.3 La spécification JAX-RS 2.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4822.3.1 Introduction. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4822.3.2 Le fonctionnement général . . . . . . . . . . . . . . . . . . . . . . . . . . . 482

2.4 La configuration de l'application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4852.5 L'exposition des ressources. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486

2.5.1 Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4862.5.2 La classe ressource et ses méthodes . . . . . . . . . . . . . . . . . . . . 4862.5.3 L'extraction et l'injection d'informations. . . . . . . . . . . . . . . . 4872.5.4 Les types de retours des méthodes ressources . . . . . . . . . . . . 496

2.6 La validation des données. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5002.6.1 Les annotations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5002.6.2 Le paramétrage des implémentations JAX-RS 2.0. . . . . . . . . 5012.6.3 La validation des informations élémentaires . . . . . . . . . . . . . 5012.6.4 La validation des entités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503

2.7 Les providers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5042.7.1 Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5042.7.2 Les entity providers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5042.7.3 Les exceptions providers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518

2.8 Les filtres et les intercepteurs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5202.8.1 Les filtres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5202.8.2 Les intercepteurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 524

2.9 Complément sur le déploiement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527

14Développez des applications web en Java

Java EE

2.10 L'API cliente. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5282.10.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5282.10.2 Le fonctionnement général . . . . . . . . . . . . . . . . . . . . . . . . . . . 5292.10.3 La mise en place du projet et des dépendances . . . . . . . . . . . 5302.10.4 La mise en œuvre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533

3. Les WebSockets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5383.1 Définition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5383.2 Le fonctionnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 539

3.2.1 Les étapes de la communication . . . . . . . . . . . . . . . . . . . . . . . 5393.2.2 L'établissement de la communication . . . . . . . . . . . . . . . . . . 539

3.3 La spécification WebSocket 1.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5403.4 L'exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5403.5 Le côté serveur. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541

3.5.1 La mise en place de l'environnement de développement. . . . 5413.5.2 Le développement par annotations . . . . . . . . . . . . . . . . . . . . 5423.5.3 La session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5443.5.4 Les encodeurs et les décodeurs . . . . . . . . . . . . . . . . . . . . . . . . 545

3.6 Le côté serveur de l'exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5483.7 Le côté client en Java. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 550

3.7.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5503.7.2 La mise en place de l'environnement de développement. . . . 5503.7.3 Le développement par annotations . . . . . . . . . . . . . . . . . . . . 5523.7.4 La mise en place de la communication . . . . . . . . . . . . . . . . . . 553

3.8 Le côté client en JavaScript. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5543.8.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5543.8.2 L'interface WebSocket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5543.8.3 Le côté client de l'exemple. . . . . . . . . . . . . . . . . . . . . . . . . . . . 555

3.9 Conclusion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 557

15Table des matières

Chapitre 7Déploiement d’application sur Tomcat

1. Introduction. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 559

2. L'installation de l'environnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5592.1 L'installation de Java. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5592.2 L'installation de Tomcat. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 562

2.2.1 La vérification préalable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5622.2.2 Le téléchargement de Tomcat . . . . . . . . . . . . . . . . . . . . . . . . 5632.2.3 L'installation à partir d'une archive . . . . . . . . . . . . . . . . . . . . 5642.2.4 L'installation à partir d'un installeur . . . . . . . . . . . . . . . . . . . 5662.2.5 La vérification du bon fonctionnement . . . . . . . . . . . . . . . . . 572

3. L'architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5733.1 L'organisation physique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5733.2 L'organisation logique. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575

4. L'administration générale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5764.1 L'application à déployer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576

4.1.1 Le projet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5764.1.2 La livraison. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 577

4.2 Vue d'ensemble . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5784.3 Le fichier server.xml . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 579

4.3.1 La structure générale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5794.3.2 La balise <Server> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5804.3.3 La balise <Service>. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5804.3.4 La balise <Connector>. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5804.3.5 La balise <Executor> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5834.3.6 La balise <Engine> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5844.3.7 La balise <Host> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5854.3.8 La balise <Alias> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5884.3.9 La balise <Context> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5884.3.10 La balise <Valve> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5914.3.11 Les balises <Resource> et <ResourceLink> . . . . . . . . . . . . 593

5. La mise en place de la sécurité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5945.1 La restriction d'accès . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 595

5.1.1 La restriction sur l'adresse IP de l'émetteur . . . . . . . . . . . . . . 5955.1.2 La restriction sur l'adresse IP du serveur . . . . . . . . . . . . . . . . 597

16Développez des applications web en Java

Java EE

5.2 L'authentification et l'autorisation . . . . . . . . . . . . . . . . . . . . . . . . . . . 5985.2.1 Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5985.2.2 Les ressources à protéger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5985.2.3 Les autorisations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6005.2.4 Le schéma d'authentification . . . . . . . . . . . . . . . . . . . . . . . . . 6015.2.5 La base de comptes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 604

5.3 Le chiffrement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6095.3.1 La théorie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6095.3.2 La mise en œuvre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 611

6. La gestion des logs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6206.1 Les logs d'accès . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6206.2 Les logs de l'activité logicielle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 623

6.2.1 Le mécanisme. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6236.2.2 Le paramétrage. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 624

7. Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 631

Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 633

Chapitre 5Les frameworks JSF et Struts

Les frameworks JSF et Struts1. Présentation

L'utilisation des servlets et des JSP dans un projet d'envergure n'est pas chose aisée. Ilest préférable d'utiliser un framework proposant un cadre d'architecture bien défini etun ensemble de composants limitant le code redondant et fastidieux. Le présentchapitre a pour objectif de découvrir les rudiments des frameworks MVC JSF 2.2(JavaServer Faces) et Struts 2.5. Ces deux frameworks ont été retenus car le premierest un framework orienté composants alors que le second est un framework weborienté actions.Un framework orienté composants est un framework manipulant des composantsvisuels et métiers en limitant au maximum l'usage direct des technologies web. Dansce sens, ce type de framework s'approche du développement d'une application client/serveur. Les développeurs novices en développement web peuvent donc obtenir desrésultats rapidement.Un framework orienté actions est un framework manipulant des requêtes et desréponses HTTP. Un framework de ce type est beaucoup plus proche du protocoleHTTP et des technologies satellites. Il se base clairement sur les technologies présen-tées dans les chapitres précédents.Ces deux frameworks respectent le pattern MVC (modèle-vue-contrôleur). Cesframeworks proposent donc une architecture permettant la séparation entre lemodèle, la vue et le contrôleur.

© E

diti

ons

ENI -

All

righ

ts r

eser

ved

384Développez des applications web en Java

Java EE

2. JSF

2.1 Présentation

2.1.1 GénéralitésJSF est une technologie Java décrite par la JSR 344 dans sa version 2.2. La documen-tation officielle est disponible à l'adresse suivante : https://www.jcp.org/en/jsr/detail?id=344L'implémentation de référence, nommée Mojarra 2.2, est disponible à l'adressesuivante : https://javaserverfaces.java.net.JSF est constitué des éléments suivants :– Une API permettant de représenter les composants et de gérer leur état. Ces com-

posants sont nommés managedBeans (on parle aussi de backingBeans).– Une API permettant de gérer les événements, les validations côté serveur, la conver-

sion des données, la navigation, l'internationalisation.– Des librairies de tags à l'image de ceux disponibles pour les JSP (les balises JSTL) afin

de proposer un rendu adapté des managedBeans. Les pages JSF sont appelées facelets.

2.1.2 Principes de fonctionnementLe fonctionnement repose sur un ensemble d'étapes (cycle de vie) entre l'arrivée de larequête HTTP jusqu'à la restitution de la réponse.

385Les frameworks JSF et StrutsChapitre 5

La documentation officielle disponible à l'adresse suivante : http://docs.oracle.com/javaee/7/tutorial/jsf-intro006.htm, expose le schéma suivant :

Le cycle de vie est composé de six étapes entre lesquelles s’intercalent des phases degestion d’événements (Process Events) non abordées dans cet ouvrage :– Restore View : c'est la première étape exécutée lorsqu'une requête vers une

ressource JSF est exécutée. Cette étape permet de reconstituer en mémoire un arbrede composants (components tree) aussi appelé vue (view) représentant la page et leséléments manipulés. Lorsque la page est accédée pour la première fois, cet arbre esttout simplement créé.

– Apply Requests : cette seconde étape consiste en la lecture des paramètres de la re-quête pour mettre à jour la vue avec les informations saisies par l'utilisateur.

© E

diti

ons

ENI -

All

righ

ts r

eser

ved

386Développez des applications web en Java

Java EE

– Process Validations : cette troisième étape permet la conversion et la validationdes informations. La conversion permet de passer d'une chaîne de caractères saisiepar l'utilisateur en un type adapté au contexte de la requête. Ce type peut êtreclassique comme un numérique, une date... mais ce type peut être plus complexecomme un objet de type Sport, Terrain… Dans ce cas de figure, l'utilisation d'unconvertisseur (converter) personnalisé est nécessaire. Lorsque la conversion s'estdéroulée avec succès, la validation est réalisée. La validation passe par l'utilisationde validateurs (validator) standards ou personnalisés. Une section dédiée pourchacune de ces deux activités est disponible plus loin dans le chapitre.

– Update Model Values : cette quatrième étape permet la mise à jour du modèle àpartir de la vue. Dans le cadre d'un formulaire de saisie d'un nouveau sport, si lessaisies respectent les règles métiers, alors les propriétés d'un objet de type Sportsont valorisées avec les informations saisies par l'utilisateur. Cet objet est situé dansune classe Java que l'on appelle un managedBean. Une section dédiée aux managed-Beans est disponible plus loin dans le chapitre.

– Invoke Application : cette cinquième étape est cruciale car elle permet de déclen-cher le traitement métier en lien avec la requête HTTP. Ce traitement est écrit dansun managedBean. Le managedBean fait office de contrôleur.

– Render Response : cette sixième et dernière étape permet d'établir le rendu corres-pondant à la réponse à partir de la vue. Ce rendu inclut notamment les éventuelsmessages d'erreurs générés par les étapes précédentes.

Lors de la première requête vers une ressource, seules les étapes Restore View et RenderResponse sont exécutées.Ces différentes étapes sont pilotées par une servlet servant de point d'entrée aux diffé-rentes requêtes. Cette servlet se nomme javax.faces.webapp.FacesServlet.C'est la seule servlet dans un projet JSF. Elle fait office de Front Controller car son rôle estde réceptionner les requêtes HTTP entrantes, de les exploiter et de restituer une réponseadaptée. Les sections qui suivent ont pour objectif de présenter les éléments principauxpour débuter avec JSF.

387Les frameworks JSF et StrutsChapitre 5

2.2 Le projet

L'objectif de ce chapitre est d'appréhender les rouages de base de JSF. La création d'unprojet de type Faceted Project facilite la mise en place. Au final, c'est un projet detype Dynamic Web Project qui est créé mais préparamétré pour l'utilisation de JSF.Voici les étapes à suivre pour sa mise en place :

dCommencez par cliquer sur le menu File - New - Other. L'écran suivant apparaîtdans lequel vous appliquez un filtre pour sélectionner Faceted Project.

© E

diti

ons

ENI -

All

righ

ts r

eser

ved

388Développez des applications web en Java

Java EE

dCliquez sur le bouton Next pour obtenir l'écran suivant dans lequel vous donnezun nom à votre projet. Dans l'exemple, le projet se nomme Projet_JSF_2_2 :