# 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

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