Jakarta EE
Développez des applications web en Java
Editions ENI
Avant-propos
Chapitre 1
Introduction à Jakarta EE
1. Introduction17
2. L'écosystème Java18
3. La plateforme Java SE19
3.1 Introduction19
3.2 Les différentes implémentations de la plateforme21
3.3 Installation du JDK sur Windows22
3.3.1 Installation de la plateforme OpenJDK22
3.3.2 Installation de la plateforme Oracle JDK22
3.3.3 Configuration des variables d'environnement23
3.3.4 Tester le bon fonctionnement24
3.4 Installation du JDK sur Linux25
3.4.1 Installation de la plateforme OpenJDK25
3.4.2 Installation de la plateforme Oracle JDK25
3.4.3 Configuration de la variable JAVA_HOME27
3.4.4 Tester le bon fonctionnement28
4. La plateforme Jakarta EE28
4.1 Introduction28
4.2 Le processus d'évolution de la plateforme30
4.3 Les serveurs d'applications30
4.3.1 La notion de conteneur30
4.3.2 Différents serveurs d'applications31
4.4 Les spécifications Jakarta EE32
4.5 La répartition des spécifications33
5. Le protocole HTTP34
5.1 Introduction34
5.2 Les URI37
5.3 La requête38
5.3.1 La structure38
5.3.2 Les types de requêtes39
5.3.3 Les attributs de requêtes40
5.4 La réponse42
5.4.1 La structure42
5.4.2 Les codes de statut43
5.4.3 Les attributs de réponses45
5.5 La gestion du cache45
5.6 La gestion de l'authentification47
5.7 Les types de médias48
6. L'environnement de développement49
6.1 Tomcat49
6.1.1 Téléchargement49
6.1.2 Installation sur Windows50
6.1.3 Installation sur Linux51
6.2 MySQL53
6.2.1 Téléchargement53
6.2.2 Installation sur Windows53
6.2.3 Installation sur Linux62
6.3 Eclipse63
6.3.1 Téléchargement et installation63
6.3.2 Premier démarrage64
6.3.3 Configuration65
6.3.4 Création d'un projet d'application web70
6.3.5 Déploiement et exécution d'une application web75
6.4 Gradle77
6.4.1 Présentation77
6.4.2 La gestion des dépendances78
7. Les exemples du livre81
7.1 Introduction81
7.2 Description fonctionnelle81
7.3 Le diagramme de classes d'analyses82
7.4 La base de données83
8. Conclusion84
Chapitre 2
Les servlets
1. Introduction85
2. La structure d'une application web86
2.1 Présentation86
2.2 La structure logique d'une application web86
2.3 La structure physique d'une application web87
2.3.1 Présentation87
2.3.2 Le paramétrage90
3. Le projet92
4. Les servlets93
4.1 Qu'est-ce qu'une servlet ?93
4.2 Le cycle de vie d'une servlet94
4.3 La première servlet95
4.3.1 La création de la servlet95
4.3.2 La déclaration d'une servlet99
4.3.3 Les paramètres d'initialisation d'une servlet101
4.3.4 La mise en évidence du cycle de vie d'une servlet102
4.4 La classe HttpServlet104
4.5 Les différents contextes105
4.5.1 Le contexte d'application105
4.5.2 Le contexte de session106
4.5.3 Le contexte de requête106
4.6 La lecture de la requête106
4.6.1 Lecture des informations de l'URL106
4.6.2 Lecture de l'en-tête de la requête107
4.6.3 Lecture des paramètres109
4.7 La création de la réponse114
4.7.1 Ecriture de l'en-tête de la réponse115
4.7.2 Écriture du corps de la réponse117
4.7.3 La gestion de l'envoi de la réponse117
4.7.4 Premier exemple de mise en oeuvre118
4.7.5 Déléguer la création de la réponse120
4.7.6 Second exemple de mise en oeuvre123
4.7.7 La redirection126
4.7.8 La gestion des erreurs128
4.8 Les servlets asynchrones129
5. Le suivi de l'activité de l'utilisateur133
5.1 Présentation133
5.2 Les cookies134
5.2.1 Présentation134
5.2.2 La création d'un cookie135
5.2.3 La lecture d'un cookie137
5.3 La session138
5.3.1 Présentation138
5.3.2 Le suivi de session139
5.3.3 La création d'une session141
5.3.4 L'utilisation d'une session142
5.3.5 La liaison d'attributs145
6. Les filtres145
6.1 Présentation145
6.2 Mise en oeuvre146
6.2.1 La création d'un filtre146
6.2.2 La déclaration du filtre151
6.2.3 L'utilisation d'un filtre153
7. Les événements155
7.1 Présentation155
7.2 Le paramétrage des classes155
7.3 Les événements liés au contexte d'application156
7.4 Les événements liés au contexte de session157
7.5 Les événements liés au contexte de requête158
8. La sécurité160
9. Conclusion160
Chapitre 3
La présentation avec les JSP
1. Introduction161
2. Le projet162
2.1 La création du projet162
2.2 La création d'une JSP163
3. Le principe d'exécution166
4. Le paramétrage d'une JSP170
5. Les directives172
5.1 Présentation172
5.2 La directive page173
5.2.1 Présentation173
5.2.2 Les attributs de la directive173
5.2.3 Un exemple de mise en oeuvre174
5.3 La directive taglib175
5.3.1 Présentation175
5.3.2 Les attributs de la directive175
5.3.3 Un exemple de mise en oeuvre175
5.4 La directive include176
5.4.1 Présentation176
5.4.2 Les attributs de la directive176
5.4.3 Un exemple de mise en oeuvre176
6. Les éléments de script178
6.1 Présentation178
6.2 Les déclarations179
6.2.1 Présentation179
6.2.2 Un exemple de mise en oeuvre179
6.3 Les scriptlets180
6.3.1 Présentation180
6.3.2 Un exemple de mise en oeuvre181
6.4 Les expressions183
6.4.1 Présentation183
6.4.2 Un exemple de mise en oeuvre183
6.5 Les commentaires183
6.6 L'EL (Expression Language)184
7. Les objets disponibles dans une JSP184
7.1 Présentation184
7.2 Un exemple de mise en oeuvre186
8. La gestion des erreurs188
8.1 Présentation188
8.2 Les erreurs à la transformation188
8.3 Les erreurs à l'exécution190
8.4 L'utilisation de l'instruction try/catch191
8.5 L'utilisation des pages d'erreur JSP191
8.6 L'utilisation des pages d'erreur globales193
9. L'utilisation de fragments194
9.1 Présentation194
9.2 L'inclusion statique194
9.3 L'inclusion dynamique194
9.4 Un exemple d'inclusion195
9.5 Une inclusion variable197
10. Les actions standards197
10.1 Présentation197
10.2 Qu'est-ce qu'un JavaBean ?198
10.3 <jsp:useBean>199
10.3.1 Présentation199
10.3.2 Exemple200
10.4 <jsp:setProperty>201
10.4.1 Présentation201
10.4.2 Exemple202
10.5 <jsp:getProperty>203
10.5.1 Présentation203
10.5.2 Exemple203
10.6 <jsp:include>203
10.7 <jsp:forward>203
10.8 <jsp:param>204
11. L'EL (Expression Language)205
11.1 Présentation205
11.2 La syntaxe205
11.3 Les objets disponibles206
11.4 La recherche dans les différents contextes209
11.5 Les opérateurs209
11.5.1 Les opérateurs arithmétiques209
11.5.2 L'opérateur de concaténation des chaînes de caractères210
11.5.3 Les opérateurs de comparaison210
11.5.4 Les opérateurs logiques210
11.5.5 L'opérateur empty211
11.5.6 L'opérateur conditionnel211
11.5.7 L'opérateur d'assignation211
11.5.8 L'opérateur point-virgule211
11.5.9 Les parenthèses212
11.5.10 La précédence des opérateurs212
11.6 La manipulation des énumérés212
11.7 La manipulation des variables et méthodes statiques213
11.8 La manipulation des collections213
11.8.1 La création213
11.8.2 L'exploitation214
11.9 La gestion des erreurs218
12. Les balises JSTL220
12.1 Présentation220
12.2 Les modifications du projet222
12.3 L'utilisation d'une librairie dans une JSP222
12.4 La librairie de base (core)222
12.4.1 <c:out>223
12.4.2 <c:set>223
12.4.3 <c:remove>224
12.4.4 <c:catch>224
12.4.5 <c:if>224
12.4.6 <c:choose>, <c:when>, <c:otherwise>224
12.4.7 <c:forEach>225
12.4.8 <c:forTokens>226
12.4.9 <c:import>227
12.4.10 <c:url>227
12.4.11 <c:redirect>228
12.4.12 <c:param>228
12.5 La librairie d'internationalisation et de formatage (fmt)228
12.5.1 Les principes228
12.5.2 La définition de la Locale231
12.5.3 Le chargement des ressources231
12.5.4 L'affichage des messages233
12.5.5 Un exemple de mise en oeuvre234
12.5.6 <fmt:timeZone> et <fmt:setTimeZone>236
12.5.7 <fmt:formatDate> et <fmt:parseDate>237
12.5.8 <fmt:formatNumber> et <fmt:parseNumber>239
12.6 La librairie de fonctions (fn)241
12.6.1 fn:contains242
12.6.2 fn:containsIgnoreCase242
12.6.3 fn:endsWith242
12.6.4 fn:xscapeXml242
12.6.5 fn:indexOf242
12.6.6 fn:join243
12.6.7 fn:length243
12.6.8 fn:replace243
12.6.9 fn:split243
12.6.10 fn:startsWith243
12.6.11 fn:substring244
12.6.12 fn:substringAfter244
12.6.13 fn:substringBefore244
12.6. 4 fn:toLowerCase244
12.6.15 fn:toUpperCase245
12.6.16 fn:trim245
13. Les balises personnalisées245
13.1 Présentation245
13.2 La création d'une balise personnalisée246
13.3 L'utilisation d'une balise personnalisée248
13.4 L'envoi d'informations à une balise personnalisée248
13.5 La récupération d'informations d'une balise personnalisée250
14. Conclusion253
Chapitre 4
La persistance des données avec JDBC et JPA
1. Introduction255
2. La spécification JDBC256
2.1 Description256
2.2 Les différents types de pilotes256
2.3 L'API JDBC257
2.4 Le projet259
2.4.1 La création du projet259
2.4.2 Le référencement du pilote JDBC260
2.5 La connexion260
2.5.1 Introduction260
2.5.2 La première connexion260
2.5.3 La mise en place d'un pool de connexion266
2.5.4 Compléments sur l'interface Connection270
2.6 L'exploitation des données272
2.6.1 L'interface Statement272
2.6.2 L'interface PreparedStatement278
2.6.3 L'interface CallableStatement283
2.6.4 L'utilisation du ResultSet284
2.6.5 La gestion des exceptions290
2.7 La gestion des transactions293
2.8 Conclusion295
3. La spécification JPA295
3.1 Description295
3.2 Les principales implémentations295
3.3 L'API JPA296
3.3.1 Les entités296
3.3.2 Le gestionnaire d'entités297
3.3.3 Les transactions299
3.4 Le projet299
3.5 La connexion302
3.5.1 Le fichier persistence.xml302
3.5.2 L'EntityManager et l'EntityManagerFactory306
3.6 Le mappage309
3.6.1 Le contexte309
3.6.2 Les annotations indispensables:@Entity et @Id310
3.6.3 La gestion des tables:@Table, @SecondaryTable311
3.6.4 La gestion des variables membres:@Column, @Basic, @Transient314
3.6.5 La gestion avancée des variables membres316
3.6.6 La gestion de l'héritage318
3.6.7 La gestion des clés primaires simples:@Id, @GeneratedValue320
3.6.8 La gestion des clés primaires composites avec @IdClass321
3.6.9 La gestion des clés primaires composites avec @EmbeddedId, @Embeddable et @MapsId326
3.6.10 La gestion des relations 1:1328
3.6.11 La gestion des relations 1:n333
3.6.12 La gestion des relations n:m338
3.6.13 Les annotations @JoinColumn et @JoinTable340
3.6.14 La gestion des collections341
3.6.15 La gestion des Map342
3.7 L'exploitation des données342
3.7.1 Les méthodes de l'EntityManager342
3.7.2 L'utilisation des transactions344
3.7.3 L'enregistrement d'une entité345
3.7.4 La recherche d'une entité par son identité347
3.7.5 La modification d'une entité348
3.7.6 La suppression d'une entité350
3.7.7 Les traitements complexes351
3.7.8 Le chargement différé356
3.7.9 Le tri360
3.7.10 La manipulation d'une entité détachée360
3.7.11 La validation des données363
3.8 Le JPQL363
3.8.1 Présentation363
3.8.2 L'exécution d'une requête JPQL364
3.8.3 Les requêtes simples365
3.8.4 Les requêtes avec restrictions366
3.8.5 Les requêtes imbriquées367
3.8.6 Les requêtes paramétrées367
3.8.7 Les requêtes avec jointure368
3.8.8 Les calculs d'agrégats369
3.8.9 Les requêtes nommées370
3.8.10 Les fonctions disponibles370
3.8.11 L'exploitation du résultat372
3.9 L'API Criteria374
3.10 JPA et l'injection de dépendances376
3.10.1 Présentation376
3.10.2 L'implémentation376
3.10.3 La mise en place376
4. Conclusion383
Chapitre 5
Le framework de présentation JSF
1. Présentation générale385
2. Présentation de JSF386
2.1 Généralités386
2.2 Principes de fonctionnement386
2.3 Le projet388
3. Le paramétrage général390
3.1 Le fichier faces-config.xml390
3.2 Le fichier beans.xml390
3.3 Le fichier web.xml391
4. L'exemple392
5. Les managedBeans393
5.1 Présentation393
5.2 Mise en oeuvre393
6. Les facelets396
6.1 Les librairies396
6.2 L'EL (Expression Language)400
6.3 Mise en oeuvre400
7. Les conversions406
8. Les validations410
8.1 La validation dans la facelet411
8.2 La validation dans un validateur413
8.3 La validation avec la spécification Bean Validation415
9. L'internationalisation418
9.1 La création des fichiers .properties418
9.2 La déclaration dans le fichier faces-config.xml419
9.3 La modification des facelets419
9.4 L'internationalisation des validateurs423
9.5 Bean Validation et l'internationalisation424
9.6 L'utilisation des messages paramétrés425
10. Conclusion426
Chapitre 6
Les services web REST
1. Introduction427
2. Présentation des services web REST428
2.1 Les principes428
2.2 Les caractéristiques429
2.3 Vers les services web REST430
2.4 Les limitations430
3. La mise en place de l'environnement de développement431
3.1 Le choix d'une implémentation431
3.2 La mise en place du projet et des dépendances431
4. La spécification JAX-RS433
4.1 Introduction433
4.2 Le fonctionnement général433
5. La configuration de l'application436
6. L'exposition des ressources437
6.1 Présentation437
6.2 La classe ressource et ses méthodes437
6.3 L'extraction et l'injection d'informations438
6.4 Les types de retours des méthodes ressources447
7. La validation des données451
7.1 Les annotations451
7.2 Le paramétrage des implémentations JAX-RS452
7.3 La validation des informations élémentaires452
7.4 La validation des entités454
8. Les providers455
8.1 Présentation455
8.2 Les entity providers455
8.3 Les exceptions providers470
9. Les filtres et les intercepteurs472
9.1 Les filtres472
9.2 Les intercepteurs476
10. Complément sur le déploiement479
11. L'API cliente480
11.1 Introduction480
11.2 Le fonctionnement général481
11.3 La mise en place du projet et des dépendances482
11.4 La mise en oeuvre482
12. Le côté client en JavaScript490
12.1 Introduction490
12.2 La mise en place du projet491
12.3 Une requête GET retournant un contenu JSON493
12.4 Une requête POST envoyant un contenu JSON495
13. Conclusion497
Chapitre 7
Introduction aux WebSockets
1. Introduction499
2. Le fonctionnement500
2.1 Les étapes de la communication500
2.2 L'établissement de la communication500
3. La spécification WebSocket502
4. L'exemple502
5. Le côté serveur503
5.1 La mise en place de l'environnement de développement503
5.2 Le développement par annotations504
5.3 La session506
5.4 Les encodeurs et les décodeurs507
6. Le côté serveur de l'exemple510
7. Le côté client en Java512
7.1 Introduction512
7.2 La mise en place de l'environnement de développement512
7.3 Le développement par annotations513
7.4 La mise en place de la communication514
8. Le côté client en JavaScript515
8.1 Introduction515
8.2 L'interface WebSocket516
8.3 Le côté client de l'exemple516
9. Conclusion518
Chapitre 8
Déploiement d'applications sur Tomcat
1. Introduction519
2. L'installation de l'environnement519
2.1 L'installation de Java519
2.2 L'installation de Tomcat520
2.2.1 La vérification préalable520
2.2.2 Le téléchargement de Tomcat521
2.2.3 L'installation à partir d'une archive522
2.2.4 L'installation à partir d'un installeur sur un environnement Windows524
2.2.5 La vérification du bon fonctionnement531
3. L'architecture531
3.1 L'organisation physique531
3.2 L'organisation logique533
4. L'administration générale534
4.1 L'application à déployer534
4.1.1 Le projet534
4.1.2 La livraison536
4.1.3 La gestion du nom de domaine536
4.2 Vue d'ensemble537
4.3 Le fichier server.xml537
4.3.1 La structure générale537
4.3.2 La balise <Server>538
4.3.3 La balise <Service>539
4.3.4 La balise <Connector>539
4.3.5 La balise <Executor>542
4.3.6 La balise <Engine>543
4.3.7 La balise <Host >544
4.3.8 La balise <Alias>547
4.3.9 La balise < Context>547
4.3.10 La balise <Valve>550
4.3.11 Les balises <Resource> et <ResourceLink>552
5. La mise en place de la sécurité553
5.1 La restriction d'accès554
5.1.1 La restriction sur l'adresse IP de l'émetteur554
5.1.2 La restriction sur l'adresse IP du serveur556
5.2 L'authentification et l'autorisation556
5.2.1 Présentation556
5.2.2 Les ressources à protéger557
5.2.3 Les autorisations559
5.2.4 Le schéma d'authentification560
5.2.5 La base de comptes563
5.3 Le chiffrement568
5.3.1 La théorie568
5.3.2 La mise en oeuvre569
5.4 L'utilisation du HTTP/2576
5.4.1 Introduction576
5.4.2 Mise en oeuvre576
5.4.3 Focus sur le push577
6. La gestion des logs581
6.1 Les logs d'accès581
6.2 Les logs de l'activité logicielle584
6.2.1 Le mécanisme585
6.2.2 Le paramétrage585
7. Conclusion592
Index
593