Architectures n-tiers et applications Web Outils Java et applications Web Servlets État d un servlet Les JSP Accès aux BD avec servlets Conception



Documents pareils
Web Tier : déploiement de servlets

Le développement d applications Web

HTTP 1.1. HyperText Transfer Protocol TCP IP ...

Traitement des données de formulaires. Accès aux BD avec JDBC Servlets - M. Baron - Page

TP JEE Développement Web en Java. Dans ce TP nous commencerons la programmation JEE par le premier niveau d une application JEE : l application web.

Les architectures 3-tiers Partie I : les applications WEB

Extension SSO Java. Cette note technique décrit la configuration et la mise en œuvre du filtre de custom SSO Java.

Le développement d applications Web. François Charoy Pascal Molli Pascal Urso

Jahia CMS ET Portal Version 5.0

Projet Java EE Approfondi

Groupe Eyrolles, 2005, ISBN :

Applications et Services WEB: Architecture REST

Architecture Orientée Service, JSON et API REST

Module Com231A - Web et Bases de Données Notion 5 : Formulaires et utilisation des Bases de Données avec PHP

JavaServer Pages (JSP)

Jacques Lonchamp. Conception. d applications en Java/JEE. Principes, patterns et architectures

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

Avant-propos 1. Avant-propos Organisation du guide À qui s'adresse ce guide?...4

Application Web et J2EE

24/11/2011. Cours EJB/J2EE Copyright Michel Buffa. Plan du cours. EJB : les fondamentaux. Enterprise Java Bean. Enterprise Java Bean.

WEBSERVICES. Michael Fortier. Master Informatique 2ème année. A308, Université de Paris 13

Utilisation de Jakarta Tomcat

Institut Supérieur de Gestion. Cours pour 3 ème LFIG. Java Enterprise Edition Introduction Bayoudhi Chaouki

Module BD et sites WEB

1. Installation d'un serveur d'application JBoss:

Compte Rendu d intégration d application

Mise en œuvre des serveurs d application

Documentation CAS à destination des éditeurs

Outil de planification en ligne pour des créations de rendez-vous ou de sondage

4. SERVICES WEB REST 46

Classe ClInfoCGI. Fonctions membres principales. Gestion des erreurs

Grenoble INP Genie Industriel G-SCOP Université Joseph Fourier CNRS. Stages d excellence L2 Mathématiques Informatiques

Types d applications pour la persistance. Outils de développement. Base de données préexistante? 3 modèles. Variantes avec passerelles

Aspects techniques : guide d interfaçage SSO

Manuel d'installation

Programmer en JAVA. par Tama

Création de formulaires interactifs

Application web de gestion de comptes en banques

Java pour le Web. Cours Java - F. Michel

Architectures client/serveur

HYPERPLANNING EST UN LOGICIEL INDEX EDUCATION

Application de lecture de carte SESAM-Vitale Jeebop

Présentation du cours. Sécurité dans Java EE. Plan (1/2) Plan (2/2) Généralités sur la sécurité

Environnements de Développement

CREATION d UN SITE WEB (INTRODUCTION)

Patrons de conception [Krakowiak06]

Cours en ligne Développement Java pour le web

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Le Modèle de Sécurité dans JAVA

A DESTINATION DES SERVICES TIERS. Editeurs d applications et ressources pédagogiques connectées à l ENT

Pour plus de détails concernant le protocole TCP conférez vous à la présentation des protocoles Internet enseignée pendant.

TP JAVASCRIPT OMI4 TP5 SRC

Groupe Eyrolles, 2003 ISBN : X

Dossier Technique. Détail des modifications apportées à GRR. Détail des modifications apportées à GRR Le 17/07/2008. Page 1/10

Cours Master Recherche RI 7 Extraction et Intégration d'information du Web «Services Web»

Formation Webase 5. Formation Webase 5. Ses secrets, de l architecture MVC à l application Web. Adrien Grand <jpountz@via.ecp.fr> Centrale Réseaux

Java - MySQL. Code: java-mysql

Attaques applicatives

Messagerie asynchrone et Services Web

Utilisation de JAVA coté Application serveur couplé avec Oracle Forms Hafed Benteftifa Novembre 2008

