Module JEE De la servlet aux Frameworks MVC

  • Slides: 42
Download presentation
Module JEE De la servlet aux Frameworks MVC

Module JEE De la servlet aux Frameworks MVC

Objectifs • Le protocole HTTP • Structure d’un projet Web • Les servlets •

Objectifs • Le protocole HTTP • Structure d’un projet Web • Les servlets • Java Server Page • Taglibs • Listener & Filter • Design Pattern MVC

Protocole HTTP Client Serveur GET /blogs. HTTP 1. 1 200 HTTP 1. 1 POST

Protocole HTTP Client Serveur GET /blogs. HTTP 1. 1 200 HTTP 1. 1 POST /blogs/. HTTP 1. 1 302 HTTP 1. 1 Location : /blogs/10 GET /blogs/10. HTTP 1. 1 200 HTTP 1. 1 Description d’une requête http • • • Une version : HTTP 1. 0 / HTTP 1. 1 Un protocole : http / https Un domaine: www. epsi. fr Une chemin : /epsi/bienvenue-a-lepsi/ Une méthode : • GET : pour récupérer une information un document / une ressource • POST : pour soumettre un formulaire / modification d’une ressource • PUT : permet d’ajouter une ressource • DELETE : pour supprimer un document • Et d’autres : PATCH, HEAD, CONNECT, TRACE

Structure d’un projet Web • Version Eclipse • Version Maven

Structure d’un projet Web • Version Eclipse • Version Maven

Servlet • Permet de créer dynamiquement du contenu au sein d’un conteneur Java •

Servlet • Permet de créer dynamiquement du contenu au sein d’un conteneur Java • Contenu le plus souvent au format html mais également xml, text, octets (transfert de fichiers) • Déclaration d’une servlet via l’utilisation de la classe « Http. Servlet »

Servlet – Cycle de vie Request Generic Servlet Http. Servlet Initialisation init do. Get

Servlet – Cycle de vie Request Generic Servlet Http. Servlet Initialisation init do. Get do. Post Response Exécution service do. Delete Destruction destroy do. Options do. Head do. Trace Une servlet est réutilisée par le conteneur Web pour traiter plusieurs appels http. Ne pas déclarer de propriétés en relation avec des données liés à un appel http.

Servlet - do. XXX • Méthodes appelées en fonction de la « méthode http

Servlet - do. XXX • Méthodes appelées en fonction de la « méthode http » • 2 paramètres : § § Http. Servlet. Request : récupération des données de la requete Http. Servlet. Response : permet de fournir des données en repo, nse

Servlet – Http. Servlet. Request Méthodes pour traiter la requête get. Parameter récupération des

Servlet – Http. Servlet. Request Méthodes pour traiter la requête get. Parameter récupération des paramètres de la requete get. Header récupération des entêtes http get. Input. Stream récupération du flux de données get. Cookies récupération des cookies Méthodes pour gérer le contexte get. Session récupération de la session du client. Permet de stockage de données pendant le delai de navigation de l’utilisateur get. Attribute Récupération de données transmises pendant l’execution d’une requete set. Attribute Permet de stocker une données pendant l’execution d’une requete get. Request. Dispatcher Permet de rediriger une requéte vers une autre servlet

Servlet - Http. Servlet. Response Méthodes principales get. Writer Récupération l’instance « Print. Writer

Servlet - Http. Servlet. Response Méthodes principales get. Writer Récupération l’instance « Print. Writer » permettant d’écrire des caractéres au client get. Output. Stream Permet d’écrire un flux d’octets au client send. Redirect Permet de rediriger le client vers une autre servlet ou page JSP Aucun code ne doit être exécuté après l’appel. send. Error Permet d’envoyer un code d ’erreur (avec un message) add. Cookie Permet d’ajouter un cookie au client add. Header Permet d’ajouter une entête http set. Status Permet d’indique le code http en réponse

