0% ont trouvé ce document utile (0 vote)
3 vues28 pages

Revision Java

Ce document est une fiche de révision sur le langage et l'architecture Java, couvrant des sujets tels que Jakarta EE, JPA, REST, et la programmation orientée objet. Il aborde les architectures logicielles, la structure et les bases du langage Java, ainsi que des fonctionnalités avancées et des outils associés. La fiche inclut également des concepts clés, des exemples de code, et des exercices d'entraînement pour renforcer les connaissances des étudiants en M1IA – FPC pour l'année 2025-2026.

Transféré par

compaore24alexis24
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
3 vues28 pages

Revision Java

Ce document est une fiche de révision sur le langage et l'architecture Java, couvrant des sujets tels que Jakarta EE, JPA, REST, et la programmation orientée objet. Il aborde les architectures logicielles, la structure et les bases du langage Java, ainsi que des fonctionnalités avancées et des outils associés. La fiche inclut également des concepts clés, des exemples de code, et des exercices d'entraînement pour renforcer les connaissances des étudiants en M1IA – FPC pour l'année 2025-2026.

Transféré par

compaore24alexis24
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

■ FICHE DE RÉVISION

Langage & Architecture Java

Jakarta EE • JPA • REST • POO • Collections

M1IA – FPC | 2025-2026

■■ Architectures 1-tier / n-tiers ■ Java & JVM Bytecode & JIT ■■ JPA / ORM Entités & Requêtes

■ Jakarta REST Annotations &


déploiement ■ Maven GAV & Cycle de vie ■ POO Héritage & Polymorphisme
■ SOMMAIRE
1. Architectures logicielles
■ 1.1 Niveaux d'abstraction (Contexte → Code)
■ 1.2 Architecture 1-tier, 2-tiers, n-tiers
■ 1.3 Architectures applicative, logique et physique

2. Java – Le langage et la plateforme


■ 2.1 JVM, JRE, JDK
■ 2.2 Bytecode, JIT et évolution des versions
■ 2.3 JSE / JME / JEE / Jakarta EE

3. Les bases du langage Java


■ 3.1 Structure d'une classe
■ 3.2 Types primitifs et objets (Stack / Heap)
■ 3.3 Opérateurs et structures de contrôle
■ 3.4 Tableaux, attributs et méthodes
■ 3.5 Cycle de vie d'un objet

4. Programmation Orientée Objet (POO)


■ 4.1 Encapsulation
■ 4.2 Héritage et composition
■ 4.3 Polymorphisme (statique & dynamique)
■ 4.4 Constructeurs et surcharge
■ 4.5 Interfaces

5. Fonctionnalités avancées du langage


■ 5.1 Exceptions (hiérarchie, try-catch-finally)
■ 5.2 Énumérations
■ 5.3 Collections (List, Set, Queue, Map)
■ 5.4 Dates ([Link])

6. Jakarta EE & Outils


■ 6.1 Maven (POM, GAV, cycle de vie)
■ 6.2 Serveurs d'application (WildFly, GlassFish…)

7. Jakarta Persistence (JPA)


■ 7.1 Entités JPA et annotations
■ 7.2 Identifiants simples et composés
■ 7.3 Héritage JPA (Single Table, Joined…)
■ 7.4 EntityManager et cycle de vie
■ 7.5 Associations (1:1, 1:N, N:1, M:N)

8. Jakarta RESTful Web Services


■ 8.1 Concepts REST et annotations
■ 8.2 Configuration et déploiement (WAR / JAR)

9. Révision finale
■ 9.1 Résumé des points clés
■ 9.2 QCM d'entraînement (20 questions)
1. ARCHITECTURES LOGICIELLES
1.1 Les niveaux d'abstraction
Un logiciel peut être décrit à différents niveaux de détail. On part d'une vue très globale vers une vue très
technique. Voici les 4 niveaux :

Niveau Nom Ce qu'on voit Objectif

1 Contexte (Vue système) Le système dans son Comprendre ce que fait


environnement, acteurs le système
externes

2 Conteneurs Applications, services, Décrire les grandes


bases de données briques techniques

3 Composants Modules internes d'un Comprendre la structure


conteneur interne

4 Code Classes, méthodes, Décrire l'implémentation


attributs précise

Imaginez une ville : niveau 1 = vue satellite, niveau 2 = les bâtiments, niv
meubles dans chaque pièce.