Bases Java - Eclipse / Netbeans

Apprendre la Programmation Orientée Objet avec le langage Java (avec exercices pratiques et corrigés)

Introduction. PHP = Personal Home Pages ou PHP Hypertext Preprocessor. Langage de script interprété (non compilé)

Introduction aux «Services Web»

CAS, un SSO web open source. 14h35-15h25 - La Seine A

les techniques d'extraction, les formulaires et intégration dans un site WEB

Alfstore workflow framework Spécification technique

Hébergement de site web Damien Nouvel

Tutoriel d installation de Hibernate avec Eclipse

Java Licence professionnelle CISII,

Java Naming and Directory Interface

Info0604 Programmation multi-threadée. Cours 5. Programmation multi-threadée en Java

Bases de Données et Internet

Cloud. Définition? 08/11/2012. James Urquhart The Wisdom of Clouds

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Sécurité des sites Web Pas un cours un recueil du net. INF340 Jean-François Berdjugin

Une introduction à la technologie EJB (2/3)

Formulaire pour envoyer un mail

Création d une application JEE

Remote Method Invocation Les classes implémentant Serializable

Tutoriel: Création d'un Web service en C++ avec WebContentC++Framework

COMPRENDRE L ARCHITECTURE DES WEB SERVICES REST. Amosse EDOUARD, Doctorant

Les services usuels de l Internet

Création d un service web avec NetBeans 5.5 et SJAS 9

TP1 : Initiation à Java et Eclipse

Internet. DNS World Wide Web. Divers. Mécanismes de base Exécution d'applications sur le web. Proxy, fire-wall

Mise en oeuvre d un intranet à partir de logiciels Open Source avec intégration des certificats numériques et login unique

Cedric Dumoulin (C) The Java EE 7 Tutorial

Méta-annuaire LDAP-NIS-Active Directory

Installation d un serveur HTTP (Hypertext Transfer Protocol) sous Débian 6

CQP Développeur Nouvelles Technologies (DNT)

NFP 121. Java et les Threads. Présentation : Thierry Escalarasse Mai 2007

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

Calcul Parallèle. Cours 5 - JAVA RMI

Cours CCNA 1. Exercices

Devenez un véritable développeur web en 3 mois!

INITIATION AU LANGAGE JAVA

Architectures Web Services RESTful

Transcription:

Plan 93 Architectures n-tiers et applications Web Outils Java et applications Web Servlets État d un servlet Les JSP Accès aux BD avec servlets Conception

Application Web en Java 94 Intérêts de Java et Java EE solution portable solution sécurisée solution standardisée Application Web: assemblage de composants, de contenu et de fichiers de configuration Environnement d exécution: Web container Archive WAR (Web Application Archive) contient tous les fichiers de l application Web contient un fichier de déploiement en XML (optionnel en JEE 6/7 suivant le contexte)

Application Web en Java (cont.) 95 Spécifications de Java EE: contrat entre le conteneur Web et les composants pour définir le cycle de vie des composants pour définir le comportement des composants pour définir les services que le serveur offre aux composants Deux types de composants Web dans la spécification Java EE les Servlets les JSP (Java Server Pages)

Plan 96 Architectures n-tiers et applications Web Outils Java et applications Web Servlets État d un servlet Les JSP Accès aux BD avec servlets Conception

Servlet: en image 97 HTTP request HTTP response Web server HTTP request HTTP response Extended HttpServlet Crée Exécute Business Logic HTML pages Web container Tiers Web

Servlet: introduction 98 Composant de l architecture Java EE Classe compilée qui s exécute dans un conteneur de servlets (Glassfish par exemple) hébergé par le serveur Permet d étendre les fonctionnalités du serveur Web Écrit en Java: indépendant de la plate-forme/du serveur Semblable à d autres technologies/frameworks CGI, RoR (Ruby), Grails (Groovy), Zend, Symfony (PHP), Play (Java)

Servlet: introduction (cont.) 99 Avantages efficacité utilise des threads plutôt que des processus (CGI) pratique librairie très développée (moins que PHP, mais plus cohérente) portable déployable quelque soit le serveur (ou presque) sécurisé fonctionne dans une machine virtuelle (plus facilement maîtrisable) peu cher existence de nombreux serveurs gratuits

