Bonjour, bonjour tout le monde. Bonjour à tous. Donc est-ce que vous m'entendez ? Oui oui monsieur. Bien. Alors donc on va reprendre le cours concernant concernant donc l'architecture J2. Donc je rappelle que nous avons déjà traité le les deux premières parties donc à savoir le principe de l'injection des dépendances et de l'inversion de contrôle. Euh la deuxième partie, ça concernait la partie accès aux base de données, notamment avec Spring Data GPA, Hiybernate. Euh on avait fait deux activités pratiques pour ces deux parties-là. Donc maintenant, on va aborder la partie la technologie web, c'est-à-dire la partie web euh les composants web G2E. Alors, la même chose comme la dernière fois. Donc je vais commencer d'abord par les concepts de base, donc pour comprendre un peu globalement l'architecture d'une application web2e. Et puis par la suite, nous allons euh voilà voir les bonnes pratiques, c'est-à-dire quels sont les framework, qui sont euh dans la pratique, c'est-à-dire les entreprises, comment ils vont développer des applications web. Et la même chose, vous allez voir que peut-être au début, on va parler de beaucoup de concepts, mais après à la fin, on va voir que finalement il y a pas beaucoup de codes à écrire pour développer euh les applications les applications web euh avec la avec Spring bien sûr, Spring MVC. Mais avant de d'utiliser les framework, donc nous allons voir d'abord les concepts de base. Alors, tout d'abord donc je rappelle que dans une application généralement il y a il y a trois couches souvent. Il y a la couche la couche métier. Euh donc c'est la couche dans laquelle on va implémenter les les traitements, les spécifications fonctionnelles. Euh il y a la couche d'AO. Donc c'est la partie dans laquelle on va souvent utiliser un framework qui permet de de faire souvent le mapping objet relationnel. Bon si là on a déjà utilisé donc Spring Data GPA Hbernate. Et puis donc il y a la la couche web. Alors, ce qui nous intéresse aujourd'hui donc c'est cette couche là, c'est-à-dire comment développer euh, on va dire le la partie user interface web pour une application web2e. D'abord, il faut savoir une chose que dans les applications web, il y a deux modèles. Il y a deux types de modèles qu'on peut développer. Il y a deux façons pour développer les applications web. Il y a ce qu'on appelle euh le rendu HTML côté serveur, donc le rendu HTML côté serveur et le rendu HTML côté client. Alors, c'est déjà important de faire la différence parce que dans le rendu HTML côté serveur, qu'est-ce qui se passe ? Ben ce qui ce qui se passe c'est que le le client envoie une requête HTTP vers le serveur, ben le serveur va faire des traitements, il va vers la base de données, il récupère des résultats et puis ces résultats-là, il va les envoyer au client mais au format HTML. C'est-à-dire, dans ce cas-là, le client envoie la requête et à la fin, qu'est-ce qu'il reçoit ? HTML. Dans ce cas-là, le HTML, il est généré par le serveur. C'est le serveur qui génère euh le HTML. Alors, dans ce cas-là, on parle de ce qu'on appelle le rendu HTML côté serveur. Alors, quand vous faites le rendu, quand on fait le rendu HTML côté serveur, alors côté client, côté navigateur, on n' pas besoin d'utiliser un framework JavaScript. C'est-à-dire, on a'ura pas besoin d'utiliser des framework comme Angular ou bien React, peu importe. C'est que pourquoi ? parce que finalement le HTML, c'est le serveur qui le génère. Donc tout se fait côté serveur. Le navigateur, il ne fait que afficher la page. Quand on clique, on envoie la requête, le serveur fait les traitements, il récupère les résultats et après il va il va envoyer le résultat au format HTML. C'est-à-dire c'est le serveur qui forme qui qui qui génère euh en fait le HTML et qui va le présenter au client. Alors ça c'est le modèle classique que qui existait depuis très longtemps mais après les choses se sont développées et il y a un autre une autre façon de faire le c'est le ce qu'on appelle le rendu HTML côté client. Alors comment ça se passe pour le rendu HTML côté client ? Bah vous avez le client envoie la requête http vers le serveur, bah le serveur va faire des traitements, il va vers la base de données, il récupère des résultats et puis cette fois-ci ces résultats là, il va les envoyer au client euh suevant au format Jason. Ce n'est pas du HTML, c'est des données au format Jason. C'est-à-dire que le navigateur, le le le client, il va recevoir les données au format Jon. Et après, c'est côté c'est côté le euh c'est côté client qu'on va prendre ces données de Jason et on va les les formater en HTML, c'est-à-dire on va prendre ces données de Jason là et on va les afficher au format HTML. Et cette opération de génération du HTML se fait côté client et non pas côté serveur. C'est-à-dire c'est le c'est le client qui va prendre les données de Jon et après il va générer ce rendu HTML. Donc c'est pour cela qu'on l'appelle le rendu HTML côté client. Alors si vous voulez faire le rendu HTML côté client, bah vous aurez besoin d'utiliser un framework JavaScript. Bon, si là on aura besoin d'utiliser des des framework comme Angular ou bien React ou Vgs, c'est des framework JavaScript qui sont fait pour euh créer la partie user interface. Donc vous voyez donc il y a deux façons de faire. Donc quand on a une application web, quand on a une application web, et bien il faudrait se poser cette question là, même en tant que utilisateur. Après, vous allez voir, c'est plus simple, n'importe quel site, n'importe quelle application, vous pouvez voir, vous pouvez savoir est-ce qu'il s'agit d'un rendu HTML côté serveur ou bien un rendu HTML côté client. C'est de deux architectures qui fonctionnent différemment. Alors, dans notre cas, nous allons d'abord étudier ce modèle parce que c'est le modèle de base. Euh donc, on va voir comment faire du rendu HTML côté serveur et par la suite, nous allons voir comment euh faire ce ce rendu HTML côté client en étudiant un framework comme Angular. Et après, on va voir avec Angular comment on peut euh voilà créer ce genre de modèle. Ça peut être aussi React, ça peut être les deux. Euh mais généralement dans un premier temps, vous aurez besoin de maîtriser un framework backend les Spring et un framework front end qui est Angular. Donc euh ici donc euh c'est-à-dire quand vous faites de rendu HTML côté client, il vous faut utiliser un framework backend et un framework frontend. Alors si vous travaillez bien sûr avec un rendu HTML client, bon vous pouvez également créer une application mobile de la même manière, c'est-à-dire l'application mobile elle-même, qu'est-ce qu'il fait ? il fait il envoie des roquettes HTTP, il récupère des des données Jon et après c'est la partie cliente mobile qui va prendre ses données de Jon et de les afficher dans le format. Au format, ça dépend. Est-ce que par exemple si vous est-ce que vous travaillez avec Android ou bien avec iOS ou est-ce que c'est flatter ? Donc chaque framework mobile a sa propre manière d'afficher les composants. Mais ça c'est cette partie là sur le développement mobile. Vous aurez vous allez faire encore un cours concernant le développement mobile et vous aurez l'occasion donc de de voir comment profiter de aussi de ça. Voilà. Alors donc avant de avant de d'aborder cela, nous nous allons d'abord regarder quels sont les concepts de base les composants web d'une architecture J2. Alors, si vous voulez développer une application web J2E, vous disposez de deux types de composants. Il y a ce qu'on appelle servelet et JSP. Alors, c'est quoi une servelette ? Une servelette, c'est une classe Java qui permet d'effectuer des traitements côté serveur. C'est-à-dire quoi ? C'est une classe Java qui va recevoir les requêtes HTTP. Ça veut dire que toutes les requêtes HTTP généralement envoyées par le client, toutes les requêtes, ils vont être reçues par cette servelette. Et c'est quoi le rôle de cette servelette ? qui va tout simplement d'abord déclencher les traitements, c'est-à-dire une fois qu'il reçoit la requête, il va d'abord effectuer les traitement. Et pour effectuer les traitements, généralement on fait appel à la couche métier. Celui-là on fait les traitements. La couche métier, il va souvent vers la base de données. Il récupère des données et après il va on va il va lui rendre des résultats. C'est-à-dire le la servelette et pour chaque requête, il va déclencher des traitements, il récupère des résultats et ensuite ce résultat là, on a besoin de l'envoyer au format HTML. Donc on va par exemple une liste de produits, on va essayer de de prendre cette liste là, on fait des boucles et après on génère un tableau HTML et ce tableau HTML va être envoyé vers le client. Ben le client ne va rien faire comme il reçoit que du HTML, il l'affiche directement comme ça. Mais maintenant pour générer HTML, pour générer ce HTML là, si vous voulez le faire avec une servelette, ce n'est pas pratique. Pourquoi ? Parce que une servelette, c'est une classe Java. Et dans une classe Java, ce n'est pas pratique de générer du code HTML. Si vous voulez générer du HTML dans une classe Java, vous allez voir tout à l'heure, il faut écrire beaucoup de codes, c'est pas pratique. Donc comme ce n'est pas pratique de générer du HTML avec une classe Java, c'estàdire avec une servelette, et ben tout simplement on va faire appel à un autre type de de composant. C'est ce qu'on appelle les pages JSP. Alors JSP ça veut dire Java server page. Alors en fait alors Java c'est P JP c'est à peu près comme PHP. En fait une page JSP euh c'est ça ressemble plus à une page HTML et donc avec une JSP c'est plus facile de générer du HTML. Et dans ce cas-là, qu'est-ce qu'il va faire la servelette ? Une fois qu'il va récupérer les résultats, il va stocker ses résultats. Il va stocker ses résultats dans un objet qui s'appelle le modèle. Temporairement, il va stocker les résultats dans le modèle. Une fois qu'il va stocker ses résultats dans le modèle, ben il fait appel. Dans la 4e étape, il fait appel à une page JSP. Et après c'est la page JSP. Et après, c'est la page JSP qui va chercher ses résultats dans le modèle et puis il va générer le HTML et ce HTML là et ce HTML va être envoyé vers le vers le client. Donc c'est-à-dire que la servlette, il fait les traitements, il récupère les résultats. Mais avant d'envoyer la réponse, bah qu'est-ce qu'il fait ? La servite fait appel à une page JSP qui est plus adaptée à la génération du code HTML. C'est la page JSP qui va récupérer ses résultats et puis il va générer du HTML et puis ce HTML là va être envoyé vers le client. Alors comm vous voyez donc la servelette dispose de deux objets principaux. Les on a l'objet request et l'objet respance. Alors l'objet request c'est l'objet qu'on va utiliser, c'est pour lire les données de la requête. Ça veut dire que toutes les données envoyées par l'utilisateur dans une requête HTTP, bah on peut les récupérer à partir de l'objet request. Et l'objet respin, c'est l'objet qui va qu'on va utiliser pour envoyer la la réponse. Donc les objets principaux de d'une servelette request respe. Donc on va y revenir en détail. Alors quand on travaille de cette façon-là, c'est que nous sommes en train de respecter un design pattern qui est très connu. C'est ce qu'on appelle le pattern MVC. M V C donc c'est un design pattern. Alors MVC ça veut dire modèle view contrôle modèle V c'est view et C c'est contrôle. Alors je vais vous rappeler d'abord comment fonctionne ce pattern MVC. C'est très simple. C'est quoi une vue V ? Bon, une vue c'est tout simplement c'est c'est l'écran qui s'affiche à l'utilisateur, c'est-à-dire tout ce qui s'affiche dans un écran de votre pass de votre machine d' d'un écran mobile ou bien du d'une tablette, tout ce qu'on voit à l'écran, c'est ce qu'on appelle une vue. Ça veut dire que l'utilisateur de l'application, lui tout ce qu'il voit, c'est la vue. Donc tout ce qui s'affiche, dès qu'on affiche quelque chose, c'est ce qu'on appelle une vue. Alors, l'utilisateur généralement, il va saisir les données dans la vue et puis il va cliquer sur des boutons. Quand on clique sur un bouton, nous avons besoin de faire un traitement. Et pour faire un traitement, qu'est-ce qu'il fait la vue ? Ben, la vue fait appel à un autre composant qui s'appelle le contrôleur C. Donc à chaque fois que je clique sur un bouton dans la vue, à chaque fois que je clique quelque part sur le la partie user interface, j'appelle un composant spécial qui s'appelle le contrôleur. Ben le contrôleur, qu'est-ce qu'il va faire ? il va faire les traitements. Pour faire les traitements, généralement, le contrôleur fait appel se vent à la couche métier. Vous savez la couche métier, c'est ce qu'on appelle parfois la couche service. La couche métier, c'est pour faire les traitements. Alors la couche métier elle-même fait appel à la couche deso. Vous savez la couche Do c'est c'est la couche qui va qui va ler votre application à la base à la base de données. C'est-à-dire ici donc dès qu'il y a un événement qui se produit, on appelle le contrôleur. Le contrôleur va faire appel au traitement. Euh la couche m va faire les traitements, on va vers la base donné, on va récupérer des résultats. Donc à la fin, on va récupérer des résultats R. Et puis le contrôleur quand il récupère ces résultats là, il va les stocker dans un objet qui s'appelle le modèle, le M. Vois donc le le modèle euh ben tout simplement le contrôleur dans la troisème étape, il va stocker les résultats dans le modèle. Une fois qu'il va stocker les résultats dans le modèle, ben le contrôleur va informer la vue, va faire appel à la vue. Donc quand le contrôleur fait appel à la vue, c'est ce qu'on appelle une notification. Il va informer, il va notifier la vue comme quoi les données sont prêtes. C'estàd il va lui dire "Ça y est, j'ai terminé mon travail." Donc le contrôleur terminé son travail. Qu'est-ce qu'il va faire la vue ? automatiquement, il va vers le modèle, il récupère les résultats et après ces résultats vont être affichés et on reprend. Je clique sur un bouton, on fait appel au contrôleur. Le contrôleur fait les traitements, on récupère les résultats. Le contrôleur stocke les résultats dans le modèle. Et après le contrôleur euh fait appel à la vue. La vue va récupérer les données du modèle et il va les afficher. Bon, ça veut dire tout simplement quoi ? Ça veut dire que tout ce qui s'affiche dans une vue, tout ce qui s'affiche dans la vue, toutes les données que vous affichez dans une vue, c'est des données qui sont stockées dans un objet qui s'appelle le modèle. Mais tout ce qu'on affiche d'une vue, c'est des données qui se trouvent dans le modèle. Et quand je clique sur un bouton, par exemple, j'appelle le contrôleur, le contrôleur fait les traitements, il récupère les résultats, les prépare dans le modèle et après on reboucle, on appelle la vue. Donc c'est c'est ça MVC. Il faut juste rappeler que MVC c'est un design pattern qui concerne la couche présentation. La couche donc c'est MVC ça couche ça concerne la partie user interface, c'estàd UI. C'est-à-dire que MVC, on peut le on peut l'utiliser pour une application web que pour une application mobile ou bien une application desktop. Tout ce qui est user interface, c'est le design pattern, il est très très courant. Donc ça c'est juste pour vous rappeler ce que c'est le pattern MVC. Alors maintenant, si vous voulez développer une application web J2E pour créer le contrôleur, pour créer le contrôleur de l'application, on va utiliser une servelette. Donc vous voyez donc une servelette va jouer le rôle du contrôleur. C'est c'est quoi le rôle de la servelette ? Voyez donc à chaque fois qu'il y a une requête qui arrive, on fait appel à la servelette. La la servelette qui joue le rôle du contrôleur, qu'est-ce qu'il fait ? il va utiliser l'objet request pour lire les données saisies par l'utilisateur. Ensuite, il va déclencher les traitements, il récupère les résultats. Une fois qu'il récupère les résultats, ben il va stocker ses résultats dans le modèle et puis il va faire appel à la vue. Et pour créer une vue, cette fois-ci, on va utiliser une page JSP. Et la JSP qui va jouer le rôle de la vue va récupérer les résultats à partir du modèle. Et puis il va générer un rendu HTML qui va être envoyé vers le client en utilisant l'objet response et ainsi de suite. J'ai la vue. Je clique sur un bouton, j'appelle le contrôleur. Le contrôleur fait les traitements. On récupère les résultats. On stocke les résultats dans le modèle. On fait appel à la vue. La vue va vers le modèle. Il récupère des résultats et il génère un un affichage, un rendu HTML. qui va s'afficher côté navigateur et c'est comme ça que ça se passe. Donc vous voyez donc ça c'est le le l'architecture de base de de Spring MVC. Alors maintenant, je vais vous montrer d'abord c'est quoi une servelette, c'est quoi une JSP, comment créer une servelette, comment créer une JSP, c'est quoi la différence entre servelette et JSP, comment déployer une servelette et à la fin je vais vous montrer comment finalement utiliser un framework Spring MVC parce que c'est Spring MVC qui va m'aider à à faire ça. Donc après par la suite si je je vais pas développer à nouveau tout ça moi-même, mais il y a des framework qui permettent de faciliter bien sûr la la maison la mise en œuvre de ce genre de d'architecture. Voilà. Alors donc c'est c'est donc je vais passer à l'étape suivante. Alors maintenant c'est quoi en fait ? C'est quoi une servelette ? Alors une servelette c'est une classe Java. Une servelette. Voyez une servelette c'est une classe Java. dans laquelle on va définir des méthodes comme la méthode de get et de poste. Alors, c'est quoi la méthode de get ? La méthode de get méthode qui s'exécute quand une requête HTTP quand une requête HTTP est envoyée avec get. C'est-à-dire quand il y a une requête HTTP envoyée par l'utilisateur avec la méthode get, ben qu'est-ce qui va se passer ? Et ben ce qui va se passer si la méthode de get va s'exécuter. Donc la méthode de get méthode qui s'exécute quand une requête HTTP est envoyé avec get. La méthode de poste. La méthode de poste, c'est la méthode qui va s'exécuter quand une requête HTTP est envoyée avec la méthode poste. Alors, comme vous le savez, dans le protocole HTTP, il n'y a pas que get post et en fait d'autres méthodes comme put, delete et les autres. C'est pour cela vous pouvez également ajouter des méthodes comme de put, de delay, de head et cetera. Alors quand vous voyez que toutes les requêtes HTTP, c'est quelqu'un qui a demandé le alors comme vous voyez donc toutes les toutes les méthodes de get et de post reçoivent deux paramètres. Oh là là. Alors toutes les méthodes reçoivent deux paramètres request et respense. Alors voyz donc avec request, c'est quoi le rôle de l'objet request ? C'est pour lire les données de la requête, c'est-à-dire toutes les données saisies par l'utilisateur dans le formulaire. Par exemple, dès que vous vous validez l'opération, vous envoyez une requête http. Alors toutes les données envoyées dans la requête HTTP, on peut les récupérer en utilisant l'objet request. Et le respin, c'est l'objet qu'on va utiliser pour envoyer la la réponse. Si vous voulez créer une servelette, qu'est-ce qu'il faut faire ? Ben, il vous faut créer une classe Java qui hérite extend d'une classe spéciale qui s'appelle HTTP Servelet. C'est-à-dire tout simplement par exemple si vous voulez créer une servlette, vous créez une classe Java. Par exemple, ici contrôleur la classe s'appelle contrôleur servelet. extendite de la classe HTTP Servelet et puis on va redéfinir la méthode de get de poste. Vous voyez donc de get c'est la méthode qui s'écrée toujours comme ça. C'est une méthode qui va effectuer un traitement quand une requête HTTP est envoyée avec get. Et la méthode de poste, c'est la méthode qui va s'exécuter quand une requête HTTP est envoyée avec la méthode post. Et comme vous voyez que les deux méthodes de get et de post reçoivent deux paramètres request et respace, ben request c'est l'objet que j'utilise pour récupérer les données de la requête et respob que je peux utiliser pour envoyer la la réponse. Alors, en plus de de dou et de poste, on peut ajouter d'autres méthodes qui font partie du cycle de vie d'une servelette comme la méthode init et la méthode destroy. La méthode init, c'est la méthode qui permet de faire l'initialisation. C'est-à-dire quoi l'initialisation ? C'est-à-dire si vous voulez faire un traitement au démarrage de l'application, quand l'application démarre, la première méthode qui s'exécute, c'est la méthode init. Donc la méthode init, c'est pour initialiser des choses au démarrage de l'application. Bon, généralement, il va servir à ça. Et puis il y a destroy, c'est la méthode qui s'exécute au moment de l'arrêt de l'application. C'est-à-dire quand vous décidez d'arrêter l'application, quand vous allez arrêter l'application et bien tout simplement la méthode destroy s'exécute. Bon, si vous voulez comprendre à quoi sert ces ces méthodesl si vous voulez comprendre le cycle de vie d'une servelette, regardez ce slide. Alors, dans ce slide, on va définir ce qu'on appelle le cycle de vie d'une servelette. Ça c'est important. Alors, regardez bien quand je démarre Tomc 4. Alors, pour nous donc je rappelle juste que Tomc 4 c'est le serveur, c'est notre serveur web. C'est lui qui va jouer le le rôle du serveur web dans l'application. Et bien Tom 4 quand vous le démarrez, quand vous démarrez Tom 4, qu'est-ce qu'il fait Tom 4 ? Alors, quand il démarre, la première des choses qu'il fait, c'est qu'il va chercher à lire un fichier qui s'appelle web.xML. Ça veut dire quoi ? dans une application web j2 quelque part, il y a toujours un fichier qui s'appelle web. XML. À quoi sert ce fichier web XML ? C'est pour déclarer les servelettes. C'est-à-dire si vous avez développé une servelette, on vient de voir que pour développer une servelette, qu'est-ce qu'il faut faire ? Il faut créer une classe Java qui hérite de la classe HTTP Servelet. Mais si vous voulez que le serveur Tomc 4 sache qu'il y a une servelet dans votre projet, ben il faut la déclarer dans le fichier web. XML. Donc si vous voulez qu'une servelette euh si vous voulez que Tomc 4 sache qu'il y a une servlette dans votre projet, il faut la déclarer dans ce fichier web. XML. Et quand on déclare une servelette dans le fichier web. XML, ben on dit que on a déployé déployé la servelette. Alors, voyez donc dans J2, nous allons commencer à parler de choses de termes développer et déployer. Ça veut dire quoi développer une servelette ? Développer une servelette, c'est créer une classe Java qui de la classe HTTP servelet. Ça c'est développer. Ça veut dire quoi ? Déployer une servelette. déployer une serv, c'est tout simplement la déclaré dans le fichier web. XML. Alors maintenant, si une serve est déclarée dans le fichier web XML, qu'est-ce qu'il fait ? Tom 4 au démarrage, il va l'instancier. Donc c'estàd au démarrage de l'application. Dès que Tom 4 démars, il trouve une servite dans Web XML, il va l'instancier. Une fois qu'il va l'instancier, il fait appel à la méthode init. Vous voyez que la méthode init, c'est la méthode qui s'exécute juste après instanciation. C'est-à-dire la première méthode qui s'exécute dans une servet, c'est la méthode inite. Bon, à quoi sert la méthode init ? C'est pour faire l'initialisation. Donc si vous avez un traitement dans la méthode inite, il va s'exécuter au démarrage et une fois que la servelette est chargée en mémoire, il est initialisé, il est chargé en mémoire. Qu'est-ce qu'il attend ? Une servelette, une fois qu'il est chargé en mémoire, une fois qu'il est instancé, qu'est-ce qu'il attend d'après vous ? Des requettes. Requête. Des requettes. Voilà, il il attend les roquettes HTTP. C'est-à-dire s'il n'y a aucune requette HTTP, bon une servlette ne sert à rien. À quoi sert une servelette ? À chaque fois qu'un client envoie une roquette HTTP, par exemple ici avec la méthode get, bah c'est Tomc 4 qui reçoit les roquettes HTTP parce que c'est lui c'est lui qui joue le rôle de serveur web. Bah qu'est-ce qu'il fait Tomc 4 quand il reçoit une requête HTTP avec GET ? Bah il fait appel à la méthode do get de la servelette. Bah en réalité Tom 4 qu'est-ce qu'il fait ? Il appelle d'abord une méthode service que nous avons hérité de la classe HTTP Servelet. Cette méthode service, qu'est-ce qu'il fait ? La méthode service, il va juste regarder la la méthode. Si c'est get, il fait appel à la méthode de get. Si c'est poste, il appelle de de poste. Donc c'est-à-dire si une requête HTTP est envoyée avec get, la servelet va exécuter la méthode do get. Et vous voyez donc dans do get, qu'est-ce que vous avez ? Euh vous allez à vous avez deux objets request et respect. moi les deux objets les plus importants dans une dans une application web parce que avec request je peux lire les données saisées par l'utilisateur de la requête http et avec crispin, je peux envoyer la réponse http, c'est-à-dire tout ce qui est la sécurité web, tout ce qui concerne la communication avec le client, généralement ça va tourner autour de ces deux objets request et respense. Donc c'est pour cela que après dans l'application web, on va toujours voir quel que soit le framework que vous utilisez, il y a toujours ce ce principe le request response. Alors si une requête http donc bien sûr donc avec je peux lire les données avec response HTTP et si une requête HTTP est envoyée avec poste qu'est-ce qu'il fait le serveur ? Elle appelle la méthode de poste de guête de poste de guettes de poste. Alors voyez ici une servette elle est instancée combien de fois ? Une servelette est instancé combien de fois dans une application ? Une seule fois. C'est-à-dire c'est une seule instance qui est créée. Euh la méthode en IT, il est exécutée combien de fois ? une seule fois une seule fois mais les méthodes de get de poste ils vont s'exécuter à chaque fois qu'il y a une requête http dog get de poste dog get de poste et après à la fin si vous décidez d'arrêter l'application si vous décidez d'arrêter l'application qu'est-ce qui se passe Tomc 4 fait appel à la méthode destroy donc la méthode destroy vous voyez donc c'est une méthode dans laquelle qui va s'exécuter au moment de l'arrêt de l'application et T quand il app ilappelle destroy B tout simplement il détruit la servelette c'est-à-dire avant que la servelette soit détruite et ben tout simplement la méthode destroy s'exécute. Alors ce que vous êtes en train de voir là c'est ce qu'on appelle le cycle de vie d'une servelette. Le cycle de vie d'une servelette qu'est-ce qui gère le cycle de vie d'une servelette ? C'est Tom 4. Ça veut dire quoi ces tome 4 qui gère le cycle de vie d'une servelette ? Ça veut dire qu'est-ce qui est qu'est-ce qui est qu'est-ce qui va instancier la servelette ? Qu'est-ce qui instancé la servelette ? C'est Tom 4. Qu'est-ce qui fait appel à la méthode init ? C'est tome 4. Qu'est-ce qui appelle la méthode de get ? C'est Tome 4. Qu'est-ce qui appelle la méthode de poste ? C'est Tome 4. C'est-à-dire qu'est-ce qui appelle le les méthodes de la servle ? C'est c'est Tom 4. Qu'est-ce qui appelle la méthode destroy ? Tom 4, c'est-à-dire c'est Tom 4 qui décide quand est-ce qu'il va instancier, quand est-ce qu'il appelle telle méthode, quand est-ce qu'il appelle telle méthode. C'est pour cela qu'on dit que Tom 4 gère le c'est lui qui qui gère le cycle de vie de servelet. C'est la raison pour laquelle on lui on l'appelle un moteur de servelette. Moteur de servelette. Tome 4, c'est un moteur de servelette, c'est-à-dire euh servelet en anglais servelet engine, on l'appelle également conteneur de servelette. Conteneur de servelette. C'est-à-dire servelet container container et on l'appelle également web container containur web. Alors tous ces nomsl moteur de servelet, conteneur de servelet contur, c'est c'est en fait c'est c'est le c'est des noms qu'on utilise pour Tomc 4. Dans la majorité des cas, on va tout simplement l'appeler un web container, c'est-à-dire c'est Tom 4 qui gère le c'est le contenu de de la couche web. C'est lui qui gère la la couche web si vous voulez. Est-ce que c'est clair pour le cycle de vie de la servelette ? Oui. OK. Alors maintenant, nous allons voir comment déployer une servelette. Donc je viens de le dire tout à l'heure, c'est que si vous voulez déployer une servelette, il faut la déclarer dans le fichier web. XML. Alors, qu'est-ce qu'on va déclarer dans web XML ? Al ben dans le fichier web XML, vous allez déclarer un élément servelet dans lequel vous avez deux éléments, servelet name et servelet class. Alors, dans servelet name, vous mettez le nom de votre servelette et dans servelet classe, vous mettez la la classe de la servelette. Par exemple, ici, c'est conttainur servelet du package web. Voyez, donc la classe s'appelle conteneur servelet. Il se trouve dans le package web. Et ben Tom 4 quand il démarre, il va lire le fichier web XML et quand il vous savez ça c'est Tom 4. Tom 4 c'est un serveur web Tom 4. Quand il démarre Tom 4 au démarrage, il va lire le fichier web XML. Web XML. Et quand il va le lire, dès qu'il trouve une servelette, qu'est-ce qu'il va il va qu'est-ce qu'il va faire ? Il va l'instancier. Par exemple, ici, notre classe contrôleur servelet va être instancié, il va la placer en mémoire et quand il va l'instancier, il va faire appel à la méthode init, c'est-à-dire il va l'initialiser, n'est-ce pas ? Donc il l'instant, il appelle la méthode init. Et quand il va l'instancier, il va lui donner un nom et le nom qu'on va lui attribuer ici, c'est CS. Bon, ça veut dire que Tom 4, lui, il dispose d'une liste euh par exemple un un de type map servelet dans lequel c'est un objet de type map dans lequel vous avez K value et ben tout simplement K pour notre cas c'est CS. CS S et la valeur c'est quoi ? C'est c'est cette servelette. Donc cette servette, il va l'instancer, il va la placer quelque part, il va lui donner le nom CS. Alors maintenant, qu'est-ce qui reste ? Ben ce qui reste, c'est que comment faire appel à cette servelette ? C'est-à-dire quelles sont les IURL que je peux utiliser dans le navigateur pour faire appel à la servelette. C'est-à-dire un utilisateur quand il envoie une requête http vers Tom 4, qu'est-ce qu'il doit taper sur le l'adresse http de point/localhost et cetera/ash quelque chose. Qu'est-ce que je dois taper dans le navigateur pour faire appel à une servelette ? Et bien c'est pour cela on va utiliser ça. Servelet mapping. Alors dans servelet mapping, il y a deux éléments. Il y a servelet name. Ouais. Donc ser let name, c'est le même nom ici et URL pattern. Alors dans URL pattern, vous mettez ce que vous voulez. Alors si vous mettez par exemple étoile point, étoile point d' ça veut dire quoi ? Ça veut dire que toutes les urelles qui se terminent par point d' si vous tapez par exemple chercher point d' ou bien vous mettez à jeter point d' vous mettez le navigateur n'importe quoi point point d' alors toutes les urel qui se terminent par point d' dou regardez Tom 4 qu'est-ce qu'il va faire dès qu'elle reçoit quelque chose point dou 4 qu'est-ce qu'il fait il va l'envoyer vers quoi vers CS c'est quoi CS c'est contrôleur servelette. Donc dès qu'on tape quelque chose point de baton 4 il appelle la méthode de get ou bien de poste de la servelette. Donc c'est comme ça qu'on peut faire appel à une servelette à travers une requête http c'est que avec une requête http je peux faire appel parce que dans les applications web chaque roquet http que vous vous envoyez vers le serveur vous l'envoyez vers une servelette. Alors maintenant, vous n'êtes pas obligé de mettre étoile. 2. Vous pouvez mettre par exemple slashétoile. Alors, si vous mettez slash étoile, ça veut dire quoi ici ? Si vous mettez slash étoile, ça veut dire quoi ? Ça veut dire que toutes les requêtes quelque vous écrivez, vous mettez juste l'adresse/ash n'importe quoi, et ben la requête va être envoyée vers CS. Et c'est ça le rôle d'un contrôleur parce que nous avons dit que un contrôleur qu'est-ce qu'il fait ? Alors toutes les requêtes http vont passer vers le le contrôleur. Donc si vous voulez que toutes les requêtes passent via le même contrôleur de l'application, et ben vous mettez ici slash étoile. Et dans ce cas-là, vous mettez chercher point 2, vous mettez chercher point HTML ou n'importe quoi. L'essentiel, c'est que tout ce que je demande au serveur, il va d'abord passer via le contrôleur et après c'est le contrôleur qui décide quel est le traitement qu'il va faire suite en fonction de l'url que vous allez utiliser. C'est clair ? Parfait. Alors maintenant, je viens de vous dire que quand vous quand vous déclarez une servelette dans le fichier web XML, on dit que nous avons déployé la servelette. Déployer la servelette. Alors pour déployer la servlette, vous pouvez utiliser le fichier web XML mais il y a une autre solution. Laquelle ? Au lieu d'utiliser web plutôt le fichier web XML, au lieu de l'utiliser, ben il suffit d'utiliser l'annotation web servelet. Et l'annotation web servelet, pour l'utiliser, donc vous créez une servelette. Par exemple ici contrôleur servelet extend http servelet et après on va utiliser la notation web servelet name vous donnez un nom et dans URL pattern vous mettez ce que vous voulez par exemple/lo étoile. Ça veut dire quoi ? Ça veut dire que pour faire appel à cette servelette via une roquette http, il suffit d'utiliser une requête avec le pat soit slash ou bien vous tapez n'importe quoi point d'eau. Donc si je vous pose la question comment déployer une servelette, comment déployer une servelette ? Comment vous allez répondre ? Comment déployer une servelette ? On a de on a deux méthodes. Oui. La première méthode c'est que d'abord on va développer la servette et après on va la déclarer dans le fichier web.xml. Oui. Ou si on le souhaite, on va utiliser la notation web servet. Voilà. Tout à fait. Tout à fait. Très bien. Alors c'est ça. Donc quand on dit déployer une cellute, vous avez deux solutions. Soit la déclarer dans le fichier web XML, ça soit tout simplement utiliser l'annotation web servelet. Alors si vous utilisez l'annotation web servelet, vous n'avez même pas besoin du fichier web XML. Donc vous avez deux façons de faire. Alors si vous voulez donc en résumé, qu'est-ce que je on vient de dire ? On vient de dire que pour développer une servelette, il faut créer une classe Java. une classe Java qui hérite de la classe HTTP Servelet. Et pour déployer une servelette, vous avez deux solutions. Soit la déclarer dans web XML ou bien vous utilisez l'annotation web servelet. Alors vous voyez ici par exemple un exemple de servelette qui ne fait pas grand-chose. Bon c'est une servelette euh contrôleur servelette qui hérite de HTTP servelet dans laquelle on redéfinit la méthode dog. Alors pour faire appel à cette servelette là, je vais taper au niveau de de du navigateur http local host 2.80. Alors 84, pourquoi 8080 ? Ça c'est le port de Tom 4. Par défaut Tom 4 utilise le port 8080 mais c'est un port qu'on peut changer. Slash URL pattern ce que vous voulez. Par exemple, je mets ici slash hello et j'envoie un paramètre name égal valeur. Vous savez très bien que dans une requête http on peut mettre point d'interrogation paramètre égale valeur int paramètre égal valeur. Alors si vous envoyez cette requête là si vous appuyez sur entrer, qu'est-ce qui se passe ? Est-ce que vous êtes en train d'envoyer une requête http avec quelle méthode get vers quoi ? Vers slash hello. Ça c'est le pat. Et vous mettez name égal valeur. Alors maintenant la méthode de get va s'exécuter et dans la méthode de geto récupérer la valeur du paramètre name que vous avez ici dans l'URL. Et pour récupérer la valeur de du paramètre name, je vais utiliser l'objet request. Donc c'est ce que je vous disais tout à l'heure, c'est avec request qu'on peut récupérer toutes les données de la requête http. C'est ce que je fais ici. Requestget get parameter name, c'est-à-dire alors c'est-à-dire ici donc je vais utiliser request.get get paramètre name, c'est-à-dire je vais vers la la requête HTTP, je récupère la valeur du paramètre name et je le stock dans la variable name. Alors maintenant, ce qui ce qui ce que je veux faire, c'est que je veux envoyer une réponse euh HTML dans laquelle je vais afficher à l'utilisateur Bonjour Mohammed. Donc, mais pour envoyer ça, ça c'est du HTML. Et si vous voulez générer du HTML dans une servelette, vous allez voir, vous allez remarquer que ce n'est pas pratique. Vous voyez ? Donc pour générer du HTML dans une servelette, vous allez écrire beaucoup de codes. Out. printl je je génère HTML, head, title et cetera. Euh print body, hello name, la variable name ici/body/html. Vous allez remarquer que une servelette n'est pas pratique pour générer des codes HTML. Ça c'est pas bon. Ça vous pouvez le faire mais ça c'est pas bon. Pourquoi c'est pas bon ? Parce que si vous avez beaucoup de code d' HTML à générer en plus il y a CSSA. Vous imaginez votre code Java, ça va être c'est pas pratique. Donc au lieu de générer du code HTML dans une servelette, on peut le faire avec une JSP. Alors, je vais vous montrer maintenant c'est quoi la la différence entre servett et JSP. Regardez bien. Alors, ce que vous voyez là à gauche, c'est une servelette. Alors, c'est quoi une servelette ? On peut dire que une servelette, c'est une classe Java qui hérite de http servelette. et à l'intérieur de laquelle je peux générer des codes HTML. Alors que à droite ici vous avez ce qu'on appelle une page JSP. Et vous voyez donc une page JSP c'est quoi ? C'est l'inverse. C'est une page HTML. Vous voyez il il y a que du HTML, n'est-ce pas ? C'est une page HTML à l'intérieur de laquelle je peux écrire du code Java. Ça c'est du Java. Alors pour écrire du code Java à l'intérieur d'une page JSP, on va utiliser les directives inférieur pourcentage et pourcentage supérieur. Tout ce qui est entre ces deux directives, c'est des codes Java. Exactement quand vous le faites avec PHP. Vous savez avec PHP euh c'est c'est du HTML mais dans lequel vous écrivez des codes PHP. Sauf que dans PHP, vous utilisez quelque chose comme ça, point d'interrogation PHP. Vous écrivez du PHP, après vous mettez, n'est-ce pas ? Alors ici donc c'est c'est des directives pour JSP. Donc ça veut dire quoi ? Ça veut dire c'est quoi la différence entre servelet et JSP ? Et bien tout simplement c'est la forum. On peut dire que une une servelette c'est une classe Java, c'est une classe Java à l'intérieur de laquelle je peux générer des codes HTML. Alors que une JSP c'est l'inverse. C'est une page HTML à l'intérieur de laquelle je peux écrire des codes Java. Tout ce que vous pouvez faire avec une servelette, vous pouvez le faire avec JSP. Et tout ce que vous pouvez faire avec JSP, vous pouvez le faire avec servelet. Alors maintenant, dans la pratique, qu'est-ce qu'on va utiliser ? Servelet ou JSP ? Et bien si vous respectez le pattern MVC, vous savez dans le MVC, il y a le contrôleur et la vue, n'est-ce pas ? Si vous utilisez MVC et bien vous allez utiliser servelet pour jouer le rôle du contrôleur. Ça c'est le contrôleur. Et vous allez utiliser une JSP pour jouer le rôle de view. Donc c'est-à-dire si vous avez beaucoup de code HTML à générer, il vaudrait mieux utiliser JSP. Et si vous avez beaucoup de codes Java à écrire, bah il vaudrait mie utiliser une servelette. Autre chose qui est très importante, c'est que quand vous appelez la page JSP pour la première fois, quand vous faites appel à une page JSP la première fois, qu'est-ce qu'il fait Tom 4 ? Et ben Tom 4 quand vous appelez la page JSP la première fois, ben il convertit automatiquement la JSP en servelet. C'est-à-dire même si vous développez une une JSP pour vous, vous écrivez une JSP mais quand vous allez l'appeler avec via une requette HTTP B 4 la première fois qu'il va faire il va d'abord la convertir en servelette et après c'est la servelette qui vous répond. Donc ça veut dire finalement c'est quoi la technologie de base ? C'est servelette. Ça veut dire tout simplement une jsp c'est également c'est une servelette. La seule différence c'est quoi ? la forme une servelette c'est une classe Java à l'intérieur de laquelle je génère des codes HTML et une JSP c'est également une servelette mais se forme d'une page HTML à l'intérieur de laquelle on écrit les codes Java. Est-ce que c'est clair ? Alors maintenant euh si dans une application vous allez utiliser Servelet pour jouer le rôle du contrôleur et JSP pour jouer le rôle d'une vue, et bien comment faire la communication entre Servelet et JSP ? Alors pour faire la communication entre servelet et JSP, vous avez deux solutions, deux façons. Il y a ce qu'on appelle le forward. forward ou bien la redirection. Alors, c'est quoi la différence entre forward et redirection ? Regardez bien, ça c'est important. Alors, dans le forwarding, vous avez le client envoie la requête HTTP vers le contrôleur. Le contrôleur, c'est une servelette. La servelette va faire les traitements. Une fois qu'il termine les traitements, il a besoin de générer du HTML. Mais pour générer du HTML, il sait pas le faire. C'est pas son c'est c'est pas pratique. Qu'est-ce qu'il fait ? Il fait appel à la page JSP. Et quand il appelle la page JSP, l'opération, ça s'appelle forward. Forward, ça veut dire quoi ? Ça veut dire que la même requête qui est envoyée, il va la la forwarder vers la page JSP. Et la page JSP, qu'est-ce qu'il fait ? il va prendre les résultats générés par la servelette et puis il va générer une réponse et cette réponse là va être envoyée vers le client forward. Alors quand vous utilisez le forward, regardez bien le client, le client est-ce qu'il connaît la la jsp ? Le client il envoie la requête vers le contrôleur. Le contrôleur à la fin il va lui donner la réponse HTML. Il l'affiche. Mais ce HTML là qui qui est affiché ici, qu'est-ce qu'il a généré en réalité ? C'est il y a quelqu'un en arrière qui qui va le générer. C'est pour cela qu'on dit que GSP c'est un moteur de c'est un moteur de template. GSP, il génère que du HTML. Il vous génère un rendu, il vous le donne et après vous l'envoyez vers le client. C'est le forward. En fait, le forwarding c'est comme si par exemple moi par exemple je suis le client, je suis le client. Euh je vais poser une question Je vais poser une question à le prénom. Missal pardon. Wial. Alors elle est avec nous. avec de S. Wal il va jouer le rôle du contrôle. Je vais mettre des cheveux. C'est alors Wissal Wissal il va jouer le rôle du contrôleur. Contrôleur. Alors quand je pose la question à Wissal, Wissal il va il va commencer à faire les traitements, il va vers la base de données, il récupère des résultats. Mais quand il récupère des résultats et il ne sait pas comment les présenter. C'est-à-dire c'est pas sa spécialité présentée. Bah qu'est-ce qu'il va faire ? Et ben à côté de à côté deal, il y a Awatif. Donc Awatif, c'est aussi des cheveux avec un foulard. Donc ici donc voyz donc je pose ma question et bien qu'est-ce qu'il fait ? Et ben il va forwarder la question vers Awatif. La même question il va la forwarder vers Awatif. Awatif. Donc bien sûr Wal il va lui dire tiens je vais te donner des des des données. Ça c'est le modèle je vais te donner des modèles. Je veux que tu me les présentes là. Qu'est-ce qu'il va faire Awatif ? va me présenter ça dans en format HTML et après Wal il va me donner la réponse HTML. Donc vous voyez donc ce HTML là c'est en réalité qu'est-ce qu'il a généré ? C'est Awatif. Mais moi en tant que client est-ce que je connais Awatif ? Non je communique avec ça c'est le contrôleur. H c'est ici le forward il y a ici une seule requête. Alors la deuxième solution c'est d'utiliser la redirection. Regardez la redirection, c'est un peu différent. Donc avec la redirection, voilà ce qui va se passer. avec la redirection. Ce qui va se passer c'est ça. Je suis le client, il y a et j'ai alors je pose la question à ça c'est la question. Wal il va faire les traitements et cetera mais il peut pas me répondre. Bah s'il peut pas me répondre, qu'est-ce qu'il va me faire cette fois-ci ? Il va m'envoyer une réponse dans laquelle il va me donner le numéro de téléphone def. C'est-à-dire il me répond avec l'adresse de donc il me donne une réponse dans laquelle il me donne le numéro de téléphone et après si moi dès que je reçois cette réponse ben j'envoie la question vers la question et après va me répondre. la redirection ça veut dire m'a redirigé vers et le web les applications web c'est deux choses différentes. Alors vous voyez ici donc dans la redirection moi je pose combien de questions ? Deux la première vers Wal je reçois une réponse rapide et j'envoie une autre question vers Awatif. C'est c'est c'est clair. Alors, c'est ce qui se passe ici. Regardez donc, le client envoie la requête vers le contrôleur. Le contrôleur fait les traitements mais après il va retourner une réponse HTTP. Et cette réponse HTTP que vous voyez là, c'est une réponse HTTP qui utilise un code status é= 302. Vous savez dans une réponse HTTP dans une réponse HTTP il y a une information qui est très importante dans une réponse HTTP c'est le code status c'est le statut de la réponse. Et vous savez il y a des codes que vous devrez connaître moi les codes il y a 200 ça vous con vous savez ce que c'est 200 ça veut dire quoi ? C'est OK. C'est-à-dire si un un navigateur web reçoit une réponse HTTP, la première des choses que que regarde le navigateur, c'est-à-dire le client HTTP, la première des choses qu'il regarde dans la réponse, c'est c'est le code, le status code. S'il est égal à 200, ça veut dire c'est OK. C'est-à-dire la ressource que vous avez demandé a été trouvée. Si par exemple dans la réponse HTTP, il y a 404. Alors 404 c'est ça veut dire quoi ? C'est not. Ça veut dire quoi ? C'est not found. Not found. Tout à fait. Muhim. Dès que vous voyez une réponse quand vous tapez quelque chose sur le navigateur, vous recevez. Mais si vous regardez bien le le code l'erreur, bah si vous voyez 404, c'est tout simplement c'est que ce que vous avez demandé n'existe pas. La ressource que vous avez demandé n'existe pas. Il y a 400 401. Alors 401 ça veut dire notre authenticated, c'està-dire vous n'êtes pas authentifié. C'est-à-dire pour c'est c'est question de sécurité. Vous voulez accéder à quelque chose dont vous n'avez pas le droit. Donc il faut d'abord saisir votre user et votre mot de passe. Il faut s'authentifier et c'est à ce moment-là que vous pouvez accéder cette ressource. Et puis il y a 403. 403 c'est not authorized. Alors not autorized ça veut dire vous n'êtes pas autorisé. Ça veut dire que vous êtes authentifié mais vous avez avec votre rôle, vous n'avez pas le droit d'accéder à cette ressource. Moi, c'est parce que même si vous êtes authentifié, vous n'avez pas le droit d'accéder à tout ce qu'il y a dans le serveur. Donc vous êtes authentifié si vous êtes étudiant ou bien admin ou bien un simple user. Vous avez les droits sur un certain nombre de choses. Alors, il y a un autre code d'erreur. Tout ça, c'est des codes d'erreur. Erreur, erreur, erreur. Il y a 500. Alors 500 ça veut dire erreur interne. Internal error. Alors ça veut dire quoi erreur interne ? C'est-à-dire que vous avez envoyé la requette HTTP, le serveur est en train de faire un traitement et après il veut par exemple se connecter à la base de données ou il veut faire un traitement mais il a rencontré une exception. Et quand il rencontre une exception, si cette exception n'est pas traitée côté serveur, et ben cette exception là, ça va générer l'exception. Bah cette exception arrive vers Tom 4 et Tom 4 quand il reçoit une exception, il répond une réponse HTTP avec le code d'erreur, c'est 500. Ça veut dire il y a quelque chose généralement si vous recevez le navigateur 500, ça veut dire il faut aller vers le la console de votre serveur et vous allez lire l'exception et vous allez trouver c'est quoi l'origine de l'exception. Et puis il y a 300 302. Alors 302 ma chéri 300 300 301 302 tout ce qui est 300 c'est des redirections. Vous voyez ? Donc tout ce qui est 200 c'est OK. Tout ce qui est 200 201 202 c'est c'est OK. Tout ce qui est 400 ça veut dire c'est des erreurs. Des erreurs, notre authenticité et cetera. Tout ce qui est 500, c'est des erreurs internes. Mais tout ce qui est 300, c'est des redirections. Alors, ça veut dire que ici, pour faire une redirection, qu'est-ce qu'il fait euh le serveur ? Il envoie une réponse HTTP avec le status code, c'est 302. Mais quand on envoie une réponse avec 302, on envoie un header dans la réponse qui s'appelle location. Location. Et dans location, on précise l'adresse par exemple ici view.gjsp. Ça veut dire quoi ? Quand le navigateur le browser quand il reçoit une réponse HTTP, si le code ÉG 302, ben automatiquement il fait quelque chose automatique. C'est pas l'utilisateur qui le fait, c'est le navigateur. Regardez, il envoie automatiquement une autre requête vers quoi ? Vers location. Et location c'est quoi ? C'est vieux point JP. Donc c'est un petit détail dans la demande tout à l'heure, je vais vous le montrer. C'est de la redirection. Voilà. Alors maintenant si vous voulez faire une redirection dans une servelette, vous pouvez utiliser respense. Redirect vers view.gjsp. C'est une redirection. Alors que si vous voulez faire un forward, on utilise request pointget request dispatcher view.gsp. forward. On fait ici un forward et que vous voyez donc dans le forward, je transmets la le même objet request et le même objet response. Alors rappelez-vous bien donc en résumé, qu'est-ce qu'on vient de dire ? Nous avons dit que pour développer, il existe deux modèles d'application web. Il y a deux façons pour développer les applications web. Il y a ce qu'on appelle le modèle rendu HTML côté serveur et le modèle rendu HTML côté client. a dit la première. La deuxième c'est que pour développer une application web J2, vous avez deux types de composants. Il y a servelet et JSP. C'est quoi une servelette ? C'est une classe Java qui permet d'effectuer des traitements côté serveur. Si vous voulez euh respecter le pattern MVC, on va utiliser servelet pour jouer le rôle des contrôleurs et JSP pour jouer le rôle des des vues. OK, servelet c'est contrôleur et JSP c'est des view. Alors pour développer une servelette, qu'est-ce qu'il faut faire ? Il faut créer une classe Java qui éite de la classe HTTP Servelet. Pour déployer une servelette, vous avez deux solutions. Soit la déclarer dans le fichier web XML, soit utiliser la notation web servelet. Maintenant, si vous utilisez Servet et JSP dans la même application, comment faire la communication entre Servelet et JSP ? Vous avez deux de deux de deux façons, soit le forward ou bien la redirection. Très bien. Alors, maintenant dans la pratique, on arrive maintenant la vie la vraie vie. La vraie vie c'est que vous êtes dans une entreprise, on vous demande de développer une application réelle. Alors dans la pratique, vous n'avez pas besoin de développer ni de servit ni de JSP. Alors pourquoi ? Parce que si vous voulez travailler avec servlet JSP, regardez le code que vous allez trouver. C'est toujours quelque chose extend http servelet. La la méthode de guit s'écrit toujours comme ça. Vous aurez toujours ce overl, vous aurez toujours c'est ce paramètre request, vous aurez toujours ça, n'est-ce pas ? Vous aurez toujours, c'est-à-dire quand vous vous développez, vous allez commencer à faire des copies collés. C'est des c'est des codes qui se répètent et je je vous ai dit que quand il y a beaucoup de codes qui se répètent et cetera, il faut se poser la question est-ce qu'il n'y a pas un framework qui permet de faire ce ce travail. Ça veut dire que dans la la la pratique, il faut utiliser un framework. Alors, parmi les framework qui sont connus, il y a Spring MVC. Donc Spring MVC, c'est un framework euh qui permet de développer de créer des applications web basées sur Spring Framework. Alors, je vais vous montrer maintenant comment travailler avec Spring MVC. Regardez, c'est très simple. Si vous travaillez avec Spring MVC, et bien tout simplement Spring MVC, il va vous donner une servelette qui est déjà faite qui s'appelle Dispather Servelette. Donc dispat servel, c'est une servelette qui est fournie par le framework. C'est pas à moi de la développer, ça c'est fait. C'est qui l' fait va jouer le rôle de ce qu'on appelle un contrôleur frontal. un contrôleur frontal, ça veut dire quoi ? Toutes les requêtes HTTP envoyé, ils vont passer via dispatcher servlet. Ça c'est pas à vous de le faire. Dès que vous créez un projet Spring Boot avec Spring MVC, et ben il y a toujours dispat servelet. À chaque fois que vous envoyez une requête HTTP vers le euh le le contrôleur, qu'est-ce qu'il fait dispatcha servelet ? Il fait appel à à une méthode qui se trouve dans une classe qui s'appelle le contrôleur. Et c'est quoi le contrôleur ? Ben, c'est une simple classe Java que vous créer dans laquelle vous mettez des méthodes. Par exemple, action 1, action 2. Alors, quand vous tapez http local/action 1, qu'est-ce qui va se passer ? Ce qui va se passer, c'est que Dispace Sal va exécuter la méthode action 1. Quand vous tapez slash action 2, dispatch servite va faire appel à la méthode action 2. Donc c'estàdire dispatch, il reçoit la requête http, il va regarder l'url en fonction de l'URL, il appelle une méthode spéciale qui se trouve dans le contrôleur. Et ben le contrôleur qu'est-ce qu'il fait ? il va vers le il fait les traitements, il va faire les traitements, il récupère les résultats et puis ces résultats là, il va les stocker dans le modèle. Maintenant, le travail du contrôleur est terminé. Vous voyez ? Donc, si vous voulez le contrôler, il fait trois choses. Je fais je récupère les données, n'est-ce pas ? Je récupère les données, je fais les traitements, je récupère les résultats et je stocke le résultat dans le modèle. Et son travail est terminé. Maintenant, qu'est-ce qu'il va retourner ? Il va retourner le nom de de la vue. Il va retourner le nom de la vue à Despachar Servelette. Et des servelet, lui, il va faire appel à la vue, n'est-ce pas ? Alors, voyez donc 7, c'est quoi ça ? faire appel, ça peut être soit un forward, soit une redirection. Alors, il y a des situations dans laquelle on va utiliser des forward. Il y a parfois des situations dans laquelle on va utiliser une redirection. Alors, ici donc on appelle la vue. La vue, qu'est-ce qu'il fait ? Il va récupérer les données à partir à les résultats à partir du modèle et puis il va générer du HTML qui va être envoyé vers le client. C'est-à-dire, on va toujours rester dans la même organisation. Ça c'est MVC MVC. Sauf que ce C là, le vrai C, le vrai C, c'est celui-là. C'est-à-dire, je vais pas le développer, c'est-à-dire, il est fourni par le framework. Et moi, je vais créer ce qu'on appelle des contrôleurs secondaires. Bon, c'est des contrôleurs, c'est-à-dire bon, c'est des simples classes dans laquelle je crée des méthodes que qui contiennent les traitements. Donc, mon travail maintenant, ça revient à quoi ? de créer un contrôleur des contrôleurs et des vues. OK. Alors maintenant pour les vue pour les vues pour les view vous pouvez travailler avec JSP mais ce n'est pas pratique. Donc JSP c'est mauvais. Pourquoi JSP c'est mauvais ? Parce que si vous travaillez avec JSP, vous avez de deux grands inconvénients. Le premier, c'est que vous allez créer des pages JSP dans laquelle vous allez mélanger des codes Java avec des codes HTML. C'est comme vous faites avec PHP, vous mélangez du à chaque fois vous voulez passer à PHP, vous ouvrez les trucs là PHP et si vous voulez encore passer à HTML HTML Java HTML Java et pour un web designer c'est pas bon. Donc pour créer des vues, ça serait bien d'avoir quelque chose qui contient que du HTML. OK, donc JSP c'est pas bon d'un côté, de l'autre côté GSP c'est une servelette. C'est-à-dire même si vous créez une page JSP, il doit être converti en en servelette. Bon, une servelette, c'est une classe Java. Et ben ça veut dire que c'est difficile de créer ce qu'on appelle un cache dans lequel on va cacher des réponses. Et donc du coup donc JSP c'est pas pratique. Alors pour ne pas utiliser JSP, on va utiliser ce qu'on appelle des templates engine, c'est-à-dire les les moteurs de template. Alors, parmi les moteurs de template qu'on peut utiliser dans les applications Spring MVC, vous avez par exemple Teamlift. Alors, Teamlift, c'est un moteur de template qui permet de faciliter la génération du code HTML, côté serveur. Alors, Teamlift n'est pas le seul. Il y a également j'ai Java Engine. Bon, ça c'est un moteur de template, c'est également qui génère du HTML. Il y a Freemaker, Groovy, il y a il y a plusieurs moteurs de template qu'on peut utiliser. Euh et donc pour les gens qui ont travaillé avec DNET, alors dans DNE, il y a un moteur de template qui est utilisé, c'est s'appelle ça c'est pour net que vous utilisez qui s'appelle Resort. Resort c'est un moteur de template qui vous permet de créer des vues euh CS HTML, c'est-à-dire dans lequel on mélange C#ARP et du HTML. Pour les gens qui ont travaillé avec par exemple Symphony, il y a un moteur de template qui s'appelle Twig. Twig, c'est un moteur de template. Dans notre GS, il y a il y a d'autres moteurs de template comme je dit et cetera. C'est-à-dire généralement tous les framework que vous utilisez euh si vous voulez générer du code HTML côté serveur, il vous faut poser la question : quel moteur de template que je vais utiliser pour faciliter la génération du code HTML. Alors dans notre cas en tout cas, on va utiliser dans un premier temps Teamliff et par la suite je vais vous montrer comment travailler avec GTE parce que ce moteur de template c'est si il vient d'être intégré à Spring, c'est c'est nouveau. Et ce moteur de template, il présente vraiment des des avantages aussi. Donc c'est bien de le voir. Alors maintenant si vous voulez voir maintenant l'architecture globale, vous allez avoir ça. Donc ce slide là, il résume à peu près comment fonctionne Spring MVC. Regardez bien. Alors supposons je voudrais créer une application qui permet d'afficher la liste des produits. J'ai une liste de produits dans un tableau. Bah qu'est-ce que je vais faire ? J'envoie une requête http get/index. Ma requête il arrive vers quoi ? Il arrive vers dispatcher servelette. Dispather servelet, il fait appel le contrôleur. Alors dans Spring MVC, c'est quoi un contrôleur ? Ben un contrôleur c'est une classe Java. C'est une classe Java dans laquelle on utilise la notation contrôleur. possible. Pardon. Donc si vous voulez euh qu'une classe si vous voulez créer un contrôleur, donc vous créez une classe Java qui utilise l'annotation contrôleur. OK ? Et à l'intérieur de cette classe, vous allez créer des méthodes ici. Donc je vais créer une méthode que je vais appeler liste produit. Alors maintenant la question quand est-ce que cette méthode va s'exécuter ? Et bien cette méthode va s'exécuter quand on envoie une requête http avec la méthode get vers quel pat/ index. Comment je vais dire ça avec cette annotation ? Vous voyez donc juste à la méthode list produit, j'ai l'annotation get mapping. Ici vous avez slash index. Ça veut dire quoi ? C'est-à-dire quand une requête HTTP est envoyée avec get avec le pad/ index ici quand j'envoie une requête avec get vers slash index cette méthode va s'exécuter c'est-à-dire dispatcher servit fait appel à cette méthode et dans cette méthode là qu'est-ce que je vais faire ? Je vais récupérer la liste des produits à partir de la base de données. Alors c'est pour cela j'ai besoin j'ai besoin de d'utiliser l'interface produit repository. Donc si vous travaillez avec Spring Da, ça veut dire que dans votre coche métier ou bien votre coche DAO, vous avez une interface produit repository qui contient les méthodes C, find all, find by, donc tout ce queon a déjà vu. Et ben je vais utiliser cette interface Spring Data produit repository et après j'ai besoin de faire l'injection des dépendances. Donc je vous rappelle que pour faire l'injection des dépendances avec Spring vous avez soit vous pouvez utiliser l'annotation Auto wired donc l'annotation auto wired placée sur un attribut ça signifie tout simplement faire l'injection des dépendances ou bien on peut utiliser un constructeur avec paramètres. Donc ici auto wired ou bien utiliser un constructeur. Alors ici donc j'utilise auto wir. Alors maintenant une fois que cette méthode s'exécute donc vous voyez donc le contrôleur fait appel à cette méthode et bien dans cette méthode je vais récupérer la liste des produits. Pour récupérer la liste de tous les produits, donc je vais utiliser produit repository point find all. Là qu'est-ce que je suis en train de faire ? Je suis en train de faire les traitements. Je fais appel au traitement. Je vais vers la base de données. Je récupère des résultats. Finalement, les résultats, c'est la liste des produits, n'est-ce pas ? Alors maintenant, ces résultats là, où est-ce que je vais les stocker ? Dans le modèle. Et pour utiliser le modèle avec Spring MVC, il suffit de déclarer un objet de type modèle. Et dans le modèle, je vais ajouter, voyez donc modèle. Ad attribute, je vais ajouter un attribut qui s'appelle liste produit et dans la valeur c'est quoi ? C'est la liste des produits. Donc maintenant je viens de stocker les résultats dans le modèle. Donc si vous rappelez MVC V C et M. Vous voyez donc j'envoie une requête vers le contrôleur. Le contrôleur qu'est-ce qu'il fait ? Il fait appel au traitement. il appelle la couche métier, il récupère les résultats. Alors pour moi les résultats ici c'est la liste des produits. Liste. Et puis maintenant on va stocker les résultats dans le modèle ça. Donc ici j'ai la liste des produits dans le modèle. Et qu'est-ce qui reste maintenant ? Je vais retourner la vue. Donc vous voyez donc ici donc je vais informer la vue. Ben la v la vue il va tout simplement jusque là je retourne la vue vers je la retourne vers des servelet et despachat servelette va faire appel à la vue. Mais cette vue là c'est pas JSP. C'est qui qui va traiter cette vue ? C'est le moteur de template teamlift. Donc ça veut dire que le dispatch fait appel à Teamliff qui est le moteur de template et c'estlift qui va traiter cette vue. HTML. Et maintenant dans cette vue HTML, si vous voulez créer une vue une vue basée sur Teamliff, c'est très simple. Il suffit de créer une page HTML dans laquelle vous déclarez cette librairie là de Teamliff se forme d'un d'un namespace. Alors le préfixe ici c'est th. Et maintenant qu'est-ce que je vais faire ? Et bien tout simplement dans la vue, qu'est-ce que je vais faire ? Je vais je vais chercher cette liste. Je vais faire une boucle pour chaque produit. Chaque produit, je vais le le mettre dans une ligne HTML. Chaque produit, je vais l'afficher dans une ligne HTML. Et pour faire ça, donc je vais utiliser TR. Vous voyez ici, vous avez th. Alors, c'est quoi th ? C'est tim. Th c'est tim each. Ça veut dire quoi ? Ça veut dire for it. For c'est une boucle. C'est comme si vous êtes en train de demander à Timli, fais-moi une boucle pour me générer plusieurs lignes, plusieurs TR. For each quoi ? Pour chaque P de quoi ? De liste produit. Alors c'est quoi liste produit ? C'est ça. Donc automatiquement Teamliff il va vers euh liste dans le modèle. Donc vous voyez donc ici team, il va vers le modèle, il va récupérer la liste et après il va générer un rendu qui s'affiche. Et ben il fait tout simplement la boucle. Pour chaque P de la liste des produits, je vais créer plusieurs colonnes et chaque colonne, je vais mettre TD. Entre TD et/TD, je vais afficher un texte. C'est pour cela j'utilise ici th text. Qu'est-ce que je vais afficher ? C'est P. Alors, c'est quoi P ? C'est produit. Et qu'est-ce qui m'intéresse ? C'est ID. Et là, j'affiche désignation prix quantité. Donc, vous voyez donc Timlif quand il va lire ça, qu'est-ce qu'il fait ? Il fait des boucles. Pour chaque produit, il va me générer des lignes. Mais à la fin, qu'est-ce qu'il va me retourner ? Il me génère le HTML. Ce qu'il va générer là, c'est du HTML pur. Est-ce que ça c'est du HTML pur ? Non, ça la forme d'un HTML. Mais si vous envoyez ce HTML directement au navigateur, votre navigateur ne va rien ne va rien comprendre parce qu'il peut pas comprendre ce que c'est. C'est Temlif qui va comprendre ce que c'est. Donc c'estlif qui va faire des boucles et qui me génère le vrai HTML. Donc c'est Teamliff qui génère le le le HTML qui va être envoyé vers le navigateur et qui va s'afficher directement ici. Est-ce que c'est clair ? C'est clair pour les autres. Oui monsieur, c'est clair. [Musique] Oui. Model ici c'est général ou bien le modèle produit le Vous avez modèle dans le dans le paramètre. Oui. Ici. Les bon modèles ici c'est la classe produit ou bien c'est un modèle général ? Non c'est un modèle général fourni par Spring MVC. Oui le mon modèle c'est dans un space là. Voilà. Alors donc le modèle, c'est-à-dire pour pour vous, vous n'aurez pas besoin de le modèle pour Spring Inv. Le modé, c'est un objet de type map, ça dans lequel vous pouvez ajouter des attributs. Par exemple, ici je vais stocker la liste des produits et c'est à vous de stocker dans le modèle ce que vous voulez, votre propre modèle si vous voulez. D'accord ? Donc ça c'est un modèle général mais dans lequel vous stockz ce que les les données que vous voulez. Voilà même de données pour produit pour n'importe tout à fait. Allô monsieur Oui, une petite question mais est-ce que ce modèle est vidé après la requête ou ça ? Alors, c'est pas qu' uniquement le modèle qui est vidé à la dès que vous donnez la réponse, quand vous vous envoyez euh une réponse HTTP, dès qu'on donne la réponse, et bien tout simplement euh ça euh c'est-à-dire le modèle disparaît parce que c'est le le scope de d'un modèle, c'est request. le modèle disparaît. Bah, c'est-à-dire cette vue cette vue là, c'est vrai etlif, il va la garder dans le le cash. Et donc, ce qui fait que le mod le modèle c'est son scope, c'est request. Dès qu'on donne la réponse, on oublie un peu les les bien sûr toutes ces données là. D'accord. Merci. Alors donc vous voyez donc ça c'est comme ça que ça marche. Donc c'est comme ça que ça marche Spring MVC. Alors maintenant, si vous travaillez avec ce ce modèle comme ça, c'est-à-dire cette architecture, est-ce que ça c'est un rendu HTML côté serveur ou bien c'est un rendu HTML côté client ? Côté serveur. Tout à fait. Alors ça c'est un modèle rendu HTML côté serveur. Ça veut dire que le client envoie la requête request, le serveur fait les traitements et à la fin qu'est-ce qu'il me génère du HTML. Et si vous vous utilisez Teamliff, ça veut dire que vous générez le code HTML code serveur. Qu'est-ce qui génère le code HTML ? C'est côté serveur avec Teamlift. Donc Teamlift, c'est le moteur de template. Ça veut dire que que si vous travaillez avec un un rendu HTML côté serveur, côté client, est-ce que vous aurez besoin d'utiliser un framework JavaScript ? Non. à la rigueur, vous n'avez même pas besoin, vous faites que du vous faites rien côté client parce que tout se fait côté serveur. Côté client, on va juste cliquer l'utilisateur, il clique, on envoie la requête et on reçoit du HTML. Alors maintenant, si vous voulez travailler avec le rendu HTML côté client, voilà ce que vous allez faire. Si vous voulez travailler avec le rendu HTML côté client, regardez votre contrôleur devient ce qu'on appelle un restrer, c'est-à-dire votre contrôleur, il devient ce qu'on appelle un web service. Vous voyez ? Donc à la place de contrôleur, on va utiliser restrer. Et le reste c'est la même chose. Regardez quand j'envoie une une requête get/prit get/prit, cette méthode va s'exécuter. Et quand il s'exécute, on va récupérer la liste des produits. Et quand je récupère la liste des produits, regardez ce que je vais retourner et est-ce que je retourne la vue ? Je retourne directement la liste les résultats et ces résultats là automatiquement des pass il va les envoyer en format c'est-à-dire que le cette fois-ci le le client il reçoit les données ici. Alors maintenant c'est côté client côté client que vous aurez besoin d'utiliser un moteur de template. C'est côté navigateur que vous aurez besoin un besoin d'un moteur de template qui va prendre ces données Jason et de les afficher au format HTML parce que finalement l'utilisateur lui il voit pas du Jon. Qu'est-ce qu'il voit à la fin ? Il voit toujours du HTML. Et donc si vous voulez générer des code HTML côté client, vous aurez besoin d'utiliser un framework JavaScript. Donc si là vous aurez besoin d'utiliser soit Angular soit React. Si vous travaillez avec Angular, vous allez avoir un moteur de template qui ressemble à Teamliff comme ça. C'est-à-dire tout simplement ce que vous ce que vous faites là avec Teamliff, vous allez le déplacer ici. Mais avec Angular, vous n'allez pas utiliser Teamli. vous allez utiliser quelque chose ng ng for each ng if et des choses comme ça c'est-à-dire vous faites à peu près parce que Angular il utilise un moteur de template qui est basé sur purement c'est du HTML ceux qui travaillent avec React le moteur de template React il mélange entre JavaScript et HTML vous écrivez du HTML du JavaScript mais avec du HTML. C'est ce qu'on appelle le GSX H euh ceux qui travaillent avec donc chaque chaque moteur de template a son propre moteur plutôt à chaque sa propre syntaxe. Mais l'essentiel, le plus important pour vous, c'est de c'est déjà de savoir, c'est que quand vous êtes devant une application web, même si vous êtes un utilisateur, soyez toujours curieux de dire est-ce que ça c'est un rendu HTML côté serveur ou bien un rendu HTML côté client. parce que même la sécurité des applications web va dépendre est-ce que c'est un rendu HTML côté client ou bien côté serveur. Donc ça c'est des choses qu'on va traiter bien sûr après il y a la partie sécurité qu'on va traiter le la semaine prochaine et donc il faut il faut comprendre ça. Bon mais nous dans un premier temps, nous allons travailler d'abord avec euh le rendu HTML côté serveur. Ce n'est pas le moment d'étudier un framework JavaScript ni Angular ni React. On va supposer quand on veut faire tout avec Spring, c'estàdire on génère toute l'application côté serveur avec Teamlift. Mais après, on va étudier le framework Angular et nous allons voir comment créer une application avec un rendu HTML côté client. Alors l'exemple d'application sur lequel on va travailler, donc on va créer une il y a une activité pratique dans laquelle vous avez trois parties. Il y a une première partie dans laquelle on va essayer d'afficher une liste de patients. On va faire la pagination et puis on va faire la suppression. On va jeter des liens pour supprimer ça avec des liens pour supprimer éditer. Et dans la deuxième partie, on va voir comment créer une page template. C'est le menu. Bon, la page template pour toutes les pages. Et la troisème partie, nous allons voir comment sécuriser, comment utiliser Spring Security pour sécuriser. À ce niveau-là encore, on va s'arrêter sur les concepts de base de la sécurité web parce que c'est très important. Alors maintenant, je vais rapidement vous faire une démo et dans cette démo que je vais faire, je vais résumer tout ce que nous avons fait jusqu'à présent. C'est pour dire tout simplement pour développer une petite application web euh avec Spring et ben tout simplement on peut si on a l'habitude on peut faire quelque chose rapidement en 30 en 30 minutes. Alors donc vous allez me suivre dans la démo et par la suite la suite de l'activité pratique les autres fonctionnalités vous allez les retrouver dans euh dans Classroom. Monsieur j'ai une petite question. Oui, je veux savoir la différence entre web service et Alors, ça c'est je pense une question euh pour laquelle on a déjà euh on a déjà on a on a déjà parlé, je rappelle. Alors, regardez, il faut juste parce que si vous voulez au premier semestre, si vous rappelez, j'avais parlé de du web service, n'est-ce pas ? Et vous devrez savoir d'abord premièrement si quand vous parlez du websice euh il existe combien de types de websice ? Si vous rappelez vous avez encore de la mémoire ? Oui. De deux types de Il y a soap quatre quatre il y a rest graph QL graph G7. Il y a GRPC. Très bien. Il y a quatre quatre euh quatre en fait web service quatre types de web services. Euh donc tout ça c'est du web service. Maintenant celui-là que vous voyez là c'est un web service de quel type ? De type rest. Donc un web service restrer. Il fait des traitements, il rend des résultats souvent au format disons mais ça on va revenir en détail. Alors, il se trouve que en fait si si vous rappelez c'est quoi d'abord bon un web service c'est quoi ? Un web service c'est un composant, c'est un objet c'est un objet qui contient des méthodes ça, mais qu'on peut appeler via des requêtes HTTP. On peut appeler à distance via des requettes HTTP. Et donc si vous rappelez dans SAOP nous avons quelque chose qui s'appelle le W SDL si vous rappelez. Alors nous avons dit que le WSDL c'est quoi ? C'est un document qui permet de de décrire l'interface du web service. Normalement dans les applications distribuées si vous voulez consommer un web service si vous voulez je suis un client une application cliente je veux consommer un websice. Normalement pour consommer un websice il vous faut son interface. Il vous faut sa description par exemple avec le avec SOAP, la description d'un web service utilise un fichier XML qui s'appelle le W SDL et REST. Si vous voulez faire la description d'un web service rest, on utilise un document qui s'appelle la documentation swager. Ça c'est comme ça. Swager swager c'est ce qu'on appelle également open openi. Open API doc c'est la documentation. Graph QL, c'est graph QL schéma. euh GRPC, c'est ce qu'on appelle euh protofile. Donc c'est-à-dire que chaque web service, si vous voulez euh faire sa description, on le fait dans un fichier. Et officiellement, quand vous avez si vous avez un web service qui dispose de d'une description d'une interface, c'est ce qu'on appelle une API. Donc déjà le terme PII, quand vous dites API, quand est-ce que vous pouvez dire une API ? Une IPI, ça veut dire application programming interface. Une IPA normalement ça veut dire c'est une c'est une interface application programming interface ça veut dire que c'est un service que vous pouvez consommer via une interface. OK. Alors c'est quoi l'interface pour l'interface pour les web service WSDL ? C'est quoi l'interface pour RS SW ? Donc si vous avez si vous avez un web service qui dispose d'une d'une description d'une documentation ou bien d'une interface, vous pouvez l'appeler webpi normalement c'est un web service web. Donc un web ça peut être un SOP ou bien un rest ou bien un graph QL et cetera. OK. Donc, mais si vous avez par exemple un web service rest comme celui-là, bon ça c'est un web service rest, mais est-ce qu'il a un W ? Est-ce qu'il a une description ? Non, on n' pas on n' pas de pour le moment parler de donc normalement ça c'est un web service, c'est un rest mais est-ce que je peux dire c'est une PII ? Non. Si vous voulez que ça soit vraiment une API, il faut qu'elle respecte, il faut que il faut lui générer ce qu'on appelle la sa documentation. Donc, mais sinon, vous pouvez l'appeler web service. Donc, vous voyez donc web service, c'est général. C'està-dire web service, ça veut dire c'est quelque chose qu'on peut appeler via des requettes HTTP à distance. Web IPI, ça veut dire c'est un web service qui dispose d'une interface, d'une documentation et voilà. Donc, je sais pas si c'est bien ça ta question. Oui oui, c'est clair. OK. Voilà. Une petite question aussi. Oui. Oui. Je dis que voilà ici en fait on a un peu remplacé le dispatière servet par disons Tom 4 par ce dispat là. Est-ce que il y a comme Tom 4 derrière F ou oui oui oui vous avez raison parce qu'en réalité il y a pas il y a rien sans Tom 4. C'est-à-dire en réalité si je représente ça, il y a Tom 4 d'abord Tom 4 qui va démarrer et Tom 4 va démarrer. Despatcha servelet. C'est Tom 4 qui gère parce que nous avons dit qu'est-ce qui gère les servelettes ? C'est Tom 4 et après c'est despatcha servelet qui va gérer les contrôleurs et le reste. OK d'accord. Merci. Alors maintenant, je vais faire la démo. Donc rapidement, je vais directement passer euh à Intellig ici. Ben, je vais commencer par créer un projet. Bon, c'est un projet Spring Spring Boot comme la dernière fois. On va l'appeler par exemple web par exemple MVC web MVC Products par exemple pour gérer des produits. Bon, c'est un projet c'est un projet donc Maven euh le groupe ID. Bon, je garde je vais utiliser Java 21 ici. Next. Alors euh quelles sont les dépendances dont on aura besoin ? On aura besoin des dépendances suivantes. D'abord, on aura besoin de G spring data GPA. Pourquoi ? Parce que je vais utiliser une base de données. Quelle base de données que je vais utiliser ? Au début, je vais utiliser H2 database, c'est in memory database et par la suite, je vais utiliser My Sequel ou bien postgress, peu importe ici. Et après pour euh comme je veux développer une application web, je vais utiliser Spring Web. Web. Alors, Spring Web c'est ça Spring MVC et puis j'ai besoin de Lemb, ça je vous l'ai déjà expliqué, c'est pour générer les gets et sets et tout ça. Et puis j'ai besoin d'un moteur de template. Alors regardez, si vous mettez vous écrivez template in jeans, voyez donc il y a team le lif, ça c'est intéressant. J'étais GT c'est nouveau. Avant c'était pas dans Spring après mais ça c'est ancien Freemaker moustache Grovit template. Euh donc ici pour le moment on va travailler avec Teamliff. Vous créez le projet dans une nouvelle fenêtre ou bien dans cette fenêtre là, peu importe ici. Alors dans le projet donc je vais créer des packages dans le dans le le package de l'application. Je vais créer ce package. Donc le package entities, je vais créer également le package euh repoository. C'est pour la la couche dao. Et je vais créer par le moins le package pour la couche web. Alors pour l'entité, supposons que je vais gérer des produits pour rester toujours dans le même exemple product. Alors dans mon cas ici un produit est défini par son ID, par son nom, par le prix type double par la quantité type int. Alors pour que ça soit une entité GPA, je vous rappelle qu'il faut utiliser l'annotation quelle annotation entity. Ça c'est l'entité GPA. Et pour il vous faut l'identifiant le ID, ça c'est l'identifiant la clé primaire. Si vous voulez générate, vous utilisez generated value. Alors pour euh il me faut les getters et setters. Donc je vais utiliser l'emboc avec l'annotation getter avec setter. J'ai besoin de générer un constructeur sans paramètres, un constructeur avec paramètres. J'ai besoin de générer la méthode de string et j'ai besoin d'utiliser le builder. En fait le B, je rappelle maintenant pour créer une instance de produit, j'ai deux trois façons de faire. Soit j'utilise le constructeur sans paramètres, soit le constructeur avec paramètres, soit le builder qui est très pratique pour créer les objets. Alors donc vous voyez donc j'ai terminé mon entité, je vais créer maintenant l'interface repository. Je pour travailler avec Spring Data, je rappelle, il suffit d'utiliser de créer une interface que je vais appeler product repository qui hérite product repository. Je vais renommer avec alt entrée rename file extend GPA repository. Alors GPA repository c'est une interface générique dans laquelle je vais spécifier quel est l'objet que je vais gérer. c'est des objets de type product. Et le ID, il est de quel type de de type langue. Alors maintenant, je vais faire un test pour cela, donc je vais vers mon application Spring Boot. Alors, la meilleure la façon la plus simple pour faire exécuter un traitement au démarrage de l'application, c'est de créer un bin qui s'appelle Command Line Runner à l'intérieur de cette classe et en utilisant la notation BIN. Donc je vous rappelle juste que toutes les M dans Spring toutes les méthodes qui utilisent la notation bin c'est des des méthodes qui s'exécutent au démarrage. Dès que l'application démarre, tout ce qui est bin va s'exécuter. Alors ici donc la la méthode s'exécute, il va retourner une un objet de type command line runner qui contient une méthode run qui va faire ce traitement. Alors qu'est-ce que je vais faire ? Donc je vais injecter product repository. C'est l'interface qui contient les méthodes qui me permettent d'accéder à la base de données. Et ici donc je vais insérer quelques produits dans la base de données en utilisant product repository.save. Et donc pour faire save donc vous pouvez utiliser product new product, c'est-à-dire le constructeur avec paramètres. Si vous utilisez le constructeur avec paramètres, le problème c'est que vous vous devrez connaître les paramètres et l'ordre des paramètres. Par exemple, vous devrez savoir que le premier c'est le ID, le deuxième c'est name. Le 3è c'est le prix et le le 4e c'est la quantité. Alors ça, j'ai utilisé le constructeur avec paramètres mais j'avais expliqué que le constructeur avec paramètres, ce n'est pas pratique parce que si vous avez beaucoup de paramètres, parfois vous savez pas quel est le premier, quel est le deuxième. C'est un peu compliqué. Alors pour ne pas faire ça, pour ne pas faire ça, il vaudrait mieux créer des produits comme ça en utilisant le builder. Il suffit d'utiliser product.bild. Mais avant de faire build, vous spécifiez les les attributs que vous voulez. Par exemple, je veux name ici. Donc ça c'est computer point price point quantité et c'est tout. Donc ça c'est beaucoup mieux parce que je vois bien ici ça c'est name, c'est ça c'est le prix et ça c'est la quantité. Alors que ici je vois pas, je sais pas ce que c'est ça. Ça c'est pour cela que c'est comme ça c'est mieux. Donc au lieu de faire ça, donc je vais enregistrer un produit. Je vais ajouter un deuxième save product repository. Product.bilbuilder.bild. C'est quoi name ? C'est par exemple printer. C'est quoi le price ? C'est quoi la quantité ? Voilà, j'ai un deuxè et j'ai un 3è ici. Alors, smartphone. Alors, si vous voulez afficher la liste des produits au démarrage, on va utiliser donc product repository find all et vous faites for each pour chaque produit. P, je vais afficher les informations sur le produit. Par exemple, j'appelle la méthode string. Donc ça c'est un premier test que vous allez faire. Avant de faire le test, il faut configurer la base de données. Ça se passe dans le fichier application point properties. Vous aurez besoin de spécifier Spring data source URL. Ici c'est GDBC de point. même je vais utiliser la base de données ITO2 in memory. La base de données, je vais l'appeler product db. Alors, pour consulter la base de données to,2, vous aurez besoin d'activer la console2. de console vous mettez tr c'est une interface web qui permet de consulter la base de données sans oublier le port de Tomc 4. Vous voyez donc par défaut server port c'est 8080 euh mais si vous voulez le changer vous mettez par exemple 80 80 83 ou je sais pas quoi. Alors, si vous tentez d'exécuter votre application, ça vous allez avoir une erreur que pour les gens qui travaillent avec Java 21, bon ça j'ai déjà expliqué, avec Java 21 ici LB n'a pas marché. Il vous dit que je connais pas la méthode build, ça veut dire que Lembok n'a pas marché. Et ben pour corriger ce problème là, il faut aller vers le fichier POM XML. Il faut ajouter la version de Lembok. Ici, vous mettez version et vous mettez un point. La dernière c'est 1.1834 et la même version vous allez l'ajouter ici. Alors, si vous travaillez avec Java 17, vous n'allez pas rencontrer ce problème. Mais si vous travaillez avec Java 21, 23 et cetera, ça c'est un détail. Il faut actualiser Maven update et vous réexécutez l'application. Et vous pouvez dire que ça c'est ça c'est à peu près un rappel. Voilà, vous voyez ? Donc si j'arrive à afficher la liste des produits au démarrage, c'est un rappel de la la ce qu'on a fait la dernière fois. Alors maintenant je vais pas Oui monsieur concernant la base de données Oui. dans le fichier de configuration, c'est pas obligatoire de définir un driver GDMS concernant le Alors ici donc si vous utiliser It par défaut il est inclus d'accord si vous mettez Spring data source URL donc par défaut euh il sait qu'il va utiliser le driver de to d'accord et si vous utilisez par exemple My SQL il sait qu'il utilise le pilote GDBC de My SQL qui qui est disponible Alors pour le moment c'est tout. Alors si vous voulez consulter la base de données, monsieur Oui. Pour la production, est-ce que vous conseillez l'utilisation ? Non, en production ça marche pas parce que2 c'est in memory database, c'est-à-dire euh une fois que vous arrêtez l'application, vous les les données vont être perdues. Donc H2, c'est juste pour faire le test mais après il faut remplacer H2 par my SQL. Donc si vous rappelez la dernière fois donc je vous avais déjà montré dans la démo. Oui. Donc la donc la question pourquoi il n'y a pas une version qui est déjà embarquée et que qu'on peut utiliser pour la prod avec tout avec avec Oui, vous pouvez mais en fait vous savez si vous voulez mettre utiliser une base de données embarqué et ben tout simplement au lieu d'utiliser ici même vous utilisez avec file et dans ce cas votre base de données va être enregistrée dans un fichier Et ça peut ça peut servir pour une base de données embarqué. Mais après, il faut mettre ici le chemin où vous allez placer ce fichier là. Donc c'est-à-dire si vous voulez créer une base de données persistante. OK. D'accord. Et et est-ce que est-ce que vous conseillez cette méthode pour la production ? Non, en produ c'est pour les systèmes embarqués. Si tu veux créer une application dans une carte puce ou bien dans un système embarqué, oui, tu peux travailler avec un fichier comme ça ou bien SQL Lite, il y a plein de de SGBD pour les systèmes embarqués. Mais si vous voulez créer une application qui contient beaucoup de données à gérer, non, il faut oublier ça. Il faut utiliser un vrai serveur de base de données comme MySQL ou bien Oracle ou bien SQL serveur ou bien Postgress. C'est ce qu'on utilise en production généralement pour les les grandes bases de données. Mais pour une petite application pour un système embarqué, c'est pas la peine. Vous pouvez utiliser H2, vous pouvez utiliser est-ce que c'est des c'est des c'est des bases de données mais souvent c'est pas pour mettre des grandes bases de données. Donc voilà. Alors ici maintenant si vous voulez voir votre base de données, je rappelle que vous aurez besoin vous aurez besoin donc de taper local host 803, c'est ça ? SL it to console. Alors vous voyez donc ça c'est it to console. Vous mettez la base de données GDBC2 même product db. Vous vous connectez et vous voyez bien que la base de données est générée et vous avez la liste des produits dans la base de données. Alors maintenant, je vais passer à la partie web. Ce qui nous intéresse Spring MVC. dans web, je vais créer un contrôleur. Donc je vous rappelle pour créer un contrôleur, il suffit d'utiliser une classe que je vais appeler product controller. Pour que ce soit un contrôleur Spring MVC, il faut utiliser la notation contrôleer. OK ? et contrôleur a besoin d'accéder à la base de données. Donc, j'ai besoin de déclarer un objet de type product repository. Pour faire l'injection des dépendances, vous avez deux solutions simples. La première, c'est quoi ? H wirre, c'est avec Spring, c'est l'autoinjection des dépendances. Donc il va injecter dans repository à une classe une implémentation de cette interface pour ce spring qui va la générer. Mais voyez ware c'est c'est décommandé. Ce qui est recommandé c'est d'utiliser l'injection via le constructeur. Il suffit de créer un constructeur avec paramètres. Donc ta c'est l'injection des dépendances. Donc si vous avez un un seul constructeur avec paramètres, ben quand Spring MVC quand Dispatcher Slit va instancier le contrôleur, automatiquement il va transmettre un objet de type product repositor, c'estàd il fait l'injection des dépendances. Donc vous avez les deux solutions qui marchent mais si on vous dit quel est le mieux, est-ce que auto wire devient le constructeur ? Comment vous allez répondre ? C'est le constructeur. C'est pas pourquoi ? Parce que alors parce que le problème autware c'est quoi ? Et ben spring word c'est que au moment de quand il va instancer l'objet il va accéder directement à l'attribut product repository. Même si le l'attribut est privé, il va accéder, il va lui affecter une valeur. Ça veut dire qu'il est en train de violer le principe de l'encapsulation. parce que normalement il il devrait passer via le setter au lieu d'accéder directement, n'est-ce pas ? Donc auto wired il fait il accède directement à l'attribut, il il le modifie. Et en même temps, le fait d'aller vers un attribut de le modifier ce n'est pas dans les bonnes pratiques. Ça marche. Mais vous êtes en train de violer une un principe. Le principe. Normalement pour initialiser une variable, il il vous avez soit le constructeur, soit le setter. Mais wir il fait quelque chose, c'est-à-dire c'est pas irrégulier. Donc c'est il sera emprisonné. celui qui a créé Est-ce que Est-ce que vous voyez donc ça ça marche visiblement ça passe mais après si vous voyez donc ça c'est Hongri vous dit not recommanded alors qu'est-ce qui est recommandé c'est le le plus la meilleure façon pour injecter c'est le constructeur donc ça ça marche. Et après ici, je vais créer une méthode qui retourne une vue que je vais appeler index monsieur. Oui monsieur. Dans dans la partie répository, monsieur, c'est Spring qui qui va créer l'implémentation de productository. C'est pas nous. Oui. Non, c'est pas merci à Spring. C'est ça. Spring data. Voyez donc Spring Data dispose déjà d'une classe qui implente déjà cette interface. et dans laquelle il y a déjà toutes les méthodes C F et cetera. Donc lui Spring Data c'est il va injecter sa propre implémentation. OK. Voilà. Alors donc ici index quand est-ce que cette méthode index va s'exécuter ? Quand on va envoyer une requête http avec get. Avec quel pat/index get. C'est pas getter, c'est get mapping. get mapping/index. C'est-à-dire quand j'envoie une roquette HTTP avec get avecindex, cette méthode s'exécute. Et cette méthode, qu'est-ce qu'il retourne ? La vue. Maintenant, il me faut créer la vue. Et pour créer la vue, il faut aller vers le dossier template. Ici, il vous créer un fichier HTML que vous allez appeler products. HTML. Donc ça c'est notre vue HTML Products. Et si vous mettez un test H2 test product par exemple, vous exécutez l'application, vous réexécutez et on va tester. Pour tester maintenant cette opération, je dois taper httplocalhost/ index. Bah, c'est ce que je vais faire ici. Je vais faire local host 803/index. Alors, vous voyez ici donc qu'est-ce que je vois ? Je vois la la vue, n'est-ce pas ? C'est-à-dire ce qui est retourné ici, c'est c'est la vue product et product pour le moment, il me génère ça. OK ? Alors moi je veux pas afficher uniquement ça mais je veux générer la liste des produits. Je veux la liste des produits. Pour cela, au niveau du contrôleur, je vais d'abord aller vers product repository. Je fais find all. Je récupère la liste des produits. Je vais la stocker dans une variable que je vais appeler products. Maintenant cette liste de produits, je vais la stocker dans le modèle, n'est-ce pas ? Et pour la stocker dans le modèle, il suffit de déclarer un objet de type modèle qui de Spring MVC qui s'appelle model. Vous voyez notre notre architecture. C'est ça. Vous voyez ? Donc j'envoie la requête. La méthode s'exécute, c'est pas ici. La méthode s'exécute, j'appelle, je récupère la liste et je vais stocker cette liste dans le dans le modèle. Et pour stocker cette liste dans le modèle, j'utilise modelad attribute. La l'attribut s'appelle liste produit par exemple, je peux l'appeler comme ça, liste produit. Et dans la valeur, c'est quoi ? Products, c'est la liste des produits. Alors maintenant, j'ai la liste des produits. Maintenant, je vais euh revenir à la vue pour l'afficher. Et pour afficher la liste des produits dans la vue, il on a besoin de déclarerlift. Alors, pour déclarer la librairie de Teamliff, on va utiliser XMLNS namespace. Le préfixe th égal à quoi ? http 2/w.teamlift.org. Donc ça c'est le names space de Teamlift. Et donc si vous voulez ici je vais générer je vais faire un div à l'intérieur dequel je vais créer un table dans lequel je vais faire th head tr la ligne de th c'est les headers. Je vais afficher la colonne ID, la colonne name, la colonne price et la colonne quantity. Maintenant, j'ai besoin de de faire une boucle dans la partie Tbadi. Dans Tbady, je vais créer une ligne. Mais cette ligne là, je vais la répéter combien de fois ? autant de fois qu'il y a des produits. Pour chaque pour chaque produit, je vais générer une ligne. Donc, je vais utiliser ici Teamliff. Je vais demander à Teamliff, s'il te plaît, fais-moi un for each. Donc avec th je demande à Teamliff, s'il te plaît, fais-moi une boucle. Si si je fais ça avec JSP, c'est à moi d'écrire le code Java qui fait for. Maintenant, c'est pas à moi de le faire, c'est Teamli qui va le le faire. Alors pour chaque P de points, il faut mettre juste de l'art à collat comme ça et vous cherchez liste produit. Vous voyez donc avec intellig c'est plus simple. Donc automatiquement il va vers le modèle il va vers le modèle il va chercher un attribut qui s'appelle liste produit. Il va faire for et après chaque produit je vais l'afficher dans une colonne TD en utilisant TH2. Alors ici dollar entre encore P point qu'est-ce qui m'intéressait ID ? Donc automatiquement il appelle les getters même si vous mettez P. ID mais en réalité team il fait get ID. OK là je vais afficher name price quantité. Je réexécute mon application. Je vais regarder dans le le navigateur actualiser. Bon, donc je je j'affiche maintenant la liste des des produits. Alors, je veux pas garder l'affichage comme ça. Je vais faire quelque chose de mieux. Je vais utiliser Bootstrap. Vous savez, Bootstrap, c'est un framework CSS. Pour utiliser Bootstrap, c'est très simple. Vous cherchez une dépendance qui s'appelle Webjars Bootstrap 5 Maven Deppendency. Vous allez trouver la dépendance. Je vais prendre la version 5.3. Je prends cette dépendance, je l'ajoute à pom XML quelque part. Ici, je fais actualiser et je vais aller vers ma vue et je vais utiliser Bootstrap. Donc maintenant pour utiliser Bootstrap dans HTML dans la part, vous utilisez l'attribut link R style sheet. Le type de la feuille de style c'est texts hf c'est quoi ? Vous mettez slash, vous allez trouver webs, ça existe donc c'est télécharger vers Bootstrap contrôle espace c'est quelle version 5.3.5 qu'est-ce qui m'intéresse dans le dossier CSS ? Je vais chercher bootstrap.min.css. Ouais. Donc c'est ça le framework Bootstrap. C'est CSS, j'ai pas créé. À la fois utiliser Bootstrap, je vais en profiter. Il suffit d'aller vers table. Vous mettez vous lui dites, je vais utiliser la classe table. Ensuite class table, c'est fait par Bootstrap. Je je réexécute et je regarde l'affichage. Actualiser. Vous voyez, c'est beaucoup mieux. Donc ça c'est Bootstrap. Alors maintenant, du moment que j'ai Bootstrap, je vais en profiter euh pour arranger ma mon application ici. Donc je vais mettre classe, je vais mettre un peu d'espace en utilisant padin tree par exemple. Et ensuite, je vais ajouter un bouton qui permet de supprimer les produits. Comment je vais utiliser TD ? Ici, je vais créer un lien à delete delete. Je vais supprimer le produit et pour supprimer le premier je le produit je vais utiliser HRF. C'est pas HRF, c'est th HRF, c'estlif HRF. C'est-à-dire quand je clique sur le lien delate, je vais aller vers cette expression là. Je vais aller vers une action que je vais appeler delete product par exemple delete product. Et quand je fais des late product, je devrais transmettre le ID du produit que je veux supprimer. Donc pour cela avec Teamli, il suffit de mettre les parenthèses et vous mettez la valeur de de ID. et la valeur de ID c'est P point ID. Vous mettez ici ID égal égal à quoi ? Égal. Mais je veux que ce lien soit un bouton en rouge. C'est pour cela, je vais utiliser la classe btn btnanger pour que ça soit un bouton en rouge comme ça. Alors je réexécute. Alors qu'est-ce que je vais avoir ? Je vais avoir dans ma liste ici, je vois ici un bouton qui s'ajoute. Chaque ligne, j'ai un bouton delete. Si je clique sur delete, qu'est-ce qui se passe ? Regardez, regardez ici. J'ai product avec ID égal à quoi ? Ég à 1. Si je clique ici des L product ID à quoi ? égal à 3. C'est-à-dire à chaque fois je fais des L mais je transmets toujours la valeur de ID. Alors maintenant ça marche pas la suppression. Voyez quel status code 404 je vous rappelez 404 ça veut dire quoi ? Voyez donc vous en tant que ingénieur dans le web dès que vous voyez une erreur il faut toujours chercher le code. Si le code n'est pas affiché vous faites les outils de développement. avec les outils de développement network. Vous faites ça, vous voyez votre roquette. Voilà, voyez la roquette HTTP et vous voyez la roquette HTTP, il y a une erreur mais il vous dit que status code c'est combien ? C'est 404. C'est juste pour que vous sachiez là vous êtes en train de demander quelque chose qui n'existe pas. Alors maintenant, moi je vais ajouter ce delete comme action dans le contrôleur. Donc je reviens vers le contrôleur et je vais ajouter toutes les méthodes crude à la à une seule point. Alors, je vais ajouter justement ici une méthode. Tout à fait. Je vais ajouter une méthode encore dans le contrôle que je vais appeler delete. Alors cette méthode delete, qu'est-ce qu'elle reçoit comme paramètre ? Un ID. Et qu'est-ce qu'il va faire ? Il va faire product repository pointdel delete by ID. Je lui donne le ID, le supprime de la base de données. Mais pour accéder à cette méthode, je il faut envoyer une requête HTTP avec get. Cette fois-ci avec quelle patte ? Regardez notre c'est des ça c'est ça le p c'est des late product il faut mettre ici des late product mais des product quand on appelle des product on envoie un paramètre qui s'appelle ID pour récupérer la valeur de ID avec Spring il suffit d'utiliser la notation request param name name égal id ça veut dire quoi ça veut dire vous êtes en train de demander à Spring Spring MVC va chercher dans la requête HTTP cherche-moi un paramètre qui s'appelle ID et récupère récupère-moi la la valeur. C'est comme si vous faites request. Paramét ID et je supprime. Une fois que je supprime maintenant je vais je vais retourner la vue. Mais cette fois-ci pour retourner la vue qu'est-ce que je vais faire ? Je vais réafficher, je vais réafficher à nouveau slash index, n'est-ce pas ? Cette fois-ci, donc je vais ça, c'est quoi ? Ça, c'est un forward, rappelez-vous. Donc, j'ai fait un forward vers la vue. Cette fois-ci, une fois que je supprime, je termine la suppression, je vais demander au navigateur va faire appel encore à slash index. Donc, je vais utiliser la redirection. Et pour cela, je vais utiliser return redirect. Ça s'écrit comme ça avec Spring MVC/ index. Alors directement ici donc je fais une redirection vers slash index. Alors regardez ce qui se passe. Alors je je laisse je laisse les outils de développement parce qu'il faut voir ce qui se passe. Regardez. Je clique sur je veux supprimer le trisè t il est il est il est il est parti n'est-ce pas ? Mais qu'est-ce qui s'est passé ? Regardez, j'ai envoyé une requête http versate. Ici regardez del qu'est-ce qu'il retourne ? Il retourne à une réponse avec quel status code ? 300 302 la redirection. Il va rediriger vers quoi ? Vous cherchez un attribut qui s'appelle location. Il est là, il a fait une redirection vers slash index. Donc vous voyez donc j'ai envoyé une réponse vers le navigateur et le navigateur va encore envoyer une requête vers get vers slash index. Donc en cliquant ici, j'ai appelé des late et j'ai également appelé index. Combien de requêtes que j'ai envoyé ? Donc la première des lite m'a redirigé vers slash index. Ça c'est c'est juste pour faire la différence entre forward et direction. Alors je supprime mais ici donc supprimer comme ça c'est dangereux. Généralement il faut toujours afficher une une alerte. Il te vaut sûr de vouloir supprimer. Ben c'est ce que je vais faire ici. Je vais ajouter un peu de JavaScript vraiment un peu en ajoutant ici on clic et vous mettez return. Je vais retourner la fonction confirme avec JavaScript confirme. C'est une fonction le message c'est V surv sur point d'interrogation. Si s'il dit OK, c'est à ce moment-là qu'il va vers HRF. S'il dit non, ça ça se passe pas. Donc ça c'est un peu JavaScript. Voyez ici. Donc cette fenêtre là ici, j'ai pas redémarré, c'est pour cela parce que normalement euh pour le moment je suis toujours obligé à chaque fois de redémarrer. Alors ça c'est ma base de départ. Si je clique, regardez, j'ai une boîte de dialogue. Êtes-vous êtes-vous sûr de vouloir supprimer cette fenêtre là ? C'est du JavaScript, ça s'affiche côté navigateur. Si je mets annuler, il y a rien qui se passe. Si je mets OK, c'est à ce moment-là qu'elle va supprimer. C'est clair ? Oui. Alors, ici, vous voyez donc ça c'est je vous parle une démo de 20 minutes, mais cette démo là, elle résume l'essentiel parce que ici, je fais quoi ? Je fais je vous ai montré comment créer un projet Spring, comment gérer les dépendances, comment créer une entité GPA, comment créer une interface GPA repository basée sur Spring Data. Comment tester la couche dao ? Comment utiliser to console pour consulter la base de données ? Comment créer un contrôleur Spring MVC ? Comment créer une vue basée sur Teamlift ? Et comment intégrer Bootstrap ? C'est beaucoup. Vous voyez ça en terme de concept, c'est beaucoup de d'apprentissage. C'est-à-dire cette vidéo là, même si c'est 20 minutes ou la 30 minutes, vous mettez les écoteur et vous commencez à faire des des révisions et en plus on fait de l'injection des des dépendances. Donc vous voyez donc les trois chapitres qu'on a travaillé sont résumés sur cette démo. Alors maintenant euh bon ça c'est le modèle rendu HTML côté côté serveur. OK, c'est rendu HTML côté serveur, c'est-à-dire le c'est qui génère le HTML, c'estli. Alors si vous regardez côté client ici, regardez ce côté client. Si vous affichez le code source, affiche la source de la page. Regardez sur HTML sur HTML ligne, une première ligne et une deuxième ligne. Ce HTML là, est-ce que c'est moi qui l'ai généré ? C'est Teamli parce que Teamliff, il a fait for each pour chaque produit. Il a généré une ligne. Donc c'est-à-dire ce code HTML que je suis en train de visualiser, il est généré par le serveur et non pas par le client. Vous voyez donc ça c'est la c'est ce que c'est la page Bootstrap. Donc tout a l'air d'être très transparent. Une petite application, je veux pas compliquer au début les choses mais avec cette application là ça vous ouvre un peu le en tout cas pour les gens qui ont du mal à connecter un peu ça avec ça avec ça mais c'est intéressant. Et ça c'est le rendu HTML côté serveur. Si vous voulez faire le rendu HTML côté client, bah il vous faut créer un restrer. Si vous voulez créer un restrôer, vous avez deux façons de faire. Soit vous créez un contrôleur et vous créez une méthode. Je vais créer une méthode qui retourne directement la liste des des produits des produits que je vais appeler liste products et directement vous retournez product repository.findv. Voici cette fois-ci qu'est-ce que je retourne ? la liste des produits. Et là, vous utilisez get mapping, c'est-à-dire pour faire appel à ça, je vais mettre par exemple slash product, c'estàd quand je vais taper slash product, qu'est-ce que je vais recevoir ? La liste des produits. Mais en quel format ? Et bien, si vous voulez la convertir en format Gison, vous avez deux façons de faire. Soit vous remplacez contrôleur par rest contrôleur et dans ce cas-là automatiquement tout ce que vous retournez il va le convertir en format design ou bien vous ajoutez ici la notation respse body c'est-à-dire vous lui dites cette réponse là tu tu vas l'envoyer dans le corps de la réponse. Donc automatiquement il va la convertir au format Jison. Alors dans ce cas-là, vous voyez donc ce contrôleur là, il joue en même temps un rôle de contrôleur Spring MVC, mais il joue également le rôle d'un web. H c'était une fonction pour le web service. Donc si j'exécute, si je je redémarre ça maintenant, ça c'est ça me donne ça. Mais si vous mettez slash products, qu'est-ce que vous allez recevoir ? Vous recevez la liste des produits au format 10. Donc ici donc vous voyez donc avec un contrôleur un restrôleur Spring MVC c'est quoi c'est un c'est un contrôleur qui reçoit des requêtes HTTP il fait des traitements mais à la fin il retourne une vue. Alors que un rest contrôleur c'est un contrôleur qui reçoit des requêtes HTTP il fait des traitements mais il retourne directement le résultat au format Gison. Donc pour ne pas faire ça ici, je vais le supprimer et je crée un autre web service que je vais appeler product rest. Maintenant, vous pouvez l'appeler restrer. Rest controller comme ça. Rest contrôle ou bien rest. Sauf que ici, il faut utiliser la notation rest. contrôleur. Là, vous déclarez votre repository comme l'autre. Vous faites l'injection des dépendances via le constructeur et vous créez cette méthode, n'est-ce pas ? Mais cette fois-ci, est-ce que vous avez besoin d'utiliser resp body ? Non, parce que ici vous avez un restrement. Mais maintenant, est-ce que ça c'est un c'est une rest ? C'est un web service, n'est-ce pas ? C'est un web service ça. Je veux retourner par exemple un produit sachant son ID. Qu'est-ce que je vais faire ? Je vais créer une méthode qui retourne un produit find by ID. Je vais l'appeler find by ID. Je vais lui donner le ID et il va me retourner product repository find by ID id et je fais get. Et là je vais utiliser ici get mapping. Je vais mettre slashpructs slash le paramètre ID. Alors, sauf que cette fois-ci, le ID ici, je vais l'envoyer le pat. Et pour indiquer à Spring MVC que ce ID là, il vient du PAT, je vais utiliser une annotation qui s'appelle request patte variable. Alors, c'est comme si vous lui dites "Va vers le pat, cherche-moi cherche-moi un dans le pat quelque chose qui s'appelle ID et tu l'affectes à ça." Bon, ça me donne ça me donne ça. C'est-à-dire mon web service pour le moment, il y a deux méthodes dans le web service. La première, c'est qu'il peut me donner la liste de tous les produits. La deuxième méthode, c'est qu'il peut me donner le un produit sachant son ID. Donc si vous mettez 1, il me donne ça. Si vous mettez slash 2, il me donne ça. Si vous mettez slash 3, il me donne ça. Si vous mettez slash 4, qu'est-ce qu'il va donner ? Imagine not found parce que found table vide non 500 erreur interne. Pourquoi ? Parce que vous envoyez la requête, n'est-ce pas ? et vous dites je veux chercher ID la base de données n'existe pas donc il retourne une exception interne. Il vous dites je veux retourner avec get il n'a pas trouvé. Bah si vous regardez il y a une exception ici il vous dit non no val présent c'està-dire ça c'est une erreur interne. C'est-à-dire il fait les choses normales mais après il n'a pas trouvé. Il y a une exception qui a rencontré n'est-ce pas ? Alors ça c'est c'est utile, c'est une démo maintenant ça c'est un web service. Mais si vous voulez maintenant que ça devient du HTML ça on aura besoin d'utiliser un framework Angular. C'est lui qui va prendre ses données de Jason et après il va les les convertir au format HTML. C'est-à-dire si après si vous utilisez ici index, qu'est-ce qui génère le HTML ? Teamliff. Mais si vous vous voulez utiliser le ces web services, il vous faut un frontend avec mobile ou là des choses comme ça pour les les exploiter. Voilà. Donc je pense que on a fait tout le ce qu'il faut aujourd'hui. Alors maintenant sur Classroom, vous allez trouver le la démonstration de l'activité pratique dans laquelle il y a plus de détails. Mais vous allez toujours commencer par cette petite démo parce que cette démo là, elle résume un peu voilà, elle résume l'essentiel. Moi, je préfère quelqu'un qui fait que ça le comprendre que de faire des centaines d'applications. Lège parce que avec ça, si vous le comprenez, vous passez des entretiens, vous répondez à tout ce qu'on vous pose comme question. Mais il y a tellement beaucoup de choses, mais chaque chose, il faut vraiment le on va dire la digérer. Il faut que votre cerveau commence à comprendre les choses de manière transparent. C'est clair ? Alors ça c'est le la démo. Alors pour la suite, il y a la pagination, il y a la recherche, des choses comme ça, mais tout le reste après, c'est des choses qui se répètent. C'est le c'est le même principe. Est-ce que vous avez des questions, monsieur ? Alors, un dernier point, s'il te plaît, pour ne pas oublier et je te laisse poser la question. Je disais tout à l'heure la question mais on n pas répondu. Est-ce que ça c'est un c'est est-ce qu'on peut dire que ça c'est un web service ça, n'est-ce pas ? Oui. Qui répond ? C'est un web service mais est-ce que c'est un rest ? Pas encore parce que ce ce web service là n'a pas de documentation swager, il n'a pas une interface. Si vous voulez ajouter la documentation swag d'un web service restf, bah c'est très simple. Il suffit d'ajouter une dépendance qui s'appelle Open Spring Boot, Open API. Donc vous cherchez cette librairie là, c'est là. contrôle C et vous l'ajoutez à Spring à Maven Maven ici vous actualisez il va télécharger cette dépendance une fois qu'il n'est plus rouge ça veut dire il est téléchargé il est en train de télécharger voilà maintenant c'est bon vous redémarrez l'application et avec Spring c'est aussi simple que ça parce que Spring la Spring Boot son point fort c'est qu'il fait ce qu'on appelle l'autoconfiguration en fonction de la dépendance que vous déclarez là il il génère beaucoup de choses. Alors si vous voulez voir la documentation Swager, il suffit d'aller vers le site ici et vous faites local 8080 et vous mettez swager ui html. S'il vous génère ça, ça maintenant vous avez la documentation swag et vous pouvez tester. Regardez, je vous voulez tester slash product, je fais get, je clique try, j'envoie la requête et je vois la réponse. Je veux faire par exemple un produit sachant son ID. Regardez, je clique try. Il vous demande le ID, vous tapez le ID, hein, j'envoie la requête et je vois la la réponse. Et si vous voulez voir maintenant, ça c'est la la documentation swage. C'est que généralement en entreprise quand on on crée des il expose des web services pour les autres, il faut leur générer ça parce que c'est avec ça que les autres peuvent savoir comment consommer votre web service. Parce que si j'ai ça, je peux savoir comment consommer le web service. Et si j'ai que ça. Mais si j'ai pas ça, il faut que il faut que je sache qu'est-ce que je dois taper et cetera, comment le faire ? Et si vous voulez voir la documentation soit Grielle, c'est ça. Vous avez ici le lo lien, ça c'est l'équivalent du WSDL pour le web service rest. C'est ça le c'est l'interface. Regardez ce qu'il vous dit. Il vous dit que ça ça vous donne quoi ? On peut faire quoi ? slash product. Si j'envoie une requête avec GET euh et ben tout simplement voilà la réponse qui va être retournée. Il va retourner un un tableau de type product. Et c'est quoi product ? Ici vous allez trouver ici product, il est décrit avec les attributs euh bon euh product être quelque part ici. Voilà. properties id de type int name de type string type de type number est-ce que vous rappelez le wsdl elle l le wsdl c'est xml et ça c'est du jon donc la documentation pour un web service et donc si vous avez ça si vous avez ça vous avez tout vous pouvez aller vers Postman Postman si vous lui donnez cette adresse là il vous fait exactement ça il vous affiche la liste de la liste des des méthodes vous cliquez, vous n'aurez plus besoin de tatonner. Vous faites ça, vous exécutez et vous pouvez faire les les tests. Alors ça c'est les en fait c'est ce qu'on va faire en détail la suite mais je pense que aujourd'hui donc c'est suffisant pour avoir une idée assez claire sur le le comment utiliser Spring MVC, comment développer l'application web et aussi surtout faire la différence entre le rendu HTML côté client et le rendu HTML côté serveur. Et voilà. Alors, si vous n'avez pas de questions, on va s'arrêter à ce niveau-là. Ah, il y a quelqu'un qui voulait poser une question ? Je te remets la parole. Tu peux reposer ta question monsieur ? C'est c'est juste pour l'annotation restrer. Donc, c'est une combinaison entre l'annotation contrôleur et response body. C'est exactement. Alors euh c'est ça. Regardez, si vous regardez restr, vous faites contrôle, vous cliquez, vous voyez donc euh restrer. Regardez restrô et même il utilise la notation contrôleur plus V. C'est exactement ce que je viens de dire. Donc c'est-à-dire quand vous mettez restrer, c'est quand vous mettez restr n'avez pas besoin de mettre dans les méthodes rest plutôt response body n'est-ce pas ? Mais si vous créez un contrôleur si vous voulez retourner dans un contrôleur des données il faut toujours ajouter rest. Bon, il y en a beaucoup qui ne connaissent pas ça mais c'est un petit détail qui hyper important. Est-ce que c'est clair ? Oui monsieur. Oui monsieur. Pour les méthodes implémentées par par SPR. Oui. Oui. Par c'est SPR les implement on voit pas on voit pas de classe. Voilà c'est ça fait ça Spring data. Regardez Spring data c'est ce qu'on a fait la dernière fois. H l'interface si vous regardez H l'interface GPA repository qu'on n'a pas créé on a hérité de GPA repository. GPA repository. Il dit il a toutes ces méthodes-là. D'accord. Et cette cette interface là ils sont déjà implémentés par Spring Spring Data. Donc quand vous utilisez l'injection des dépendances, vous injectez une implémentation qui est déjà fournie par Spring. Ça nous économise beaucoup le temps. Et après si vous voulez ajouter d'autres méthodes, je vous ai déjà montré la dernière fois qu'il suffit il suffit d'aller à l'intérieur de la méthode, vous déclarez de nouvelles méthodes find. Vous vous rappelez find by, on a parlé de ça. Oui. Oui. Tout ça donc et mais la partie je n'ai même pas parlé parce que c'est ce qu'on avait détaillé le dans le cours di spring data GPA. C'est clair monsieur. Oui monsieur. Pour les entités GPA, oui, la déclaration des attributs, il faut respecter le nom parce que Oui. Oui. Parce que il m'a généré une exception car j'ai nommé les attributs par il y a quelque chose de très simple, c'est que le quand vous travaillez avec Java les langages, il faut respecter les règles de nommage les conventions normal les règles. que l'attribut c'est toujours on commence toujours par une minuscule. Si vous mettez CID avec I majuscule ça peut marcher à moment donné mais à un moment donné vous allez avoir des exceptions tout simplement. Pourquoi ? Parce que Spring lui il suppose que les attributs commencent toujours par des minuscules. Et si vous avez par exemple name product, vous allez mettre name product comme ça name minuscule et juste après vous mettez P majuscule. Ceci des conventions les conventions, c'est quelque chose que vous êtes obligé de respecter. À un moment donné, on vous dit vous avez le choix de respecter ou non mais en réalité quand vous êtes en entreprise si vous respectez pas les conventions, c'est que votre code, il est rejeté. Il est rejeté par s'il n'est pas rejeté par des êtres humains, il est rejeté par par les les outils d'audit de code sonar. Vous savez sonard c'est un outil qui prend votre code source à un moment donné il vous rédige un rapport il vous dit voilà les choses que vous n'avez pas respecté parce c'est des c'est c'est c'est c'est des normes. Il faut la respecter et en plus ça vous évite de tomber dans des exceptions. Parfois vous cherchez l'exception, vous savez même pas ce que c'est. parce que tout simplement vous n'avez pas respecté les conventions. Si tout marche bien pour moi, d le premier que parce que je respecte juste les conventions. Alors vous vous êtes un peu vous êtes souvent le les étudiants. J'ai toujours ce problème là avec tous les étudiants, c'est que dans la majorité des cas, il néglige toujours les conventions. B moi je la variable, je peux l'appeler X majuscule, pas de problème. Ça marche. Tant que tu n'utilises pas de framework, tu peux lui donner même des accents, il y a pas de problème. Mais dès que vous utilisez les framework, c'est que les framework il il suppose que vous respectez les conventions parce que s'il y a pas de convention, vous allez il y a pas de framework facile. Est-ce que c'est clair ? Non. Bon, c'est comment euh comment on peut savoir les conventions ? parce que pour les les les fichiers de configuration, il il faut respecter le nom. Oui, mais les conventions, c'est très simple. Déjà Java, il faut il faut juste revenir sur les bases de Java. Vous avez d'abord une classe commence toujours par majuscule. Ça, il faut il faut jamais me mettre une classe avec P minuscule. Les attributs commencent par des majuscules. Quand il y a des séparateurs, on commence le le mot chaque le mot par le majuscule. C'est c'est des des des quelques règles de nommage euh très basique. Mais ça c'est l'origine de pas mal d'erreurs. Alors ça c'est pour le code Java. Mais après bon, il y a par exemple les packages. Regardez les packages. Est-ce que est-ce que vous allez trouver dans un package des majuscules ? Non. Aucune majuscule dans le nom du package. Des packages toujours en minuscule. S'il y a des séparateurs, vous les séparez par des points. Dans le package, on met pas des tiilles, on met pas de underscore, c'est des des règles de de de nommage. Donc en en résumé, si vous voulez régler, rappelez-vous bien les minuscules plutôt les packages toujours en minuscule, les variables, on commence toujours par une minuscule. Les classes et les interfaces, on commence toujours par une majuscule. C'est ça général. Si on utilise un peu alors euh c'est les règles de dommage, ils sont faites pour être parce que c'est un esprit, c'est un état d'esprit. Oui. C'est-à-dire si tu n'as pas l'habitude de respecter les règles de nommage, même si tu n'utilises pas de framework, tu vas pas le respecter si tu utilises les framework. C'est-à-dire dès que vous commencez à créer vos premières classe Java euh tu vois parce que je te dis parce que si vous achetez un les entreprises achètent un outil qui s'appelle son art qui coûte trop cher et ben son art chaque fois que vous faites un commit votre code il arrive vers son art son art il va faire l'audit des code et après il vous génère des rapports et ben il vous il vous dit voilà respectez les les commentaires. comment on écrit les commentaires. Donc tout ça, bah peut-être un jour on va s'arrêter sur la qualité de de du commentaire, comment faire les tests unitaires. Il y a pas mal de choses. Euh on va s'y arrêter un une fois, mais il faut d'abord qu'on avance un peu sur ces les éléments techniques. Voilà. Donc euh je pense qu'on va s'arrêter à ce niveau-là. Moi en tout cas mes batteries Ouais, il y a toujours des questions quand les batteries sont faibles. Oui. Bonsoir. Oui, bonsoir. Au fait pour moi, c'est pas une question, c'est juste pour vous demander soire de si par exemple pour nous le dimanche à venir ça sera une fête. Si ce dimanchea un cours le dimanche oui ça sera la pâque. Oui. Le dimanche prochain c'est ça ? Oui. Le dimanche le dimanche qui vient ou en fait comme les courses sont enregistrées donc voilà donc je vous expliquer un peu comment ça se passe et du coup donc le nous on gère les contraintes. Euh c'est pour le moment c'est très difficile d'éviter les les corps le dimanche. Pourquoi ? parce qu'on s'approche de la fin d'année et il y a il y a des cours qu'on doit terminer maintenant parce qu'il y a d'autres cours qui vont commencer comme euh les statistiques comme le le les bases de l'intelligence artificielle et il dit que donc il y a des cours qu'il faut qu'on termine et pour vous si vous ratez des cours c'est pas grave mais vous regardez classroom vous allez trouver l'enregistrement donc il y a pas de souci. OK ça marche. Merci. Il y a pas de souci. Voilà, bonne soirée et bonne journée, bon weekend, bon dimanche surtout pour ceux qui sont là. [Rires] Allez !
Get free YouTube transcripts with timestamps, translation, and download options.
Transcript content is sourced from YouTube's auto-generated captions or AI transcription. All video content belongs to the original creators. Terms of Service · DMCA Contact