Servlet - implémentation public class Hello. World. Servlet extends Http. Servlet { private static

Servlet - implémentation public class Hello. World. Servlet extends Http. Servlet { private static final long serial. Version. UID = 1 L; . 0 t 2 e l v r Se • Etendre la classe «Http. Servlet » • Déclarer dans le fichier « web. xml » Servlet avec son nom Mapping associé à la servlet <? xml version="1. 0" encoding="ISO-8859 -1"? > <web-app> <servlet> <servlet-name>Hello</servlet-name> <servlet-class>Hello. World. Servlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app> protected void do. Get(Http. Servlet. Request request, Http. Servlet. Response response) throws Servlet. Exception, IOException { response. get. Writer() . append("Bonjour ") . append(request. get. Parameter("name")) . flush(); } }

Servlet – Portée des objets Portée Description application Objets accessible par toutes les instances

Servlet – Portée des objets Portée Description application Objets accessible par toutes les instances de servlet session Objets accessibles pendant la durée de la session de l’utilisateur request Objets accessibles pendant la requête de l’utilisateur page. Context Objets accessibles par la page JSP

Servlet - implémentation. 0 t 3 e l v r Se • Etendre la

Servlet - implémentation. 0 t 3 e l v r Se • Etendre la classe «Http. Servlet » • Ajouter l’annotation « @Web. Servlet » @Web. Servlet( url. Patterns= {"/hello"}) public class Hello. World. Servlet extends Http. Servlet { protected void do. Get(Http. Servlet. Request request, Http. Servlet. Response response) throws Servlet. Exception, IOException { response. get. Writer() . append("Bonjour ") . append(request. get. Parameter("name")) . flush(); } }

Servlet - Limitation • Difficulté de produire du code html « lisible » •

Servlet - Limitation • Difficulté de produire du code html « lisible » • Code html lié au code Java : § § Intégration de code html en provenance d’une agence web difficile. Impossibilité de valider syntaxiquement le code html par les IDE type Eclipse • La servlet est plus destinée à interagir avec les couches métier. Java Server Page

JSP • Page html ayant l’extension «. jsp » et permettant d’éxècuter des éléments

JSP • Page html ayant l’extension «. jsp » et permettant d’éxècuter des éléments dynamiques à partir : § § § De scriptlets : code java directement intégré à la page. De taglibs : nouvelles balises interprétées par le conteneur Web et permettant de réaliser des traitements et de générer du code html Des expressions languages • Existence de nombreuses librairies de taglibs : § § § JSTL : Java Standard Taglibs Struts Spring (spring-security taglib) • Possibilité de créer de nouvelles taglibs

De la JSP à la Servlet transforme compile « en servlet » hello. jsp

De la JSP à la Servlet transforme compile « en servlet » hello. jsp hello_jsp. java hello_jsp. class Transformée en Servlet, une page jsp possède toutes les méthodes et propriétés d’une servlet

JSP : Accès aux propriétés • « request » : permet d’accéder à l’instance

JSP : Accès aux propriétés • « request » : permet d’accéder à l’instance « Http. Servlet. Request » . Manipulation des paramètres, des objets en portée « request » • « session » : permet d’accéder à la session de l’utilisateur via l’instance « Http. Session » • « out » : permet d’afficher des données • « response » : instance de « Http. Servlet. Response » , essentiellement utilisée pour ajouter des entêtes

JSP : Accès aux propriétés • « application » : instance de Servlet. Context.

JSP : Accès aux propriétés • « application » : instance de Servlet. Context. Représente l’application web. • « page. Context » : permet d’accéder à toutes les propriétés de la page jsp (request, session, application…) • « page » : permet d’accéder à l’instance de la page, dixit au this

JSP : Accès aux propriétés <%@page import="java. util. Collections"%> <% Integer count = session.

JSP : Accès aux propriétés <%@page import="java. util. Collections"%> <% Integer count = session. get. Attribute("count") == null ? 0: (Integer)session. get. Attribute("count"); response. add. Header("page", "hello. jsp"); session. set. Attribute("val 1", "1"); session. set. Attribute("count", ++count); %> <html> <body> <h 1>Bonjour <%=request. get. Parameter("name") %></h 1> <p><% out. print("Permet d'écrire dans la page JSP ! "); %></p> <p>Identifiant de session : <%= session. get. Id() %></p> <p>Nombre d'objets en session : <%=Collections. list(session. get. Attribute. Names()). size() %> <p>Nombre d'acces : <%=session. get. Attribute("count") %> <% page. Context. get. Out(). print("<p/>Acces au writer par le <i>page. Context</i></p>"); %> </body> </html>

JSP – Scriplets directives • Permettent de préciser des informations globales sur la page

JSP – Scriplets directives • Permettent de préciser des informations globales sur la page • 3 directives : § § § Page Include taglib

JSP – Scriplets directives « page » • Définit des caractéristiques sur la page

JSP – Scriplets directives « page » • Définit des caractéristiques sur la page JSP. • Chaque caractéristique est déclarée une seule fois sauf « import » <%@ page. Encoding="UTF-8" info="Page JSP Todo" content. Type="text/html; charset=UTF-8"%> <%@ page import="fr. nro. demoservlet. bean. To. Do. Bean"%> <%@ page import="java. util. List"%>

JSP – Scriplets directives « include » • Permet d’inclure un fichier dans une

JSP – Scriplets directives « include » • Permet d’inclure un fichier dans une page JSP • Fichier peut être un fragment d’une page JSP, html • L’inclusion est réalisée avant la page JSP incluant ne soit interprétée <html> <head> <link rel="stylesheet" href="css/bootstrap. min. css"> </head> <body> <%@ include file="bandeau. jsp"%> <div class="container">Liste de todos</div> </body> </html>c <nav class="navbar-expand-lg navbar-light bg-light"> <a class="navbar-brand" href="#">To. Do</a> <button class="navbar-toggler" type="button" d ata-toggle="collapse" data-target="#navbar. Nav" aria-controls="navbar. Nav" aria -expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> </nav>

JSP – Scriplets directives « taglib » • Permet l’utilisation d’une bibliothèque de tags

JSP – Scriplets directives « taglib » • Permet l’utilisation d’une bibliothèque de tags • 3 attributs : § § § prefix : alias pour utiliser la taglib uri : uri identifiant le fichier tld décrivant la taglib tagdir : lien vers le répertoire contenant le fichier de déclaration de la taglib

JSP – Scriplets directives « taglib » • Exemple avec la taglib core <%@

JSP – Scriplets directives « taglib » • Exemple avec la taglib core <%@ taglib prefix="c" uri="http: //java. sun. com/jstl/core_rt" %> <html> <head> <link rel="stylesheet" href="css/bootstrap. min. css"> </head> <body> <%@ include file="bandeau. jsp"%> <div class="container">Liste de todos</div> <ul class="list-group"> <c: for. Each items="${todos}" var="todo"> <li class="list-group-item"> <c: out value="${todo. label}"></c: out> </li> </c: for. Each> </ul> </body> </html>

JSP – tag de déclaration • Possibilité de déclarer des variables et des méthodes

JSP – tag de déclaration • Possibilité de déclarer des variables et des méthodes • Aucun sortie vers la page html générée <%! String message = "hello"; %> <%! int index = 0; %>

JSP - tag d’expression • Remplace le tag par l’évaluation de l’expression • Ecriture

JSP - tag d’expression • Remplace le tag par l’évaluation de l’expression • Ecriture du résultat vers le code html généré <%=todo. get. Label() %> <%=message %> Page <%=index %>

JSP – tag de scriplets • Permet d’insérer du code Java <% String message

JSP – tag de scriplets • Permet d’insérer du code Java <% String message = null; String val. Choisie = request. get. Parameter("nombre. Choisi"); if(val. Choisie!=null && val. Choisie. matches("\d+")){ Integer num. Choisi = Integer. parse. Int(val. Choisie); Integer num. Selection = (Integer)session. get. Attribute("nb"); if(num. Choisi == num. Selection){ message = "trouvé"; }else if( num. Choisi > num. Selection){ message = "trop grand"; }else{ message = "trop petit"; } } %> <form> <p><%= message%></p> <input type="number" name="nombre. Choisi"/> <input type="submit"> </form>

JSP – tag de commentaires • Permet d’insérer des commentaires • Contenu non interprété

JSP – tag de commentaires • Permet d’insérer des commentaires • Contenu non interprété par le moteur de JSP • Non restitués lors de la génération de la page html <%-- Commentaires non restitués au client --%>

Les tags d’actions • Permettent de réaliser des traitements courants § § § Inclusion

Les tags d’actions • Permettent de réaliser des traitements courants § § § Inclusion de pages JSP Forward vers un autre page Utilisation ou déclaration d’un bean • Introduites par le tag de la forme <jsp: nom. Action attribut*= « valeur » >

Les actions • jsp: include : permet d’inclure une page JSP • jsp: forward

Les actions • jsp: include : permet d’inclure une page JSP • jsp: forward : permet de rediriger vers une autre page • Jsp: use. Bean : permet d’utiliser ou d’instancier un objet. Utiliser fréquemment pour typer les objets • jsp: set. Property : permet de modifier une propriété d’un objet • jsp: get. Property : permet d’obtenir la valeur d’une propriété d’un objet

Les Expressions Languages • Permet d’éviter l’utilisation de « scriplets » • Les EL

Les Expressions Languages • Permet d’éviter l’utilisation de « scriplets » • Les EL permettent : § § De manipuler facilement les objets De réaliser des tests basiques et des opérations • Syntaxe ${ expression }

Les Expressions Languages <%@ page import="fr. demo. bean. User. Bean"%> <%@ taglib prefix="c" uri="http:

Les Expressions Languages <%@ page import="fr. demo. bean. User. Bean"%> <%@ taglib prefix="c" uri="http: //java. sun. com/jstl/core_rt"%> <%@ page import="java. util. *" is. ELIgnored="false"%> <jsp: use. Bean class="fr. demo. bean. User. Bean" id="user" /> <jsp: set. Property property="name" name="user" value="demo" /> <% page. Context. set. Attribute("user 2", null); page. Context. set. Attribute("marques", Arrays. as. List("Peugeot", "Citroen", "Renault", "BMW", "Porche")); %> <html> <body> Acces direct : ${user. name}<br /> Acces en precisant : ${page. Scope. user. name}<br /> Pas d'erreur en cas de null ${user 2. name} <br /> 1 ere marque : ${marques[0]} ${marques. get(0)}<br/> <ul> <c: for. Each items="${marques}" var="marque"> <li>${marque} : ${marque. starts. With("P") ? "OUI": "NON"}</li> </c: for. Each> </ul> </body> </html> Accès au propriété de l’objet (avec ou sans spécifiant la portée ) Evaluation protège contre Null. Pointer. Exception Syntaxe facile pour l’accès au liste, tableau Utilisation des méthodes et opérateur ternaire

JSTL • Java Standard Taglibs • Ensemble de taglibs encapsulant les fonctionnalités de base

JSTL • Java Standard Taglibs • Ensemble de taglibs encapsulant les fonctionnalités de base pour le développement de pages JSP • Permet d’éviter l’utilisation de code Java

JSTL Préfixe Description uri core Taglibs pour les itérations, conditions, manipulation de bean et

JSTL Préfixe Description uri core Taglibs pour les itérations, conditions, manipulation de bean et sortie vers le flux html. http: //java. sun. com/jstl/core fmt Taglibs pour le formatage et l’internationalisation http: //java. sun. com/jstl/fmt sql Taglibs pour la manipulation SQL http: //java. sun. com/jstl/sql x Taglibs pour la manipulation XML http: //java. sun. com/jstl/xml fn Taglibs embarquant des fonctions http: //java. sun. com/jstl/fmt A ne pas utiliser

JSTL : Mise en place OU • Ajouter les librairies § § standard-1. 1.

JSTL : Mise en place OU • Ajouter les librairies § § standard-1. 1. 2. jar jstl-1. 2. jar • Ajouter les dépendances pom. xml <dependency> <group. Id>jstl</group. Id> <artifact. Id>jstl</artifact. Id> <version>1. 2</version> </dependency> <dependency> <group. Id>taglibs</group. Id> <artifact. Id>standard</artifact. Id> <version>1. 1. 2</version> </dependency> • Déclarer les taglibs dans les pages jsp <%@ taglib prefix="c" uri="http: //java. sun. com/jstl/core"%> <%@ taglib prefix="fmt" uri="http: //java. sun. com/jstl/fmt" %>

JSTL : Exemple core Balise Description c: out Permet de faire un sortie vers

JSTL : Exemple core Balise Description c: out Permet de faire un sortie vers le flux html. c: if Permet d’afficher le contenu du corps de la balise si la condition est vraie c: choose Fonctionne comme un switch. Le corps de la balise doit contenir les balises c: when et c: otherwise c: when Sous tag de c: choose. Agit comme c: if. Affiche le contenu si la condition est vraie c: otherwise Sous tag de c: choose. Cas par defaut dans le cas où aucune balise c: when n’a été vérifiée c: for. Each Permet d’itérer sur une énumération, une liste ou une map. C: set Permet de stocker le résultat d’une expression dans un scope.

Listener « Ecouteur » permettant d’intercepter des évènements sur l’application Types de « listener

Listener « Ecouteur » permettant d’intercepter des évènements sur l’application Types de « listener » : • Création et destruction du contexte de l’application « Servlet. Context. Listener » • Création et destruction du contexte d’une requête « Servlet. Request. Listener » • Cycle de vie d’une session « Http. Session. Listener » et « Http. Session. Activation. Listener » • Suivi des attributs mis en session « Http. Session. Attribute. Listener » • Suivi des attributs mis dans la requête « Servlet. Request. Attribute. Listener » • Permet de détecter qu’un objet est ajouté ou supprimé de la session « Http. Session. Binding. Listener » • Initialiser le contexte d’un framework au démarrage de l’application (Ex : contexte spring) • Créer un écouteur permettant de mettre les objets en session dans une base de données en mémoire distribuée

Listener Servlet 2. 0 Servlet 3. 0 • Implémenter une des interfaces « Listener

Listener Servlet 2. 0 Servlet 3. 0 • Implémenter une des interfaces « Listener » public class Session. Detection. Listener implements Http. Session. Listener { • Implémenter une des interfaces « Listener » • Ajouter l’annotation « Web. Listener » private static final Logger LOGGER = Logger. Factory. get. Logger(Session. Detection. Listener. class); private Atomic. Integer session. Counter = new Atomic. Integer(0); public void session. Created(Http. Session. Event se) { LOGGER. info("Nouvelle session crée"); LOGGER. info("Nombre de sessions en cours : {}", session. Counter. increment. And. Get()); } public void session. Destroyed(Http. Session. Event se) { … } } • Déclarer le « listener » dans le fichier « web. xml » <listener> <listener-class>fr. nro. demoservlet. listener. Session. Detection. Listener </listener-class> </listener> @Web. Listener public class Session. Detection. Listener implements Http. Session. Listener { private static final Logger LOGGER = Logger. Factory. get. Logger(Session. Detection. Listener. class); private Atomic. Integer session. Counter = new Atomic. Integer(0); public void session. Created(Http. Session. Event se) { LOGGER. info("Nouvelle session crée"); LOGGER. info("Nombre de sessions en cours : {}", session. Counter. increment. And. Get()); } public void session. Destroyed(Http. Session. Event se) { /**. . . */ } }

Filter Intercepteur sur une servlet ou sur une url afin de tracer ou de

Filter Intercepteur sur une servlet ou sur une url afin de tracer ou de modifier le comportement de l’appel • Ajouter des marqueurs sur les traces « log » • Restreinte les accès aux servlets • Compléter automatiquement la requête (Ex: spécifier l’encodage, le content type)

Filter Servlet 2. 0 • Implémenter l’interface « Filter » public class Character. Encoding.

Filter Servlet 2. 0 • Implémenter l’interface « Filter » public class Character. Encoding. Filter implements Filter{ public void init(Filter. Config filter. Config) throws Servlet. Exception{} public void do. Filter(Servlet. Request request, Servlet. Response response, Filter. Chain chain) throws IOException, Servlet. Exception { final Http. Servlet. Response resp = (Http. Servlet. Response)response; resp. set. Content. Type("text/html"); chain. do. Filter(request, response); } public void destroy() {} } • Déclarer le « filter » dans le fichier « web. xml » <filter> <filter-name>character. Encoding</filter-name> <filter-class>fr. nro. demoservlet. filter. Character. Encoding. Filter </filter-class> </filter> <filter-mapping> <filter-name>character. Encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> Servlet 3. 0 • Implémenter l’interface « Filter » • Ajouter l’annotation « Web. Filter » @Web. Filter("/*") public class Character. Encoding. Filter implements Filter{ public void init(Filter. Config filter. Config) throws Servlet. Exception {} public void do. Filter(Servlet. Request request, Servlet. Response response, Filter. Chain chain) throws IOException, Servlet. Exception { final Http. Servlet. Response resp = (Http. Servlet. Response)response; resp. set. Content. Type("text/html"); chain. do. Filter(request, response); } public void destroy() {} } Dans les 2 cas, ne pas oublier d’appeler la méthode « chain. do. Filter » . Sinon, l’éxècution de la requête s’arrête

Architecture MVC • Design Pattern permettant de séparer les données, des traitements et de

Architecture MVC • Design Pattern permettant de séparer les données, des traitements et de leur représentation • Modèle § • Vue § représente les données manipulées ainsi que leur manipulation (validation, traitement, persistance) correspond à l’interface avec laquelle interagit l’utilisateur. La vue se sert du modèle pour créer l’interface utilisateur. • Contrôleur § prend en charge les actions de l’utilisateur. Il ne modifie pas les données mais appelle le modèle et d’inclure la vue correspondante

Architecture MVC 2 Contrôleur 3 Modèle Java. Bean / Service / DAO Servlet 5

Architecture MVC 2 Contrôleur 3 Modèle Java. Bean / Service / DAO Servlet 5 1 4 Vue JSP

Frameworks JEE / MVC • Java Server Faces § Framework JEE basé sur la

Frameworks JEE / MVC • Java Server Faces § Framework JEE basé sur la notion de composants souvent utilisé avec Primefaces. • Struts 1 et 2 § Framework MVC très populaires au début des années 2000. • Spring MVC § Framework MVC appartenant à l’ecosytéme Spring. Populaire en entreprise.