1.2 Évolution des architectures physiques


Architecture 1-tier
Toutes les couches (présentation, traitement, données) sont sur la même machine. C'est l'informatique
centralisée.

Couplage fort : si on change la présentation, on risque de casser le métie

Architecture 2-tiers (client-serveur)


Le client gère la présentation ET le traitement métier. Un serveur séparé gère uniquement les données.

Toujours un manque de séparation. Rigide et difficile à faire évoluer.

Architecture n-tiers
La logique métier est découpée en composants spécialisés indépendants, pouvant tourner sur des
machines distinctes. On peut ajouter autant de niveaux que nécessaire.

Distribution libre de la logique applicative. Facilite la répartition de charge


modèle utilisé par Jakarta EE.

1.3 Architectures applicative, logique et physique


Type Définition Niveau

Applicative Structure le SI en blocs applicatifs Macro


communicants. Décrit les
applications, flux et messages.

Logique Décrit la répartition des tâches au Moyen


sein d'une application (couches :
présentation, métier, données).

Physique Décrit les composants matériels : Micro


serveurs, postes, réseau, stockage.
2. JAVA – LE LANGAGE ET LA PLATEFORME
2.1 JVM, JRE, JDK
Java résout le problème de portabilité grâce à la Java Virtual Machine (JVM). Voici la hiérarchie :

Composant Contenu Rôle

JVM Machine virtuelle Interprète le bytecode. Abstrait


l'OS. Gère la mémoire (Garbage
Collector).

JRE JVM + APIs Java Environnement d'exécution pour


lancer des programmes Java.

JDK JRE + compilateur (javac) + outils Kit complet pour développer ET


exécuter des programmes Java.

"Write Once, Run Everywhere" : on compile une seule fois en bytecode (


d'exploitation l'exécute.

2.2 Bytecode, JIT et compilation


Contrairement au C/C++ qui produit un binaire dépendant de l'OS, Java produit du bytecode, un format
intermédiaire universel.

Étape Commande Résultat

Compilation javac [Link] Produit [Link]


(bytecode)

Exécution java HelloWorld La JVM interprète le bytecode

Le JIT (Just-In-Time compiler) améliore les performances en compilant dynamiquement les portions de
bytecode fréquemment utilisées en code machine natif.

2.3 JSE / JME / JEE / Jakarta EE


Plateforme Cible Description

Java SE Applications Desktop La base : types, collections, I/O,


concurrence…

Java ME Mobile / embarqué Sous-ensemble de Java SE adapté


aux petits appareils

Java EE / Jakarta EE Entreprise / Web Ajoute JPA, Servlets, EJB,


JAX-RS, CDI… pour apps
distribuées

Java Card Cartes à puce / SIM Version ultra-allégée de Java

Java EE a été cédé par Oracle à la Eclipse Foundation en 2017. Le nom


javax.* est devenu jakarta.*). Jakarta EE 10 est la version actuelle.
3. LES BASES DU LANGAGE JAVA
3.1 Structure d'une classe
En Java, tout le code est organisé en classes. Une classe est déclarée dans un fichier portant
exactement le même nom avec l'extension .java.

public class Voiture {


// Constantes
public static final int VITESSE_MAX = 250;

// Attributs (état interne)


private double vitesse;
private String marque;

// Constructeur
public Voiture(String marque) {
[Link] = marque;
[Link] = 0;
}

// Méthode
public double getVitesse() {
return vitesse;
}

// Point d'entrée du programme


public static void main(String[] args) {
Voiture v = new Voiture("Toyota"); // mot-clé new
[Link]([Link]()); // affiche 0.0
}
}

Élément Description

Attribut Variable stockant l'état d'un objet (ex: vitesse, marque)

Méthode Fonction définissant le comportement d'un objet

Constructeur Méthode spéciale (même nom que la classe, sans


return) appelée à la création

main() Point d'entrée du programme, signature obligatoire :


public static void main(String[] args)

new Mot-clé pour créer une instance (objet) d'une classe

3.2 Types primitifs et types objets


Java est un langage fortement typé. Il distingue deux catégories de types :

Type primitif Taille Valeur par défaut Classe Wrapper

byte 8 bits 0 Byte


Type primitif Taille Valeur par défaut Classe Wrapper

short 16 bits 0 Short

int 32 bits 0 Integer