Servlet: à quoi cela sert? 100 Router les requêtes Exécuter un traitement

Servlet: fonctionnement 101 Association URL(s) / servlet Lecture des données envoyées par le client données explicites (formulaire) données implicites (Request Header) Exécution du servlet par le conteneur Génération et envoi de la réponse au client données explicites (HTML/XML) données implicites (Response Header, Status Code)

Un exemple 102 import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWWW extends HttpServlet {! public void doget(httpservletrequest req, HttpServletResponse res)!!! throws ServletException, IOException {! } } API à importer HelloWWW est un objet de type HttpServlet res.setcontenttype("text/html"); PrintWriter out = res.getwriter(); out.println("<!doctype HTML PUBLIC \"-//W3C//DTD HTML 4.0 " + "Transitional//EN\">\n" + "<HTML>\n" + "<HEAD><TITLE>Hello WWW</TITLE></HEAD>\n" + "<BODY><H1>Hello WWW</H1>\n" +"</BODY></HTML>"); Réponse au format HTML Redéfinition de doget pour traiter une requête GET

Servlet: l API 103 2 packages importants javax.servlet package générique indépendant des protocoles javax.servlet.http spécifique à HTTP permet la gestion des sessions Les classes 2 classes abstraites javax.servlet.genericservlet (indépendante du protocole) javax.servlet.http.httpservlet (spécifique à HTTP) qui implantent 2 interfaces javax.servlet.servlet javax.servlet.servletconfig pour le protocole HTTP

La classe GenericServlet 104 javax.servlet.genericservlet indépendant des protocoles réseaux classe abstraite (une implantation de base de l interface Servlet) Trois méthodes init() service() destroy() point d entrée principal méthode abstraite qui doit être implantée par la sous-classe

Structure de base d un servlet 105 import javax.servlet.*; public class First extends GenericServlet {! public void init(servletconfig config)!! throws ServletException {!...! }! public void service(servletrequest req, ServletResponse rep)!! throws ServletException, IOException {!...! }! public void destroy() {!...! } }

Communiquer avec le client 106 Deux arguments pour la méthode service() javax.servlet.servletrequest encapsule la requête du client contient le flux d entrée et les données en provenance du client javax.servlet.servletresponse contient le flux de sortie pour répondre au client Développer des HttpServlet javax.servlet.http.httpservlet c est la classe que nous utiliserons! hérite de GenericServlet et fournit une implantation spécifique à HTTP de l interface Servlet

HttpServlet: la méthode service() 107 HttpServlet surcharge la méthode service() lit la méthode HTTP (GET, POST, ) de la requête transmet la requête à la méthode appropriée pour traitement Correspondance méthode HTTP/méthode handler public void doxxx(httpservletrequest req, HttpServletResponse rep) Un servlet est une sous-classe de HttpServlet et on surcharge la ou les méthodes doxxx() nécessaires requête GET, HEAD: doget() requête POST: dopost() requête PUT: doput()

Structure de base d un servlet Http 108 import javax.servlet.*; import javax.servlet.http.*; public class SimpleServlet extends HttpServlet {! public void init(servletconfig config)!! throws ServletException {!...! }! public void doget(httpservletrequest req, HttpServletResponse rep)!! throws ServletException, IOException {!...! }! public void destroy() {!...! }! public String getservletinfo() { } }

