Introduction
De Java SE à Java EE
-
Interfaces de programmation classique : Java Standard Edition
-
Contient tous les paquetages utiles pour la réalisation d'applications console/graphique :
- pour les collections (dans java.util)
- la gestion des entrées/sorties (dans java.io et java.nio)
- la manipulation de sockets UDP/TCP (dans java.net)
- l'affichage d'interfaces graphiques (dans javax.swing et javafx)
-
Contient tous les paquetages utiles pour la réalisation d'applications console/graphique :
-
Interface de programmation orientée entreprise : Java Enterprise Edition
- Sur-ensemble de Java Standard Edition
-
Rajoute des composants pour gérer des applications communicantes avec architecture N-tiers :
- pour la programmation d'applications réparties (appels RMI, IDL Corba, gestion de transactions avec JTA, échanges de messages asynchrones avec Java Message Service, composants distribués avec Enterprise Java Beans, système d'injection de dépendances Context and Dependency Injection)
- pour la réalisation de interfaces web (Servlet, Portlet, Java Server Pages, Java Server Faces)
- pour la connexion avec des bases de données (Java DataBase Connectivity) avec la possibilité d'utiliser un Object Relational-Mapping (Java Persistence API)
- pour l'utilisation de divers protocoles applicatifs réseau (JavaMail pour IMAP/POP/SMTP, Java Naming and Directory Interface pour LDAP)
Java EE est uniquement une spécification d'API distincte des implantations. Les implantations peuvent couvrir une partie plus ou moins étendue de Java EE (une bibliothèque peut implanter JPA, une autre peut mettre en œuvre CDI...).
Architecture N-tiers
Découpage d'un système logiciel en différentes couches gérant chacune une problématique différente.
Traditionnellement, on distingue trois couches : la couche de gestion des données, la couche de traitement métier et la couche de présentation. L'implantation de la couche de gestion de données ainsi que de la couche de présentation peut être assisté par certaines bibliothèques gérant la persistance des données et l'affichage graphique. Quant à la couche de traitement métier, elle met en œuvre des processus de traitement (workflows) et algorithmes spécifiques.
La couche de gestion des données
Il s'agit de stocker de manière persistante les données et de pouvoir y accéder. Cette couche peut être soumise à différentes contraintes :
- La disponibilité des données. Les données doivent être lisibles et modifiables à tout moment.
- L'intégrité des données. Les données ne doivent pas être corrompues ou perdues.
Solution envisageable : répartition des données sur plusieurs machines
- Garantie d'une meilleure disponibilité (si des machines subissent des défaillances, d'autres peuvent prendre la relève).
- Conservation de plusieurs copies des données sur différentes machines. Ces copies doivent présenter un niveau acceptable de cohérence (même contenu) et l'on doit limiter la perte d'information.
Modèles de conservation des données :
-
Dans des structures de données en mémoire centrale (listes, dictionnaires)
- Les données ne sont pas persistantes et sont perdues à l'extinction de la machine
- Utile pour implanter des caches : copie de données présentes par ailleurs de manière persistante pour accélérer les traitements
-
En utilisant le modèle classique de système de fichiers
- Hiérarchie de répertoires avec noeuds terminaux (fichiers)
- Modèle aisé à mettre en oeuvre car tous les OS intégrent la gestion de système de fichiers
- Portabilité de l'approche
- Utile pour conserver des données volumineuses (données multimédia)
- Possibilité de conserver des objets et données diverses (sérialisation)
- Pas d'indexation du contenu des fichiers offerte par le système de fichiers
-
En utilisant une base de données
- Les données sont conservées dans des fichiers avec un format adapté
- La base de données offre des possibilités d'indexation
- Permet de tisser des liens entre des entités (graphe d'entités)
- Offre un modèle transactionnel pour réaliser atomiquement des opérations d'écriture (intégrité des données)
-
Il existe différents types de base de données :
- BDD avec accès direct au fichier de stockage : SQLite
- BDD relationnelle client/serveur avec langage de requêtage SQL : MySQL/MariaDB, PostgreSQL, Firebird, Oracle...
- BDD NoSQL avec modèle clé-valeur et répartition possible : Cassandra
- BDD orientée graphe : Neo4J
Généralement, on peut combiner ces différents modes de conservation de données.
Par exemple, pour gérer une vidéothèque, on pourra stocker les fichiers vidéos sur un système de fichiers (éventuellement réparti), on utilisera une base de données afin d'indexer les métadonnées concernant les vidéos (date de production, réalisateur, acteurs) ce qui autorise des requêtes plus ou moins complexes (quel film a été réalisé entre 1990 et 2000 par le réalisateur X avec l'acteur Y ?) et on pourra conserver en mémoire centrale les métadonnées concernant les films les plus consultés.
Java EE propose la Java Persitence API (JPA) afin d'offrir une abstraction de manipulation des données par un modèle orienté objet. On manipule ainsi des objets sans savoir comment ils sont stockés (en mémoire, sérialisés dans des fichiers, dans une base répartie ou non...).
La couche de traitement métier
Il s'agit de la partie qui utilise les données pour réaliser différents traitements dessus (pour les modifier ou créer de nouvelles données). Cette couche peut exploiter des données de différentes sources : fournies par un ou plusieurs utilisateurs, récupérées depuis des sources diverses sur Internet... On y définit généralement un workflow (flux de travail) afin d'indiquer comment les données doivent être traitées.
Par exemple, pour l'ajout d'un fichier vidéo dans la vidéothèque, on pourra :
- réaliser une reconnaissance vocale automatique sur la piste sonore pour extraire automatiquement des sous-titres
- identifier des portions d'oeuvres empruntées (extrait de films, bande son...)
- réaliser une compression dans un autre format
- ...
Il est utile de rechercher des bibliothèques réalisant chacune des tâches de traitement de données ; pour des domaines très spécifiques ou si des performances particulières sont attendues, il peut s'avérer nécessaire d'implanter soi-même ces fonctionnalités.
La couche de présentation
Une application doit pouvoir interagir avec un humain ou alors avec une autre application. Cet interaction est réalisée grâce à la couche de présentation. Pour cela il faut exposer une interface manipulable par l'acteur de l'interaction.
-
Interfaces possibles pour un humain
-
Interface en ligne de commande (Command Line Interface - CLI) permettant d'exécuter l'application en console
-
Avantages :
- Facilité de mise en oeuvre pour le développement
- La configurabilité est élevée (par le arguments, par des fichiers de configuration...)
- Bonne scriptabilité (utile pour des tâches répétitives ou des tests)
- Nécessite peu de ressources
-
Inconvénients :
- Plus difficile à appréhender pour un débutant
- Ne permet de représenter que du texte
- Type d'interface peu judicieuse pour une machine sans clavier physique (exemple : smartphone à écran tactile)
-
Types de CLI :
- Interface en mode non interactif : on lance un programme et on attend sa fin d'exécution (mode batch utile pour l'automatisation avec des scripts)
- Interface interactive : des questions peuvent être posées à l'utilisateur
- Interface de type NCurses : une interface plein écran évoluée utilisable en terminal est présentée en mode texte (exemples : éditeurs de texte de type emacs ou vi)
-
Avantages :
-
Interface graphique (avec écran, clavier, souris, pointage tactile...)
-
Avantages :
- Souvent plus intuitif pour un débutant qui peut apprendre par exploration de l'interface (tandis qu'une CLI peut imposer la lecture de longues pages de manuel)
- Permet de représenter des données audiovisuelles
- Permet une interaction plus ergonomique pour explorer des quantités de données importantes
-
Inconvénients :
- Peu économe en ressources (peu problématique avec les machines d'aujourd'hui)
- Scriptabilité plus ou moins impossible pour les tâches répétitives
- Difficile de présenter graphiquement de nombreuses options de configuration
- Grande diversité des types d'écran (taille, résolution) et des dispositifs d'entrée (écran tactile, souris, clavier physique...) rendant la réalisation d'une interface universelle délicate
-
Types d'interfaces graphiques :
-
Application native
- Utilisant directement l'API du système d'affichage graphique (serveur X, Windows)
- Utilisant une API d'abstraction éventuellement multi-plateformes (Swing, JavaFX, WxWidgets, GTK, API Android)
-
Application web
- Utilise un navigateur web (client HTTP)
- Utilise le langage de description HTML5, JavaScript, WebAssembly comme langages d'interaction
-
Approche mixte
- Intégration d'un navigateur web dans une application native (Apache Cordova)
- Permet l'usage d'API spécifiques de la plate-forme avec des plugins natifs
- Support possible de nombreux systèmes sans besoin de réécriture
-
Application native
-
Avantages :
-
Interface vocale (commande avec reconnaissance de voix, retour avec synthése vocale)
-
Domaines d'utilisation :
- Serveur téléphoniques
- Assistants vocaux sédentaires ou mobiles (Google Assistant, Apple Siri, Amazon Alexa...)
-
Avantages :
- Utilisation en mode main-libres
- Ne sollicite pas le regard de l'utilisateur
-
Inconvénients :
- Majorité des implantations en nuage (nécessite un accès Internet, problématique de la confidentialité des données)
- Nécessite un milieu ambiant relativement silencieux
-
Domaines d'utilisation :
-
Autres types d'interfaces
- Télécommandes, interrupteurs, actionneurs (détecteurs infra-rouge...), clavier de commandes domotiques avec communication par infra-rouge ou radio-fréquences (433 MHz, 868 MHz, 2,4 GHz...)
- Interfaces par échange asynchrone de messages sur un canal de communication (email, SMS)
- ...
-
Interface en ligne de commande (Command Line Interface - CLI) permettant d'exécuter l'application en console
-
Interfaces possibles pour une machine
-
Problématiques :
- Concevoir un format commun d'échanges de données pour des machines avec environnement hétérogène
- Assurer la fiabilité des échanges de données (protocoles de communication)
- Adopter un modèle de synchronisme
- Échange asynchrone de messages (email, SMS, MQTT...)
-
Exposition de méthodes à appeler à distance
- En utilisant des technologies propres à un langage (comme Remote Method Invocation pour Java)
- En utilisant des technologies web (SOAP, API de type REST)
- Gestion d'objets distribués : CORBA, ICE...
-
Problématiques :