long 64 bits 0L Long

float 32 bits 0.0f Float

double 64 bits 0.0d Double

char 16 bits '\u0000' Character

boolean 1 bit false Boolean

Autoboxing : Java convertit automatiquement un primitif en objet wrapper (int → Integer) et inversement
(unboxing).

int x = 5;
Integer obj = x; // autoboxing : int -> Integer
int y = obj; // unboxing : Integer -> int

Stack (pile) : stocke les variables locales et références. Rapide, géré aut
objets créés avec new. Plus grand, géré par le Garbage Collector. Un ob
supprimé par le GC.

3.3 Opérateurs
Catégorie Opérateurs Exemple

Affectation = int a = 5;

Arithmétiques +-*/% int r = 10 % 3; // r = 1

Unaires ++ -- - a++; // équivalent à a = a+1

Relationnels == != < > <= >= if (a > 0) { ... }

Logiques && || ! if (a>0 && b>0) { ... }

Concaténation + "Bonjour " + nom

Ternaire cond ? val1 : val2 String s = (x>0)?"pos":"neg";

Ne pas confondre == (comparaison de valeur/référence) et .equals() (com


utilisez TOUJOURS .equals() : "hello".equals(s)

3.4 Structures de contrôle


// --- if / else if / else ---
if (note >= 16) {
[Link]("Très bien");
} else if (note >= 12) {
[Link]("Bien");
} else {
[Link]("Insuffisant");
}

// --- switch ---


switch (jour) {
case "Lundi": [Link]("Début de semaine"); break;
case "Vendredi": [Link]("TGIF"); break;
default: [Link]("Jour normal");
}

// --- for classique ---


for (int i = 0; i < 5; i++) {
[Link](i);
}

// --- while ---


while (compteur > 0) { compteur--; }

// --- do-while (exécuté au moins une fois) ---


do { lireSaisie(); } while (!saisieValide);

3.5 Tableaux, attributs et méthodes

// Déclaration + création
int[] notes = new int[5];

// Initialisation directe
String[] fruits = {"pomme", "banane", "mangue"};

// Accès et modification
fruits[0] = "orange";
[Link]([Link]); // 3

// Parcours avec for-each


for (String f : fruits) {
[Link](f);
}

Portée des attributs : public = visible partout ; private = visible uniquement dans la classe. Un attribut
final ne peut être initialisé qu'une seule fois.

Signature d'une méthode : [portée] [type_retour] nomMéthode(paramètres). Si la méthode ne retourne


rien, on utilise void. Un paramètre final ne peut pas être réaffecté.
4. PROGRAMMATION ORIENTÉE OBJET (POO)
4.1 Encapsulation
Définition : L'encapsulation consiste à cacher les données internes d'un objet et à ne les exposer qu'au
travers de méthodes contrôlées.

Mise en œuvre en 2 étapes :


• ① Déclarer les attributs private
• ② Fournir des getters (lecture) et setters (écriture avec validation)

public class CompteBancaire {


private double solde; // inaccessible directement depuis l'extérieur

public double getSolde() { // getter


return solde;
}

public void setSolde(double s) { // setter avec validation


if (s >= 0) {
[Link] = s;
} else {
[Link]("Solde invalide !");
}
}
}

• Intégrité des données (on ne peut pas mettre un solde négatif par erreu
interne sans modifier l'interface publique. • Découplage : chaque classe e
données.

4.2 Héritage et Composition


L'héritage permet à une classe fille d'hériter des attributs et méthodes d'une classe mère. Relation "est
un" (is-a). Mot-clé : extends.
public class Vehicule {
protected String marque;
protected int vitesseMax;

public Vehicule(String marque, int vitesseMax) {


[Link] = marque;
[Link] = vitesseMax;
}
public void afficher() {
[Link](marque + " - vmax: " + vitesseMax);
}
}

public class Voiture extends Vehicule {


private int nbPortes;

public Voiture(String marque, int vitesseMax, int nbPortes) {


super(marque, vitesseMax); // appel du constructeur parent
[Link] = nbPortes;
}
}

Visibilité Même classe Sous-classe Autre package

private ■ ■ ■

protected ■ ■ ■

public ■ ■ ■

(défaut) ■ ■ (même pkg) ■

Java ne supporte que l'héritage SIMPLE (une seule classe mère). Une c
mot-clé super permet d'accéder aux membres de la classe mère.

La Composition : relation "a un" (has-a). Une classe contient une instance d'une autre classe comme
attribut.

// Agrégation faible : Bibliothèque a des Livres (ils peuvent exister sans elle)
public class Bibliotheque {
private List livres;
}

// Composition forte : Voiture a un Moteur (le moteur n'existe pas sans la voiture)
public class Voiture {
private Moteur moteur;
public Voiture() {
[Link] = new Moteur(); // créé dans le constructeur
}
}

4.3 Polymorphisme
Type Nom Mécanisme Résolu à

Statique Surcharge (Overloading) Même nom, paramètres Compilation


différents dans la MÊME
classe

Dynamique Redéfinition (Overriding) Même signature dans la Exécution (liaison


classe FILLE dynamique)

// SURCHARGE (Overloading) - même classe, paramètres différents


public class Calculatrice {
public int additionner(int a, int b) { return a + b; }
public double additionner(double a, double b) { return a + b; } // surchargé
}

// REDÉFINITION (Overriding) - héritage requis


public class Animal {
public String parler() { return "..."; }
}
public class Chien extends Animal {
@Override // bonne pratique : annotation obligatoire recommandée
public String parler() { return "Woof!"; }
}

// Liaison dynamique en action


Animal a = new Chien(); // type référence = Animal, type réel = Chien
[Link]([Link]()); // affiche "Woof!" (méthode du type RÉEL)

4.4 Constructeurs et surcharge

public class Etudiant {


private String nom;
private int age;
private String filiere;

// Constructeur par défaut (sans paramètres)


public Etudiant() {
this("Inconnu", 0, "Non définie"); // appel d'un autre constructeur
}

// Constructeur avec nom seulement


public Etudiant(String nom) {
this(nom, 0, "Non définie");
}

// Constructeur complet (le plus "riche")


public Etudiant(String nom, int age, String filiere) {
[Link] = nom;
[Link] = age;
[Link] = filiere;
}
}
• Même nom que la classe, aucun type de retour (même pas void). • Si v
paramètres, le constructeur sans argument par défaut N'EST PLUS géné
un autre constructeur de la même classe (doit être en 1ère ligne). • supe
mère (doit être en 1ère ligne).

4.5 Interfaces
Une interface est un contrat : elle déclare des méthodes que les classes qui l'implémentent doivent
fournir. Mot-clé : implements. Une classe peut implémenter plusieurs interfaces (héritage multiple de
comportement).

public interface Volable {


void decoller(); // implicitement public abstract
void atterrir();
default void planer() { // méthode par défaut (Java 8+)
[Link]("Je plane...");
}
}

public interface Nageble {


void nager();
}

// Une classe peut implémenter plusieurs interfaces


public class Canard extends Animal implements Volable, Nageble {
@Override public void decoller() { [Link]("Envol du canard"); }
@Override public void atterrir() { [Link]("Atterrissage"); }
@Override public void nager() { [Link]("Coin coin..."); }
}
5. FONCTIONNALITÉS AVANCÉES DU LANGAGE
5.1 Exceptions
Une exception est un événement anormal survenant à l'exécution. Java les gère avec le mécanisme
try-catch-finally.

Catégorie Hérite de Obligatoire à gérer? Exemples

Checked Exception Exception Oui (catch ou throws) IOException,


FileNotFoundException

Unchecked Exception RuntimeException Non NullPointerException, Arr


ayIndexOutOfBoundsExc
eption

Error Error Non (irrécupérable) OutOfMemoryError,


StackOverflowError

public void lireFichier(String chemin) throws IOException {


try {
// Code risqué
FileReader fr = new FileReader(chemin);
int c = [Link]();
} catch (FileNotFoundException e) { // plus spécifique en PREMIER
[Link]("Fichier non trouvé : " + [Link]());
} catch (IOException e) { // plus général ensuite
[Link]("Erreur I/O : " + [Link]());
} finally {
[Link]("Toujours exécuté (fermeture ressources)");
}
}

// Lever une exception personnalisée


if (age < 0) throw new IllegalArgumentException("Age invalide : " + age);

// Créer une exception personnalisée


public class SoldeInsuffisantException extends RuntimeException {
public SoldeInsuffisantException(String msg) { super(msg); }
}

5.2 Énumérations
public enum JourSemaine {
LUNDI, MARDI, MERCREDI, JEUDI, VENDREDI, SAMEDI, DIMANCHE;

public boolean estWeekEnd() {


return this == SAMEDI || this == DIMANCHE;
}
}

// Utilisation
JourSemaine j = [Link];
[Link]([Link]()); // false

Type-safe : impossible d'assigner une valeur invalide. Les enums sont de


avoir des attributs, constructeurs et méthodes.

5.3 Collections (Java Collections Framework)


Interface Caractéristiques Implémentations courantes

List Ordonnée, indexée, doublons ArrayList (accès rapide), LinkedList


autorisés (insertion rapide)

Set Sans doublons, ordre non garanti HashSet (O(1)), LinkedHashSet


(ordre insertion), TreeSet (trié)

Queue FIFO (premier entré, premier sorti) LinkedList, PriorityQueue

Map Paires clé-valeur, clés uniques HashMap, LinkedHashMap,


TreeMap

// List - ArrayList
List liste = new ArrayList<>();
[Link]("Alice"); [Link]("Bob"); [Link]("Alice"); // doublons OK
[Link]([Link](0)); // "Alice"

// Set - HashSet
Set ensemble = new HashSet<>();
[Link]("pomme"); [Link]("pomme"); // doublon ignoré
[Link]([Link]()); // 1

// Map - HashMap
Map scores = new HashMap<>();
[Link]("Alice", 95); [Link]("Bob", 87);
[Link]([Link]("Alice")); // 95

// Parcours avec for-each (toutes les collections)


for (String nom : liste) { [Link](nom); }

5.4 Gestion des dates ([Link] – Java 8+)


Classe Contient Exemple

LocalDate Date seulement (année, mois, jour) 2025-10-07


Classe Contient Exemple

LocalTime Heure seulement 10:30:00

LocalDateTime Date + heure (sans fuseau) 2025-10-07T10:30:00

ZonedDateTime Date + heure + fuseau horaire 2025-10-07T10:30:00+01:00[Africa


/Abidjan]

import [Link].*;

LocalDate auj = [Link]();


LocalDate noel = [Link](2025, 12, 25);

// Les objets sont IMMUABLES : chaque opération retourne un nouvel objet


LocalDate demain = [Link](1);
LocalDate anneeProch = [Link](1);

[Link]([Link](auj)); // true

// Fuseau horaire
ZoneId zone = [Link]("Africa/Abidjan");
ZonedDateTime maintenant = [Link](zone);
6. JAKARTA EE & OUTILS
6.1 Maven – Gestionnaire de projet
Maven est un outil de build et gestion de projet. Son coeur est le fichier [Link] (Project Object Model).

Concept Description

GAV Identifiant unique : groupId:artifactId:version (ex:


[Link]:monapp:1.0.0)

[Link] Fichier XML décrivant le projet : dépendances, plugins,


version Java…

Dépendance Bibliothèque externe déclarée dans [Link],


téléchargée depuis Maven Central

Packaging Type d'archive produite : jar, war, ear (war =


application web)

Cycle de vie Maven (dans l'ordre) :

validate → compile → test → package → verify → install → deploy



mvn package (produit le .war ou .jar)

[Link]
monapp
1.0.0
war

[Link]
[Link]-api
10.0.0
provided

compile (défaut) = embarqué dans le .war. provided = fourni par le serve


= uniquement pendant les tests.

6.2 Serveurs d'application Jakarta EE


Serveur Type Particularité

WildFly Open source (Red Hat) Léger, rapide, modulaire.


Recommandé pour dev/test/prod.

GlassFish Open source (Eclipse) Serveur de référence Jakarta EE


officiel.
Serveur Type Particularité

Payara Open source / Commercial Dérivé de GlassFish, support actif.

Open Liberty Open source (IBM) Très performant, cloud-native.

TomEE Open source (Apache) Apache Tomcat + extensions


Jakarta EE.
7. JAKARTA PERSISTENCE (JPA)
JPA (Jakarta Persistence API) est la couche standard Java pour faire le lien entre les objets Java et les
tables d'une base de données relationnelle (ORM : Object-Relational Mapping). L'implémentation la plus
connue est Hibernate.

7.1 Entités JPA et annotations de base


Une entité JPA doit respecter ces règles :
• • Annotée @Entity
• • Avoir au moins un attribut annoté @Id
• • Avoir un constructeur sans argument
• • Implémenter [Link]
• • Tous les attributs privés avec getters/setters

@Entity
@Table(name = "employes") // nom personnalisé de la table
public class Employe implements Serializable {

@Id
@GeneratedValue(strategy = [Link])
private Long id;

@Column(name = "nom_complet", nullable = false, length = 100)


private String nom;

@Enumerated([Link]) // stocké comme "ACTIF" ou "INACTIF"


private Statut statut;

@Temporal([Link]) // pour [Link]


private Date dateEmbauche;

// constructeur sans argument obligatoire


public Employe() {}
// ... getters et setters
}

Annotation Rôle

@Entity Déclare la classe comme entité persistante

@Table(name="...") Personnalise le nom de la table (défaut = nom de la


classe)

@Id Définit la clé primaire

@GeneratedValue Stratégie de génération : IDENTITY, SEQUENCE,


TABLE, AUTO

@Column Personnalise le nom, la taille, nullabilité de la colonne

@Enumerated Stockage d'un enum (STRING ou ORDINAL)


Annotation Rôle

@Temporal Type temporel pour [Link] (DATE,


TIMESTAMP, TIME)

7.2 Stratégies d'identifiant (@GeneratedValue)


Stratégie Description

IDENTITY Utilise l'auto-incrément natif du SGBD


(AUTO_INCREMENT MySQL, SERIAL PostgreSQL)

SEQUENCE Utilise une séquence gérée par Hibernate (table


hibernate_sequence)

TABLE Utilise une table dédiée pour les séquences (portable


mais lent)

AUTO Hibernate choisit la meilleure stratégie selon le SGBD

7.3 Héritage JPA


Stratégie Mapping DB Avantage Inconvénient

SINGLE_TABLE (défaut) Une seule table pour Simple, pas de jointure Beaucoup de NULL si
toute la hiérarchie hiérarchie complexe

TABLE_PER_CLASS Une table par classe Aucun NULL Pas supporté par tous les
concrète providers

JOINED Une table par classe, Propre, normalisé Requêtes plus lentes
jointures pour (jointures)
reconstituer

7.4 EntityManager et cycle de vie


État Description

NEW Objet créé avec new, pas encore géré par JPA

MANAGED Associé au contexte de persistance (après persist() ou


find())

DETACHED N'est plus géré (contexte fermé ou clear())

REMOVED Marqué pour suppression de la DB (après remove())


// Configuration : [Link] (dans src/main/resources/META-INF/)

// Utilisation complète de l'EntityManager


EntityManagerFactory emf = [Link]("monPU");
EntityManager em = [Link]();

[Link]().begin();

// CREATE
Employe emp = new Employe(); // état: NEW
[Link]("Koné Moussa");
[Link](emp); // état: MANAGED → INSERT dans la DB au commit

// READ
Employe trouve = [Link]([Link], 1L); // SELECT par clé primaire

// UPDATE (automatique si MANAGED)


[Link]("Koné Moussa Diallo"); // modif auto détectée

// DELETE
[Link](trouve); // état: REMOVED → DELETE au commit

[Link]().commit();
[Link]();
[Link]();

7.5 Associations entre entités


Annotation Type Table générée Exemple

@OneToOne 1:1 Colonne FK dans l'entité Employé ↔ Contact


maître

@OneToMany 1:N Table associative (si Laboratoire → List


unidirectionnel)

@ManyToOne N:1 Colonne FK dans la table Employe → Laboratoire


"many"

@ManyToMany M:N Table associative avec 2 Technicien ↔


FK Competence
// Bidirectionnel 1:N - le "mappedBy" définit le côté esclave
@Entity public class Laboratoire {
@Id @GeneratedValue private Long id;

@OneToMany(mappedBy = "laboratoire") // côté maître


private List employes;
}

@Entity public class Employe {


@Id @GeneratedValue private Long id;

@ManyToOne // côté esclave (porte la FK)


@JoinColumn(name = "labo_id")
private Laboratoire laboratoire;
}
8. JAKARTA RESTFUL WEB SERVICES (JAX-RS)
JAX-RS est l'API Jakarta EE pour créer des services web REST. REST (Representational State Transfer)
utilise les méthodes HTTP standard (GET, POST, PUT, DELETE) et identifie les ressources par des URI.

8.1 Annotations principales


Annotation Rôle Exemple

@Path Chemin de la ressource @Path("/produits")

@GET / @POST / @PUT / Méthode HTTP @GET → lecture


@DELETE

@Produces Type de réponse retournée @Produces("application/json")

@Consumes Type de contenu reçu @Consumes("application/json")

@PathParam Paramètre dans l'URL @PathParam("id") int id

@QueryParam Paramètre de requête (?nom=val) @QueryParam("page") int p

@ApplicationPath Préfixe de toutes les URLs REST @ApplicationPath("/api")


// Configuration de l'application REST
@ApplicationPath("/api")
public class MyRestApp extends Application { }

// Ressource REST pour les produits


@Path("/produits")
public class ProduitResource {

// GET /api/produits → liste tous les produits


@GET
@Produces("application/json")
public List listerTous() {
return [Link]();
}

// GET /api/produits/5 → produit par ID


@GET
@Path("/{id}")
@Produces("application/json")
public Produit trouverParId(@PathParam("id") int id) {
return [Link](id);
}

// POST /api/produits → créer un nouveau produit


@POST
@Consumes("application/json")
@Produces("application/json")
public Response creer(Produit p) {
[Link](p);
return [Link](201).entity(p).build();
}
}

8.2 Déploiement (WAR vs JAR bootable)


Critère WAR classique JAR bootable (Galleon)

Nécessite WildFly installé Oui Non (serveur embarqué)

Format .war .jar

Lancement Via WildFly [Link] java -jar [Link]

Usage recommandé Déploiement classique / CI-CD Microservices, cloud


# Construction
mvn clean package

# WAR : copier dans le répertoire de déploiement WildFly


cp target/[Link] /opt/wildfly/standalone/deployments/
/opt/wildfly/bin/[Link]

# JAR bootable : lancement direct


java -jar target/[Link]
9. RÉVISION FINALE
9.1 Résumé des points clés

Architecture • 1-tier : tout sur une machine (rigide). 2-tiers : client lourd + serveur données. n-tiers :
composants métier indépendants distribués.
• Architecture physique (matériel) ≠ logique (couches) ≠ applicative (blocs applicatifs).

JVM / Java • JVM = machine abstraite exécutant le bytecode. JDK = JVM + JRE + outils dev.
• "Write Once, Run Everywhere" : le bytecode est universel. Le JIT optimise l'exécution.
• Jakarta EE étend Java SE pour les applications d'entreprise (JPA, REST, CDI, Servlets…).

Bases Java • 8 types primitifs (int, double, boolean…) + classes wrappers (Integer, Double, Boolean…).
• Autoboxing : conversion automatique primitif ↔ objet.
• Stack = variables locales / références. Heap = objets (gérés par le GC).

POO • Encapsulation : attributs private + getters/setters → contrôle des données.


• Héritage (extends) : relation "est un". Java = héritage SIMPLE uniquement.
• Polymorphisme : surcharge (overloading) = même nom, params différents, même classe.
Redéfinition (overriding) = même signature, classe fille.
• Interface (implements) : contrat de comportement. Héritage MULTIPLE d'interfaces autorisé.
• Constructeur : même nom que la classe, sans type de retour, appelé par new.

Avancé • Exceptions : Checked (obligatoire à gérer), Unchecked (RuntimeException), Error.


• Enums : type sûr pour des constantes nommées. Vraies classes en Java.
• Collections : List (ordonné, doublons), Set (unique), Map (clé-valeur), Queue (FIFO).
• [Link] : LocalDate, LocalTime, LocalDateTime, ZonedDateTime. Objets IMMUABLES.

JPA • @Entity + @Id + constructeur vide + Serializable = entité valide.


• Stratégies ID : IDENTITY (auto-increment), SEQUENCE, TABLE, AUTO.
• EntityManager : persist(), find(), remove(), merge(). Toujours dans une transaction.
• Associations : @OneToOne, @OneToMany, @ManyToOne, @ManyToMany. mappedBy =
côté bidirectionnel esclave.
• Héritage : SINGLE_TABLE (défaut), JOINED (normalisé), TABLE_PER_CLASS.

REST / Maven • REST : ressources identifiées par URI, méthodes HTTP (GET/POST/PUT/DELETE).
• @Path, @GET, @POST, @Produces, @Consumes, @PathParam, @QueryParam.
• Maven : [Link], GAV (groupId:artifactId:version), cycle de vie (compile → package →
deploy).
9.2 QCM d'entraînement (20 questions)

Pour chaque question, choisissez la meilleure réponse. Les corrections s

Q1. Que signifie 'Write Once, Run Everywhere' en Java ?


A) Le code source est identique sur tous les OS
■ B) Le bytecode Java est exécutable sur toute JVM, quel que soit l'OS
C) On ne peut compiler qu'une seule fois par machine
D) Java est le seul langage portable