Structure de base d un servlet Http (cont.) 109 Détail de la méthode doget()! public void doget(httpservletrequest req,!!!!!!!!!!! HttpServletResponse rep)!! throws ServletException, IOException {!!!! // Lire la requête du client Objet requête Objet réponse!!! // La traiter!!! // Répondre! }

Lire la requête du client 110 HttpServletRequest hérite de ServletRequest encapsule la requête HTTP et fournit des méthodes pour accéder à toutes les informations contient les informations sur l environnement du serveur Méthodes de HttpServletRequest String getmethod(): retourne la méthode HTTP String getheader(string name): retourne le paramètre name de l entête HTTP de la requête String getremotehost(): retourne le nom d hôte du client String getremoteaddr(): retourne l adresse IP du client

Lire la requête du client (cont.) 111 Méthodes (suite) String getparameter(string name): retourne la valeur d un champ de formulaire Enumeration getparameternames(): retourne tous les noms des paramètres String getservername(): retourne le nom du serveur String getserverport(): retourne le port sur lequel le serveur écoute

Répondre au serveur 112 HttpServletResponse hérite de ServletResponse utilisé pour construire un message de réponse HTTP renvoyé au client contient les méthodes nécessaires pour définir: le type de contenu, l entête, et le code de retour contient un flux de sortie pour envoyer des données (HTML ou XML ou autre) au client Méthodes de HttpServletResponse void setstatus(int statuscode): définit le code de retour de la réponse void setheader(string name, String value): définit la valeur de l entête name

Répondre au serveur (cont.) 113 Méthodes (suite) void setcontenttype(string type): définit le type MIME du contenu PrintWriter getwriter(): pour envoyer des données texte au client ServletOutputStream getoutputstream(): flux pour envoyer des données binaires void sendredirect(string url): redirige le client vers l URL On peut renvoyer du HTML rediriger vers une page donnée faire une action (upload/download, )

Cycle de vie d un servlet 114 ➀ Chargement spécifié lors du déploiement Web container Servlet.class ➁ Initialisation init() spécifié lors du déploiement Web container Servlet.class ➂ Traitement de 1 à n requêtes service() ➃ Destruction destroy() Client Client Web container Servlet.class Web container Servlet.class l état est conservé entre les requêtes arrêt du serveur,

Cycle de vie d un servlet: initialisation 115 init() une fois crée, le servlet est initialisé avec cette méthode elle n est appelée qu une seule fois par le serveur similaire à un constructeur on peut y placer les connexions réseaux les connexions BD la récupération des paramètres d initialisation la récupération des paramètres de contexte de l application

Cycle de vie d un servlet: initialisation (cont.) 116 WEB-INF/web.xml <servlet> <servlet-name>monservlet</servlet-name> <servlet-class>monapp.servlets.monservlet</servlet-class> <init-param>! <param-name>langue</param-name>! <param-value>fr</param-value> </init-param> <init-param>! <param-name>devise</param-name>! <param-value>eur</param-value> </init-param> </servlet> Code public class MonServlet extends GenericServlet {! public void init(servletconfig config) throws ServletException {!! super.init(config);!! out.println( Servlet init parameters: );!! Enumeration e = getinitparameternames();!! while (e.hasmoreelements()) {!!! String key = (String)e.nextElement();!!! String value=getinitparameter(key);!!! out.println( + key + = + value);!! }!! }

Cycle de vie d un servlet: initialisation (cont.) 117 En JEE 7: package monapp.servlets.monservlet; @WebServlet(name="MonServlet", urlpatterns={...}, initparams={ @WebInitParam(name="langue", value="fr"), @WebInitParam(name="devise", value="eur") } ) public class MonServlet extends GenericServlet {! public void init(servletconfig config) throws ServletException {!! super.init(config);!! out.println( Servlet init parameters: );!! Enumeration e = getinitparameternames();!! while (e.hasmoreelements()) {!!! String key = (String)e.nextElement();!!! String value=getinitparameter(key);!!! out.println( + key + = + value);!! }!! }

Cycle de vie d un servlet: initialisation (cont.) 118 WEB-INF/web.xml Code <context-param>! <param-name>langue</param-name>! <param-value>fr</param-value>! <description>paramètre de contexte</description> </context-param> public class MonServlet extends GenericServlet {! public void init(servletconfig config) throws ServletException {!! super.init(config);!! out.println( Context init parameters: );!! ServletContext sc = getservletcontext();!! Enumeration e = sc.getinitparameternames();!! while (e.hasmoreelements()) {!!! String key = (String)e.nextElement();!!! Object value = sc.getinitparameter(key);!!! out.println( + key + = + value);!! }!! }

Cycle de vie d un servlet: traitement 119 service() appelée automatiquement par le serveur à chaque requête dispatch en fonction du type de requête (GET/POST) Utilisation des méthodes de HttpServletRequest Exemple http://localhost/exemples/servlets/traceservlet/tutu?toto=titi getmethod() GET getpathinfo() /tutu getquerystring() toto=titi getrequesturi() /exemples/servlets/traceservlet/tutu getservletpath() /servlets/traceservlet getcontextpath() /exemples

Cycle de vie d un servlet: destruction 120 destroy() destruction du servlet appelée qu une seule fois quand le servlet est déchargé par le serveur, ou quand le serveur est arrêté on y place la fermeture des connexions réseaux, BD

Cycle de vie d un servlet: concurrence 121 Un servlet gère les requêtes de plusieurs clients: un thread est généré à chaque requête Conséquence: problème de concurrence d accès les attributs du servlet sont partagés les méthodes accèdent à des ressources partagées Pour les portions critiques synchroniser les accès à la ressource (synchronized) implanter l interface SingleThreadModel le moteur de servlet crée un pool d objets servlets, et le servlet ne répond aux requêtes que d un seul client à la fois public class ExempleServlet extends HttpServlet! implements SingleThreadModel { }

Traitement de données 122 Un formulaire HTML permet de saisir les données mécanisme pour envoyer les données au serveur Web Rappel: les balises FORM : pour définir un formulaire INPUT : pour définir un élément d interface text, password, checkbox, radio, submit, reset TEXTAREA : zone de texte sur plusieurs lignes SELECT : liste déroulante

Traitement des données (cont.) 123 Attributs de <FORM> action: URL où envoyer les données method: méthode à utiliser pour l envoi (GET/POST) Les données sont envoyées lorsque l on clique sur un bouton de type submit <FORM METHOD= POST! ACTION= http://host/servlet/demandeservlet > Nom: <INPUT type= text name= Nom /> <BR> <INPUT type= submit valeur= Envoyer /> </FORM>

Traitement des données (cont.) 124 Les méthodes GET et POST GET les champs du formulaire sont ajoutés à l URL de l attribut ACTION forme nom=valeur POST URL?nom1=val1&nom2=val2& les données sont passées dans le corps du message HTTP envoi de données binaires par exemple

Traitement des données (cont.) 125 Lecture des données méthode String getparameter(string name) dans le formulaire <INPUT type= text name= nom /> dans la méthode doxxx() String n = req.getparameter( nom ); Exemple de lecture des paramètres

Traitement des données (cont.) 126 import javax.servlet.*; import javax.servlet.http.*; import java.util.*; public class AfficheParam extends HttpServlet {! public void doget(httpservletrequest request,!!!!!!!!! HttpServletResponse response)!!!!! throws ServletException, IOException {!! response.setcontenttype("text/html");!! PrintWriter out = response.getwriter();!! out.println("<head>\n <TITLE>Paramètres</TITLE>\n </HEAD>\n"!!! +"<BODY>\n" + "<H1 ALIGN=CENTER>Les paramètres</h1>\n"!!! + "<UL>\n "!!! + "<LI>param1: "+ request.getparameter("param1") + "\n"!!! + "<LI>param2: "+ request.getparameter("param2") + "\n"!!! + "<LI>param3: "+ request.getparameter("param3") + "\n"!!! + "</UL>\n" + "</BODY>"); }

Traitement des données issues d un formulaire 127 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML><HEAD><TITLE>Formulaire avec la méthode POST</TITLE></HEAD> <BODY> <H1 ALIGN="CENTER">Formulaire à remplir</h1> <FORM ACTION="/Formulaire/AfficheFormulaire" METHOD="POST"> Référence: <INPUT TYPE="TEXT" NAME="ref"><BR> Description: <INPUT TYPE="TEXT" NAME="description"><BR> Prix: <INPUT TYPE="TEXT" NAME="prix" VALUE="0"><BR> <HR> Nom: <INPUT TYPE="TEXT" NAME="nom"><BR> Prénom: <INPUT TYPE="TEXT" NAME="prenom"><BR> Adresse: <TEXTAREA NAME="adresse" ROWS=3 COLS=40></TEXTAREA><BR> Carte bancaire:<br> <INPUT TYPE="RADIO" NAME="typeCarte" VALUE="Visa">Visa<BR> <INPUT TYPE="RADIO" NAME="typeCarte" VALUE="MasterCard">MasterCard<BR> <INPUT TYPE="RADIO" NAME="typeCarte" VALUE="Amex">American Express<BR> Numéro: <INPUT TYPE="PASSWORD" NAME="numCarte"><BR> Confirmation du numéro: <INPUT TYPE="PASSWORD" NAME="numCarte"><BR><BR> <CENTER><INPUT TYPE="SUBMIT" VALUE="Valider"></CENTER> </FORM> </BODY></HTML>

Traitement des données issues d un formulaire 128 import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.*; public class AfficheFormulaire extends HttpServlet { public void doget(httpservletrequest req, HttpServletResponse rep) throws ServletException, IOException { rep.setcontenttype("text/html"); PrintWriter out = rep.getwriter(); String doctype = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 " + "Transitional//EN\">\n"; String titre = "Liste des paramètres"; out.println(doctype + "<HTML>\n" + "<HEAD><TITLE>" + titre + "</TITLE></HEAD>\n" + "<BODY>\n" + "<H1 ALIGN=CENTER>" + title + "</H1>\n" + "<TABLE BORDER=1 ALIGN=CENTER>\n" + "<TR BGCOLOR=\"#eeeeee\">\n" + "<TH>Nom<TH>Valeur"); Enumeration nomparams = req.getparameternames();

Traitement des données issues d un formulaire 129 } while(nomparams.hasmoreelements()) { String nomparam = (String)nomParams.nextElement(); out.print("<tr><td>" + nomparam + "\n<td>"); String[] valeurparams = req.getparametervalues(nomparam); if (valeurparams.length == 1) { String valeurparam = valeurparams[0]; if (valeurparam.length() == 0) out.println("<i>pas de valeur</i>"); else out.println(valeurparam); } else { out.println("<ul>"); for(int i=0; i<valeurparams.length; i++) { out.println("<li>" + valeurparams[i]); } out.println("</ul>"); } } out.println("</table>\n</body></html>"); } public void dopost(httpservletrequest req, HttpServletResponse rep) throws ServletException, IOException { doget(request, response); }

Une application Web en Java EE 130 Une application Web contient l ensemble des classes l ensemble des librairies nécessaires (parser XML, ) les pages HTML les pages JSP le fichier de déploiement (optionnel en JEE 6/7) Elle est stockée dans un fichier d archive WAR Elle est déployée simplement sur le serveur

Une application Web en Java EE: structure 131 L application est située dans un répertoire qui possède une structure donnée Répertoire de l application Classes des servlets Fichiers de présentation (html, jsp, ) Librairies (jar, ) Fichier de configuration (optionnel en JEE 6/7)

Une application Web en Java EE: web.xml 132 Le fichier web.xml donne les instructions concernant le déploiement du servlet dans le conteneur web-app description de l application Web servlet relation entre le nom du servlet et la classe qui l implante servlet-mapping Optionnel en JEE 6/7! relation entre le nom du servlet et l URL qui permet d y accéder possibilité d avoir plusieurs chemins différents

Une application Web en Java EE: web.xml (2) 133 La description d une application Web se trouve entre <web-app> et </web-app> Configuration du servlet grâce à l élément <servlet> <icon>test.gif</icon>: optionnel <servlet-name>test</servlet-name>: utilisé comme référence pour la définition du servlet <display-name>servlet de test</display-name>: optionnel <description>blabla</description>: optionnel <servlet-class>servlet.testservlet</servlet-class>: classe d implantation <jsp-file>jsp/test.jsp</jsp-file>: fichier JSP associé <init-param>: paramètre d initialisation <security-role-ref>: autorisations sur le servlet

Une application Web en Java EE: web.xml (3) 134 Un servlet peut avoir des paramètres d initialisation Ils peuvent être modifiés sans avoir à recompiler l application Utilisation avec la méthode javax.servlet.servletconfig.getinitparameter() Exemple <init-param>! <param-name>valeurtest</param-name>! <param-value>12</param-name>! <description>une valeur pour mon servlet</description> </init-param>

Une application Web en Java EE: web.xml (4) 135 Le servlet mapping permet de construire la relation entre un servlet et son URL d accès <servlet-mapping>! <servlet-name>test</servlet-name>! <url-pattern>/test/*</url-pattern> </servlet-mapping> Tous les URLs correspondant à http://host/webapp/urlpattern exécuteront le servlet Exemples http://host/webapp/test/*.do http://host/webapp/test http://host/webapp/test/cours/test/* Serveur Contexte Chemin

Une application Web en Java EE: web.xml (5) 136 Paramètres de sécurité Permet de lier un nom de rôle au nom de rôle utilisé en dur dans le servlet pour la sécurité Cela permet d éviter la modification du code du servlet pour l adapter à l environnement <security-role-ref>! <role-name>monadmin</role-name>! <role-link>admin</role-link> </security-role-ref>

Une application Web en Java EE: web.xml (6) 137 <?xml version="1.0" encoding="utf-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://java.sun.com/xml/ns/javaee http:// java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name>mon Hello World Servlet</display-name> <servlet> <servlet-name>helloworld</servlet-name> <servlet-class>helloworldservlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>helloworld</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app>

Une application Web en Java EE: web.xml (7) 138 Annotations disponibles en JEE 6/7: @WebServlet: pour définir un servlet @WebFilter: pour définir un filtre @WebListener: pour définir un Listener @WebInitParam: pour définir un paramètre à l initialisation @ServletSecurity: pour configurer la sécurité @MultipartConfig: chargement de fichiers Possibilité de surcharger les valeurs dans le web.xml

Annotation @WebServlet 139 @WebServlet: définit un servlet Doit hériter de HttpServlet Attributs: name value urlpatterns: obligatoire! loadonstartup initparams asyncsupported smallicon, largeicon description displayname

Annotation @WebFilter 140 @WebFilter: définit un filtre Possibilité d enregistrer dynamiquement lors de l initialisation du ServletContext un servlet ou un filtre ServletRegistration.Dynamic dynamic = servletcontext.addservlet(...); dynamic.addmapping(...); Attributs: urlpatterns initparams filtername servletnames urlpatterns dispatchertypes @WebFilter( /path ) public class MonFiltre implements Filter { public void dofilter( HttpServletRequest req, HttpServletResponse res) {... } }

Annotation @WebListener 141 @WebListener: définit un listener @WebListener public class MonListener implements ServletContextListener {! public void contextinitialized(servletcontextevent sce) {!!...! } } Attribut: value: description du listener

Annotation @ServletSecurity 142 @ServletSecurity: définit des contraintes de sécurité Support pour l authentification, login et logout Attention: attaché à une classe! @WebServlet(name= MonServlet, urlpatterns={"/path1", "/path2"}) @ServletSecurity(@HttpConstraint(rolesAllowed={"user", "guest"}), httpmethodconstraints=@httpmethodconstraint("post", rolesallowed={"admin"})) public class MonServlet extends HttpServlet {... Attribut: httpmethodconstraint value

Annotation @MultipartConfig 143 @MultipartConfig: support natif du chargement de fichiers Gestion native des requêtes de type "mime/multipart" upload de fichiers depuis des formulaires En utilisant @MultipartConfig sur la classe servlet, on dispose d une API similaire à celle de Commons FileUpload Collection<Part> parts = request.getparts() for (Part part : parts) { part.getname(); part.getsize(); part.getinputstream(); }

Extensibilité 144 Modularité de web.xml web-fragment.xml Possibilité d intégrer des bibliothèques fichiers jar dans le répertoire META-INF de WEB-INF/lib le serveur recherche et fusionne les fragments Intéressant pour servlets, filtres, listeners <web-fragment> <servlet> <servlet-name>welcome</servlet-name> <servlet-class>welcomeclass</servlet-class> </servlet> <servlet-mapping> <servlet-name>welcome</servlet-name> <url-pattern>/welcome</url-pattern> </servlet-mapping>... </web-fragment> <web-fragment> <filter> <filter-name>filtre.helloworld</filter-name> <filter-class>lpro.monfiltre</filter-class> <init-param>...</init-param> </filter> <filter-mapping> <filter-name>filtre.helloworld</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-fragment>

Extensibilité (cont.) 145 Problème de l inter-dépendance et des conflits possibilité de fixer un ordre de chargement web.xml peut déclarer un ordre d intégration des fragments découverts <absolute-ordering> Les fragments peuvent aussi déclarer leurs contraintes ordre relatif: <ordering> <before> et <after> ignoré si <absolute-ordering> est spécifié <others/> pour les fragments découverts mais non répertoriés

Extensibilité (cont.) 146 Synthèse web.xml web-fragment.xml Location WEB-INF of the war file META-INF directory of JAR file inside WAR file s WEB-INF/lib Ordering related element <absolute-ordering> <ordering> Ordre absolu dans web.xml Ordre dans web-fragment.xml web-fragment> <name>a</name>... <ordering> <before> <others/> </before> </ordering> </web-fragment> <web-app>... <absolute-ordering> <name>a</name> <others/> <name>b</name> <absolute-ordering> </web-app> <web-fragment> <name>b</name>... <ordering> <after> <name>a</name> </after> <before> <others/> </before> </ordering> </web-fragment>

Extensibilité (cont.) 147 Nouvelle API Ajout de composants/accès à la liste des composants addservlet(string servletname) addservlet(string classname) addservlet(class<?> servletclass) addservlet(servlet servlet) setloadonstartup(boolean loadonstartup) setservletsecurity, setmultipartconfig... Le code utilisant l API doit être exécuté avant que l application ne soit chargée

Async 148 Problème du cyle requête/réponse classique le thread de communication avec le client est maintenu ouvert tout le temps de traitement de la requête peut être très long! Solution proposée: servlet à traitement asynchrone Déclaration annotation: @WebServlet(asyncSupported=true) Attention! il faut gérer le timeout soi-même settimeout()

Async (cont.) 149 Utilisation la méthode startasync() renvoie un AsyncContext AsyncContext ctx = ServletRequest.startAsync(req, res) AsyncContext représente la requête détachée de la couche transport on peut utiliser alors dispatch(string path) start(runnable action) il faut clore explicitement la requête AsyncContext.complete() Contrainte majeure: il faut que toute la chaîne (filtres, listeners) soit asynchrone!

Async API 150 ServletRequest.isAsyncSupported() vrai si TOUT [filtres servlets] supportent le mode asynchrone dans la chaîne des filtres la chaîne de dispath de la requête configuré via: web.xml ou annotation ou API AsyncContext ServletRequest.startAsync appel par le servlet filtre réponse non automatique à la fin de la méthode ou du filtre

Async API (cont.) 151 AsyncContext.dispatch() appelé par un gestionnaire asynchrone réponse générée par [Servlet Filtre] en utilisant le pool de thread du conteneur JSP, JSF ou le framework utilisé AsyncContext.complete() appelé par un gestionnaire asynchrone ou un conteneur génération de la réponse

Async: exemple 152 @WebServlet(name="AsyncServlet", urlpatterns={"/asyncservlet"}, asyncsupported=true) public class AsyncServlet extends HttpServlet { protected void doget(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { response.setcontenttype("text/html;charset=utf-8"); try { System.out.println("Exécution de doget"); AsyncContext ac = request.startasync(); ac.addlistener(new AsyncListener() { public void oncomplete(asyncevent event) throws IOException {System.out.println("onComplete");} public void ontimeout(asyncevent event) throws IOException {System.out.println("onTimeout");} public void onerror(asyncevent event) throws IOException {System.out.println("onError");} public void onstartasync(asyncevent event) throws IOException {System.out.println("onStartAsync");} }); System.out.println("Je suis dans doget..."); // Start another service ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(10); executor.execute(new MyAsyncService(ac)); } System.out.println("Encore des trucs à faire dans doget..."); } finally { } } class MyAsyncService implements Runnable { AsyncContext ac; } public MyAsyncService(AsyncContext ac) { this.ac = ac; System.out.println("Dispatché vers " + "\"MyAsyncService\""); } public void run() { System.out.println("Traitement très long dans \"MyAsyncService\""); ac.complete(); } Exécution de doget Dispatché vers "MyAsyncService" Je suis dans doget doget... Encore des trucs à faire dans doget... Traitement très long dans "MyAsyncService" oncomplete