# Architecture des Systèmes d'informations ## Introduction - Cours 1 - TD 1 Création d'un environment de dévellopement Java et dévellopement en JAVA ### Différents acteurs de l'architecture #### Composants web Une servlets est un composant de la couche web qui va s'éxécuter sur un conteneur web Servlets = composants webs. = classe java éxécuté sur le serveur Tomcat Serveur Web++ : Utilisateur -> Tomcat -> connexion à une BDD, création de la page html et la retourne à l'utilisateur. Serveur Web classique : A la différence d'un serveur web classique Utilisateur -> Apache -> accès à une page #### Composants métier (EJB) Serveur d'application commortant des Classe java effectuant les calculs plus importants et plus lourds /!\ Pas une composante de type web,trop lent /!\ #### BDD Base de données MySQL connectées aux deux couches #### Client léger Navigateur web ou au maximum des applications java intégré (applet) Exemples : - client léger sur navigateur avec communication HTTP #### Client lourd application avec interface graphique évolué faisant du traitement (içi en java) Exemples : - client java avec communication RMI avec la couche métier #### Autres .net, PHP, C, C++ communication avec SOAP (pas ce cours) #### Schéma (voir cours): Conteneur web = Tomcat+JDK+(JSP(voir sèance 2)) Traite la mise en page de façon dynamique. Lorsqu'une requête web arrive (navigateur web html/php/etc... ou client lourd en java appélé "client de l'application"), le conteneur web répond avec le client ### Les Servlets Une servlets est un composant de la couche web qui va s'éxécuter sur un conteneur web PERMET L'EXTENSION DES FONCTIONS DU SERVEUR WEB avec un accès à une BDD Note : Peut être chargé au démarrage du client ou à la première requête. Servlets = composants webs. = classe java éxécuté sur le serveur Tomcat Surcharger avec DoGet et DoPost Paquet : ``` import javax.servlet.* import javax.servlet.http.* public class ServletDeBase extends HttpServlet{ public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException } ``` Annotation @WebServlet("/hello") ### Cycle de vie d'un servlet 1 - servlet chargé au démarrage 2 - appel de la méthode init() = méthode contenant des accès utile (BDD) et appel la méthode service 3 - le conteneur crée les objets Request et Response spécifique à la requête 4 - appel de la méthode service() à chaque requête pour une nouvelle requête et prend en paramètre les objets Request et Response 5 - Request analyse les informations provenant du client à l'aide de la méthode Service() 6 - Response va fournir une réponse au client à l'aide de la méthode Service() 7 - Méthode Destroy() appelée lors du déchargement import javax.naming.*; import javax?naming.directory.*; Les servlets, chaque application à un Context pour accéder au ressource dont l'application a besoin Déclaration des servlets dans le contexte : TD1\WEB-INF\Web.xml -> nom du servlet -> url du servlet sur lequel il répond le servlet répond sur l'addresse http://localhost:8080/ServletsTD1_war_exploded/hello page envoyé par la méthode DoGet ### Tuto TP1 installer intelliJ sur leur site web en version ultimate lancer intelliJ > cd dossier source/sbin/ et lancer ./idea.sh Créer un projet maven et ajouter le serveur tomcat ajouter les dependency créer un dossier "mark as" dans src, créer un package accès servlet http://localhost:8080/ProjetServlet2_war_exploded/hello ## Cours 2 -connexion de la couche web à une BDD mySQL via JDBC JDBC = API java C'est le serveur web qui se connecte, pas le client !! 1ère possibilité : ouverture de connexion dans la servlets 2ème possibilité : création de pool de connexion -> on utilisera cette méthode ### 4 étapes pour la création de la BDD #### Créer une connexion à la base (DataSource = pool de connexion) Objet représentant le pool de connexion Le serveur web va se connecter à la BDD et va lancer un pool de connexion réquis : fichier de configuration context.xml contenant des informations sur la base : nom de la base, **Fichier : context.xml** JNDI : API permettant de récuperer le datasource et le pool de connexion -créer un objet de type Context -initialisation Context initCtx = new InitialContext(); -aller à la racine de l'annuaire Context envCtx = (Context) initCtx.lookup("java:comp/env") -descendre dans la base de données ds=(DataSource) envCtx.lookup("base_test") Obtention du datasource ou du pool de connexion -méthode principale GetConnexion() - renvoie une connexion parmi les connexions du pool #### Créer une requête (Statement) Obtenir un objet de type statement Connection BD = ... Statement stmt = BD.createStatement(); #### Exécuter une requête String s = "SELECT * FROM personne"; ResultSet r = stmt.executeQuery(s); #encapsule la table en java Requete de mise à jour ! Statement stmt = conn?createStatement() .... #### Traiter les résultats Parcourir le résultat resultSet r = stmt.executeQuery(s) while (r.next()) { #permet de replacerle curseur sur la ligne suivante ... out.println(r.getString("nom ")); out.println(r.getString("prenom")); ... } #### JSP Page web HTML/JSP contenant du code java ### Couche métier EJB Méthode effectuant les calculs lourds en utilisant l'API EJB + Composant Java distribué accessible, réutilissable et déployables + couplé à une BDD Serveur d'application = système hébergant des EJB avec un serveur Tomcat. ON UTILISERA anciennement(JBoss) maintenant (WildFly) /!\ Peut aussi faire le travail du conteneur web /!\ #### EJB local Ne peut être invoqué que depuis une classe java éxécuté dans la même machine virtuelle #### EJB remote Peut être invoqué depuis n'importe où Connexion au serveur + recherche de l'EJB dans l'espace de nommage + RMI Exemple de classe EJB session (chargé d'effectuer une tâche pour un client) ``` package hw; import javax.ejb.Remote; @remote public interface HelloRemote{ public string sayHello(); } public class Hello implements HelloRemote { @override public string sayHello(); return "Hello world"; } ``` #### EJB Session avec état C'est un EJB Session **dédié à un seul client** à son instanciation. Lors de l'appel de la méthode sur le serveur, un EJB est instancié et est dédié seu lement à ce client #### EJB Session sans état C'est un EJB Session **qui peut répondre à plusieurs clients**, il n'y a pas d'état conversationnel ### Tuto TP2 install mysqlserver install apache2 install phpmyadmin Config : login : isri mdp : tu le connais création base de données ## Cours 3 - connecter les servlets (clients) au serveur métier (serveur) Travail à partir du projet TP2 Redémarrer BDD localhost/phpmyadmin/ login : isri mdp : surement celui par défaut, après mozilla l'a enregistré mais ton cerveau non, alors tu peux prier qu'il s'en souvienne longtemps Mdr jamie le boss > Mozilla > Préférences > Vie privé > Identifiant enregistre > retrouve ton mot de passe fdp Lancer le projet sur IntelliJ et accéder au serveur JBoss : http://localhost:8080/ProjetEJB_war_exploded/ ### Création et connexion des clients Utilisation de l'API Java API RMI (Java SE only) pour le dialogue en TCP/IP Côté serveur (JVM Serveur) : * interface contenant les méthodes qui peuvent être appellées à distance * classe qui implémente cette interface (classe hello) affectation d'un nom pour la classe dans le registre des noms RMI Côté client (JVM Client) : * obtient une référence sur l'objet distant à partir de son nom * appelle la méthode distante en utilisant la référence * les paramètres et les résultats des méthodes distantes sérializable (qui peut être compréssé et être récupéré par envoi via flux de données) ### Tuto TP3 Edit : enfait le TD2 java.naming.factory.initial=org.wildfly.naming.client.WildFlyInitialContextFactory java.naming.factory.url.pkgs=org.jboss.ejb.client.naming remote.connections=default remote.connection.default.host=localhost remote.connection.default.port = 8080 ## Cours 4 - EJB Entity ou Serveur d'application WildFLy C'EST LA COUCHE METIER SUR LE QUEL S EXECUTE LES EJB Stateless/session vu en cours 3 Les EJB3 entity ne sont pas accessibles directement par le client mais uniquement par un EJB session qui lui peut-être remote et donc accessible de l’extérieur. EJB Entity est une API qui s'occupe des données ayant l'intérêt de pouvoir éviter l'écriture de code SQL lorsque l'on travaille en JAVA EJB3 Abstraction complète du stockage des données Mapping Un champ persistant *property* a besoin de deux méthodes : **getProperty** et **setProperty** Utilisation de l'Entity Manager pour toutes les opérations CRUD ( **Create Read Update Delete**) : exemple d'opération CRUD ``` import javax.persistence.EntityManager; EntityManager em; em.persist(utilisateur); //CREATE em.remove(utilisateur); //DELETE em.refresh(utilisateur); //UPDATE em.find(utilisateur); //READ em.merge(utilisateur); ``` ## Cours 5 - La fin est proche... La prof c'est rendu compte au bout de 4 sèances que c'était de la merde son cours et a repris tout depuis le début en expliquant le fonctionnement de l'architecture qu'on utilise depuis début septembre Contrôle première semaine de janvier REST * Architecture logiciel orientée ressource. * Basée sur HTTP, les URIs, les liens HTTP propose les verbes correspondant aux 4 opératuions CRUD : * Créer (create) * Afficher (read) * Mettre à jour (update) * Supprimer (delete) Exemple : GET http://nirvana.com/livres lit la liste des livres DELETE http://nirvana.com/livres/13 Supprime le 13eme POST http://nirvana/livres/ +body des données pour créer un livre PUT http://nirvana.com/livres/13 Créer le livre 13 Jersey est l'içmplémentation d'oracle pour cette spécification (JAX-RS) Exemple : Une simple classe POJO (Plain Old Java Object): Annotée @Path : ``` @Path ("/bonjour") //@path spécifie de répondre aux requêtes d'URI finissant par bonjour public class Hello { @GET //spécifie la méthode répondant à une requête GET @Produces (MediaType.TEXT_HTML) //spécifie le type de réponse public String sayHtmlHello() { return "<html><body>"+ "bonjour" + "</body> </html>" } } ``` * Besoin d'un fichier décrivant une servlet ...\WEB-INF\web.xml (arborescence classique d'un projet Maven) * La servlet-class est celle de la servlet container Jersey * La classe "servlet-mapping" permet de renvoyer vers le web, permet de faire le mappage web Lancement du projet via navigateur web Stateless : pas de gestion d'état * Le serveur ne stocke jamais l'états des applications, donc des requêtes * Simplifie le service mais augmnete le volumen de communication * L'alternative est fournie par la règle suivante HATEOAS ## Projet Java J2EE - ### Architecture Conteneur Webform - stock les servlets - objectif de répondre au clients en navigateur web en GET/POST et se connecte aux serveurs via les servlets Conteneur d'applications - récupère des infos via la base de donnée à la demande des servlets. Le client manager vont gérer les objets de type entité Connexion Webform/servlet au conteneur d'application - connexion avec RMI - objectif d'avoir la main sur la connexion à la BDD (sécurité) DONC Client -> Client Manager -> BDD archivre War , il va packager toutes les classes et va rajouter les fichiers pom.xml, web.xml,etc etc ! Toutes les classes sont contenus sont ### Sèance 1 Création de BDD user : root mdp : toto Création d'un user #mariadb -u root -p user : coconut mdp : coconut ![](https://i.imgur.com/eePM8Lt.png) Création d'une BDD base de données en UTf-8 "bibliotheque" Table Livre | Id | Titre| Auteur | Editeur | Pages | langue | Disponibilité| Date retour | | -------- | -------- | -------- |-------- | -------- |-------- | -------- | -------- | | int | varchar 64 | varchar 32 | varchar 32 | int | varchar 32| boolean | date (NULL possiblee) | Table Client | id | Nom | Prenom| Mot de passe | | -------- | -------- | -------- | ------- | | int | varchar 32 | varchar 32 | | ## Sèance de projet 7 janvier ### Travail sur le projet ASI Création d'une servlet selon le TD1 Création EJB selon TD2 avec connexion de l'EJB avec la BDD /!\ La servlet ne doit pas être directement connecté à la BDD /!\ #### Classe EJB - classe client Rajout dependency Création fichier pom.xml Full bug jusqu'a la pose Reboot du projet Création du projet bibliothequeproject src->main->java->hw-> ->ressources->Package META-INF->persistent.xml ->webapp ->WEB-INF->web.xml ->META-INF->context.xml fichier pom.xml pour servlet + fichier pom.xml pour l'ejb ("creates modules from parents" pour créer le fichier pom.xml) Création d'une servlet + mappage Création de JDBCservlet + mappage ## 10 janvier - contrôle écrit à 11h ## 21 janvier - soutenance projet bibilothèque