Q2. Quelle commande compile un fichier Java ?


A) java [Link]
■ B) javac [Link]
C) compile [Link]
D) run [Link]

Q3. Parmi ces types, lequel est un type PRIMITIF en Java ?


A) String
B) Integer
■ C) boolean
D) Object

Q4. Quelle est la différence entre Stack et Heap ?


A) La Stack stocke les objets, le Heap les primitifs
■ B) La Stack stocke les variables locales/références, le Heap stocke les objets
C) Il n'y a pas de différence en Java
D) La Stack est gérée par le développeur, le Heap par la JVM

Q5. Quel mot-clé est utilisé pour créer un objet en Java ?


A) create
B) make
■ C) new
D) object

Q6. L'encapsulation consiste à :


A) Hériter d'une classe mère
■ B) Cacher les attributs et contrôler l'accès via des getters/setters
C) Implémenter plusieurs interfaces
D) Surcharger les méthodes

Q7. En Java, l'héritage de classes est :


A) Multiple : une classe peut étendre plusieurs classes
■ B) Simple : une classe ne peut étendre qu'une seule classe
C) Interdit en Java
D) Optionnel selon la JVM

Q8. Quelle annotation est recommandée lors de la redéfinition d'une méthode ?


■ A) @Override
B) @Redefine
C) @Overload
D) @Inherit

