Module JEE De la servlet aux Frameworks MVC
- Slides: 42
Module JEE De la servlet aux Frameworks MVC
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 /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
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 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 » • 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 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 » 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 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 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 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 » • 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 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 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 « 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. 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. 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 • 3 directives : § § § Page Include taglib
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 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 • 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 <%@ 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 • 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 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 = 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é 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 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 : 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 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: //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 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 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. 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 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 » : • 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 » 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 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 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 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 1 4 Vue JSP
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.
- Servlet mcq
- Jee
- Executional framework in advertising
- List of theoretical frameworks
- Regional construction frameworks
- I hate frameworks
- Local development frameworks
- Parcc model content frameworks
- Early modern english verb conjugation
- Enterprise architecture proposal
- Arnoldo hax
- Interpretive framework examples
- Social studies toolkit
- What is a knowledge framework
- Nursing theories
- Software architecture frameworks
- Nursing informatics theories, models and frameworks
- 3 example of paragraph
- Slidetodoc
- Describe trust frameworks.
- Food security concepts and frameworks
- Beneficence
- Java ecommerce frameworks
- Types of interpretive frameworks
- Enterprise agile frameworks
- Net frameworks 4
- 5 keywords of hybridity art
- Actor frameworks
- Origence coaching varanasi
- Jaja joepie joepie jee
- Jee coaching in jaipur
- Jee service
- Best jee coaching in agra
- Renault 8 gordini
- C device module module 1
- Cos'è una servlet
- Servlet filter dispatcher
- Server.servlet.session.persistent
- Servlet url rewriting
- Servlet chaining
- Server.servlet.session.persistent
- Tomcat java servlet tutorial
- Java import javax