Q9. La surcharge (Overloading) est résolue à :


A) L'exécution
■ B) La compilation
C) Le déploiement
D) L'installation

Q10. Un constructeur en Java :


A) A un type de retour void
■ B) N'a aucun type de retour et porte le même nom que la classe
C) Est optionnel même si on déclare d'autres constructeurs
D) Peut être appelé plusieurs fois sur un même objet

Q11. Quelle exception est une Unchecked Exception ?


A) IOException
B) FileNotFoundException
■ C) NullPointerException
D) SQLException

Q12. Le bloc finally est exécuté :


A) Uniquement si une exception est levée
B) Uniquement si aucune exception n'est levée
■ C) Toujours, qu'une exception soit levée ou non
D) Uniquement si on retourne une valeur dans le try

Q13. Quelle collection n'autorise pas les doublons ?


A) ArrayList
B) LinkedList
■ C) HashSet
D) Stack

Q14. Quelle affirmation est vraie sur les objets [Link] ?


A) Ils sont mutables
■ B) Ils sont immuables (chaque opération retourne un nouvel objet)
C) On les crée toujours avec new
D) Ils remplacent les int pour les calculs

Q15. En JPA, quelle annotation déclare une classe comme entité persistante ?
A) @Table
B) @Persistent
■ C) @Entity
D) @Model

Q16. Dans le cycle de vie JPA, après [Link](obj), l'entité est dans l'état :
A) NEW
■ B) MANAGED
C) DETACHED
D) REMOVED

Q17. Quelle stratégie de génération d'ID utilise l'AUTO_INCREMENT MySQL ?


A) SEQUENCE
B) TABLE
C) AUTO
■ D) IDENTITY

Q18. Dans une relation bidirectionnelle JPA, l'attribut mappedBy est placé :
A) Sur le côté maître (celui qui possède la FK)
■ B) Sur le côté esclave (celui qui ne possède pas la FK)
C) Sur les deux côtés à la fois
D) N'importe où

Q19. En JAX-RS, l'annotation @PathParam sert à :


A) Lire un paramètre de formulaire HTML
B) Lire un paramètre de requête HTTP (?param=val)
■ C) Lire une valeur intégrée dans l'URL (/produits/{id})
D) Définir le chemin de la ressource

Q20. Dans Maven, que signifie GAV ?


■ A) GroupId, ArtifactId, Version
B) GlobalAccess, Visibility, Type
C) GenerateAll, Validate, Verify
D) GroupAccess, AppId, View

Bonne chance pour ton devoir ! ■ – M1IA/FPC 2025-2026

Vous aimerez peut-être aussi