58
The Server strikes back Servlet, jsp, web server and so on

ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

Embed Size (px)

Citation preview

Page 1: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

The Serverstrikes back

Servlet, jsp, web server and so on

Page 2: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

La ServletThe Web War

Je dois obéir à mon maître Perl

Tu souséstime le pouvoir de CGI

Ton simple language est bien faible comparé au coté obscur de Perl

Robuste je suis grâce à Java

Toujours en mouvement le Web est

Du conteneur émane l'énergie de la Servlet

Page 3: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

La ServletGénéralitée

La Servlet est une classe Java permettant de créer dynamiquement des données au sein d'un serveur HTTP.Une instance unique de la Servlet s'execute à chaque requête HTTP reçu par le conténeur (Serveur Web).Elle produit du code (HTML, XML, JS...) compréhensible par un navigateur Web.

● Crée en 1997 (v1.0) par Sun Microsystems● la servlet est un singleton● interface définie dans le package javax.servlet● normée par une JSR (Java Specification Requests)● support natif dans un conténeur web java (Tomcat, Jetty, etc...)

Page 4: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

La ServletHistorique

Servlet 3.0 12/2009 JavaEE/SE 6 Async Servlet, File Uploading

Tomcat 7.x, Jetty 8.x

Servlet 2.5 09/2005 JavaEE/SE 5 Ajout des annotations Tomcat 6.x, Jetty 6.x-7.x

Servlet 2.4 11/2003 J2EE 1.4, J2SE 1.3 XML Schema pour le web.xml

Tomcat 5.x, Jetty 5.x

Servlet 2.3 08/2001 J2EE 1.3, J2SE 1.2 Gestion des filtres Tomcat 4.x, Jetty 4.x

Servlet 2.2 08/1999 J2EE 1.2, J2SE 1.2 Intégration dans J2EE Tomcat 3.x, Jetty 3.x

Servlet 2.1 11/1998 Spécification officielle Jetty 2.x

Servlet 2.0 JDK 1.1

Servlet 1.0 06/1997

Page 5: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

Web BrowserJava Web Containeur

La ServletDesigned to eat HTTP requests

GET http://localhost:8080/myservlet HTTP/1.0

Decode et affiche la résponse HTML

HTTP/1.1 200 OKServer: Apache-Coyote/1.1Content-Type: text/htmlContent-Length: 122Date: Fri, 02 Nov 2012 14:40:51 GMT

<html><head> <title>Hello Enib!</title> </head> <body> <h1>Welcome in the Java server side!</h1> </body> </html>

CAI Webappp (war)

MyServlet.class

Produit du code HTML

Page 6: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

La ServletControlled by the container

Copyright : http://marakana.com/s/post/106/tomcat_architecture_diagram

Page 7: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

La ServletLife cycle

Web Container Servlet Class Servlet Object

BeerServlet.class

Class Loading

Instantiation (Default contructor)

Servlet ready to work

init()

service()

Servlet clean up

Servlet working

destoy()

Handle client HttpRequest

doGet() doPost() each request in a separate Thread

Call once by the container

Call once by the container

The servlet should only have the default contsructor

Copyright : http://www.lifecyclesfilm.com/

Page 8: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

La ServletSimple ? ... or not ?

public class HtmlServlet extends HttpServlet {private static final long serialVersionUID = 1L;

public HtmlServlet() {

super(); }

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

doPost(request, response); }

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

response.setContentType("text/html") ;PrintWriter out = response.getWriter() ;out.println("<html>") ;out.println("<head>") ;out.println("<title>Hello Enib!</title>") ;out.println("</head>") ;out.println("<body>") ;out.println("<h1>Welcome in the Java server side!</h1>") ;out.println("</body>") ;out.println("</html>") ;

}}

Really so simple ?

Copyright : http://www.lifecyclesfilm.com/

Page 9: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

POST : Permet de réaliser une transaction afin de mettre à jour le modèle. Les données sont transmises via l'entête de la page Web.

Attention que se passe-t-il si la page est rejouée ?

La ServletGet or Post Madness

GET...

POST...

Servlet

Servlet Model

<html>...

<html>...

GET permet de récupérer un document, ne doit RIEN changer sur le serveur. Peut être rejoué (F5) sans effets de bords

Copyright : http://www.lifecyclesfilm.com/

Page 10: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

La ServletLa guerre des clones

Je vais cloner mes Servlets !

Une pour chaque page !

Page 11: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

La ServletAu modèle MVC vous fier, il faut !

Le contrôleur n'effectue aucun traitement, ne modifie aucune donnée. Il analyse la requête du client et se contente d'appeler le modèle adéquat et de renvoyer la vue correspondant à la demande.

Controller(Servlet)

Modèle(Java)

Vue(JSP)

Ce avec quoi l'utilisateur interagit. - présente les résultats renvoyés par le modèle.

- reçoit toute action de l'utilisateur (clic de souris, etc...)

- envoie les évènements au contrôleur (HTTP Request)

La vue n'effectue pas de traitement, elle se contente d'afficher les résultats des traitements effectués par le modèle et d'interagir avec l'utilisateur.

Le modèle représente le cœur (algorithmique) de l'application : traitements des données.

- décrit les données manipulées par l'application. - responsable de l'intégrité des données métier.

Les résultats renvoyés par le modèle ne s'occupent pas de présentation. Le modèle ne contient aucun lien direct vers le contrôleur ou la vue.

BDD

Page 12: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

La ServletRequête HTTP et modèle MVC

1. Requête du navigateur

2. Mapping url / servlet

3. Appel du modèle métier

4. La servlet ajoute la réponse du modèle à la requête

5. Forward vers la JSP

6. La JSP récupére la réponse

7. Génération de la page HTML

8. Le conteneur envoie la page au navigateur

Container logic

Servlet

Modèle(Java)

Vue(JSP)

2

1

3

8

7

5

4

6request

Page 13: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

La ServletMy best work

1. Requête du navigateur

2. Mapping url / servlet

3. Appel du modèle métier

4. La servlet ajoute la réponse du modèle à la requête

5. Forward vers la JSP

6. La JSP récupére la réponse

7. Génération de la page HTML

8. Le conteneur envoie la page au navigateur

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// Call the businessList<Beer> beers = beerBusiness.getBeers();

// Adds the model response to the requestrequest.setAttribute("beers", beers);

// Forward to the JSPRequestDispatcher dispatch = request.getRequestDispatcher("/WEB-INF/views/beer.jsp");dispatch.forward(request, response);

}

Page 14: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

beers.jspHead / Body....

<table class="table table-condensed"><thead>

<tr> <th>Name</th> <th>Brewery</th> <th>Country</th> <th>Alcohol</th> </tr> </thead> <tbody>

<c:forEach items="${beers}" var="beer"><tr>

<td>${beer.name}</td> <td>${beer.brewery}</td> <td>${beer.country}</td> <td>${beer.alcohol}</td> </tr> </c:forEach>

</tbody></table>...

...

La ServletLiens Servlet / JSP

1. Requête du navigateur

2. Mapping url / servlet

3. Appel du modèle métier

4. La servlet ajoute la réponse du modèle à la requête

5. Forward vers la JSP

6. La JSP récupére la réponse

7. Génération de la page HTML

8. Le conteneur envoie la page au navigateur

Page 15: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

La ServletGestion de la session

Une session web est une période délimitée pendant laquelle un serveur est en communication et réalise des opérations au service d'un client HTTP.

Session implicite : Lié à un browserSession explicite : Liée a des credentials (login / password)

Création d'une session :

HttpSession session = request.getSession(true);

Page 16: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

La ServletHttpSession

Principales methodes

Configuration de la durée de session

void setAttribute(String name, Object Value)Object getAttribute(String name) Ajoute ou récupère la valeur d'un attribut en session

Enumeration getAttributeNames() Retourne la liste de tous les attriuts

String getId() Retourne l'identificant de sessions

void invalidate() Invalide la session courante

Dans le web.xml -global à toutes les sessions- : <session-config>

<session-timeout>30</session-timeout></session-config>

A la création de la session -local pour chaque session- :session.setMaxInactiveInterval(30);

Page 17: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

La ServletListener de Session

Interfacesà implémenter

HttpSessionListerner HttpSessionAttributeListerner

Déclaration dans le web.xml

Notification new session createdvoid sessionCreated( HttpSessionEvent hse )

Notification session invalidatedvoid sessionDestroyed( HttpSessionEvent hse )

Notification new attribute added :void attributeAdded( HttpSessionBindingEvent hsbe )

Notification attribute removed :void attributeRemoves( HttpSessionBindingEvent hsbe )

Notification attribute replaced:void attributeRemoves( HttpSessionBindingEvent hsbe )

<listener> <description>HttpSessionListener, HttpSessionAttributesListener</description> <listener-class>fr.enib.cai.servlet.SessionListener</listener-class>

</listener>

Page 18: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

JSPIntroduction

JSP = JavaServer Pages

Technologie Java crée par Sun

Permettent la génération de pages web dynamiques.

Mélange de Java côté serveur et d'HTML côté client.

Adore se transformer !

Adepte du ménage à 3 (la JSP n'existe pas sans container ni Servlet)

Page 19: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

JSPTransformation

<html><body><%= new String("Hello!") %></body></html>

package ...

import javax.servlet...

byte code0010 00101001 00010001 11000101 1010

Servlet

Hello.jsp Hello_jsp.java Hello_jsp.class Hello_jsp servlet

translated compiled loaded

Page 20: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

JSPScriptlet

UglyScriptlet.jsp<html><body>Pourquoi suis-je si moche ?<br><%out.println(plain.old.java.Reason.getText() );%></body></html>

Reason.javapackage plain.old.java;

pubic class Reason {public static synchronized String getText() {

return new String("Parce que tu as un problème de circulation sanguine.");}

}

Page 21: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

JSPLes directives

UglyScriptlet.jsp<%@ page import="plain.old.java.*" %><html><body>Pourquoi suis-je toujours aussi moche ?<br><% out.println(Reason.getText() ); %></body></html>

<%@ page[language="java"] [extends="package.class"][import="{package.class|package.*}, ..."] [session="true|false"][buffer="none|8kb|sizekb"] [autoflush="true|false"][isThreadSafe="true|false"] [info="text"][errorPage="relativeURL"][contentType="mimeType [charset=characterSet]" | "text/html;charset=ISO-8859-17"][iserrorPage="true|false"]%>

<%@ include file="relativeURL" %>

<%@ taglib uri="URIToTagLibrary" prefix="tagPrefix" %>

Page 22: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

JSPLes expressions

UglyScriptlet.jsp<%@ page import="plain.old.java.*" %><html><body>Pourquoi suis-je toujours aussi moche ?<br><%= (Reason.getText() ); %></body></html>

Les expressions JSP permettent d'insérer simplement des chaînes de caractères générées dynamiquement dans la page HTML.

Page 23: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

JSPLes objets implicites

Java API jsp ObjectJspWriter outHttpServletRequest requestHttpServletResponse responseHttpSession sessionServletContext applicationThrowable exceptionPageContext pageContextObject page

Les expressions JSP permettent d'insérer simplement des chaînes de caractères générées dynamiquement dans la page HTML.

Page 24: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

JSPLes scopes

Page scope - portée : une JSP

Request scope - portée : une http request

Session scope - portée : la session d'un utlisateur du site - n'est pas thread safe (plusieurs onglet d'un browser peuvent partager la même session)

Application/Context scope - portée : globale (Servlet, Jsp, listener) - n'est pas thread safe

Page 25: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

JSPExpression Language (EL)

Inclus à partir de JSP 2.0

Un seul but : Code less

Too long expression<%= ((fr.enib.cai.core.Beer) request.getAttribute("beers").get(0).getName() %>

Much better no ?${beers[0].name}

Attention EL implicit objects sont des Maps - pair(name / value)pageScope - requestScope - sessionScope - applicationScopeparam - paramValuesheader - headerValuecookieinitParam

Il faut toujours un exception : pageContext

Oracle tutorial : http://docs.oracle.com/javaee/1.4/tutorial/doc/JSPIntro7.html

Page 26: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

JSPExpression Language (EL) - Implicit objects

Autre exemple : Method is : <%= request.getMethod() %>

Avec les EL essayez :

Method is : ${request.method}

Method is : ${requestScope.method}

Method is : ${pageContext.request.method}

Oracle tutorial : http://docs.oracle.com/javaee/1.4/tutorial/doc/JSPIntro7.html

Ouch

Page 27: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

● JSTL = JSP Standard Tag Library

● 4 Bibliothèques de tags utilisables dans les JSP

● Objectif : faciliter le développement des JSP

● Anéantir les scriptlets

● Depuis servlet API 2.3

JSTLRelookez vos JSP

Page 28: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

Avec le Jstl on peut faire :

des valeurs par défaut<c:out value='${user}' default='invité' />

des boucles <c:forEach var="beer" items="${beers}" >

Beer name : ${beer.name}</c:forEach>

Ne jamais laisser trainer les cadavres ! <c:remove var="kenny" scope="request" /> Le scope est optionnel

JSTLLes gammes - core library

Page 29: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

des if... sans else<c:if test="${beer.name eq 'Karmeliet'}">

Yes ${beer.name} have an incredible flavour ! </c:if>

mais avec des choose on peut faire de choses !<c:choose>

<c:when test="${beer.name eq 'Karmeliet'}">Yes ${beer.name} have an incredible flavour !

</c:when><c:when test="${beer.name eq 'Rochefor 8'}">

${beer.name} is another best choice !</c:when><c:otherwise>

Dammed give me a Kro !</c:otherwise>

</c:choose>

JSTLLes gammes - core library

Page 30: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

un set vraiment open !

des variables <c:set var="username" scope="" value="moi" />Pour les variables c'est basic même des Maps <c:set target="${PrettyMap}" property="prettyKey" value="prettyValue" />

JSTLLes gammes - core library

Page 31: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

Focus sur les includes!

<%@ include file="header.html" %> Static include content added at translation time

<jsp:include page="header.jsp" /> Dynamique include, compiled on time executed for each request

<c:import url="http://www.beertender.com/product.html /> Dynamique (comme jsp:include)Je peux inclure des ressources en dehors de mon container ???

Même avec des paramètres !<c:import url="header.jsp>

<c:param name="subTitle" value="Wy I drink so many beers ?" /></c:import>

File header.jsp<em><strong>${param.subTitle}</strong></em>

JSTLLes gammes - core library

Page 32: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

Créer des liens dans vos pages !

<c:url value='/signin.jsp' />

Avec des paramètres

<c:url value='/signin.jsp' ><c:param name="promocode" value="${enib}" />

</c:url>

Dans la page HTTP vous aurez un lien du genre :-> http://myServer.enib.fr:8080/mycontext/signin.jsp?promocode=enib

JSTLLes gammes - core library

Page 33: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

catcher les exceptions (NOTE : Ne pas coder avec des moufles) !

<c:catch var="myException"> <!-- doing here a very dangerous operation --></c:catch>

<c:if test="${myEception != null}"> Dammed, what is going wrong ? ${myException.message}</c:if>

JSTLLes gammes - core library

Page 34: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

La librairie de formatage (fmt):http://docs.oracle.com/javaee/5/jstl/1.1/docs/tlddocs/fmt/tld-summary.html

● internationalisarion● formatage des chaines de caractère

La "SQL" library :Hum, du Sql dans les JSP, je suis confus... ce n'est pas vraiment MVC compliant... mais ça existe.

La "XML" library :A utiliser en dernier recours, à dose homeopathique !

JSTLL'aventure continue

Page 35: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

Peut vous sauver la vie :

● réduire la duplication de code dans vos JSP

● intégrer la vue d'un composant complexe

● coder coté java quand le langage JSP / JSTL est aux limites

Helas trop long pour le parcourir !

JSTLYeah je fais ma lib de tags

Page 36: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

Plein de noms pour la même chose

-> Conteneur de servlets (Servlet container en anglais) -> Conteneur web (web container en anglais) -> moteur web -> moteur de servlets...

Bref, il exécute des servlets.

La Star : Tomcat de la fondation Apache (59% du marché).

Les poids lourds :Jboss ou WildFly (redhat), Jetty (Codehaus), WebLogic (IBM), WebSphere (IBM), GlassFish (Oracle), ... et une multitude d'autres

Le Conteneur

Page 37: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

● contenir des web apps

● recevoir des requêtes HTTP et les faire traiter par la bonne web app

● faire le mapping vers les servlets

● gérer les ressources de l'application web (base de données, etc...)

● gérer la session

● faire le mapping url / servlet, filtres,valves

● gérer le realm (royaume de la sécurité, un peu obsolète)

● gérer les logs

Le ConteneurSon rôle

Page 38: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

Le ConteneurSchema général

Copyright : http://marakana.com/s/post/106/tomcat_architecture_diagram

Page 39: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

Le Conteneurserveur.xml

Copyright : http://marakana.com/s/post/106/tomcat_architecture_diagram

● Configuration des services (généralement 1, : Catalina)

● Configuration pour chaque service ○ connecteur (port d'écoute)○ valves (intercèpte toutes les requêtes)○ realm (gère l'authentification)○ host (les applications web du container)

Page 40: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

Intercèpte TOUTES les requêtes

Définie dans le server.xml ou context.xmlApplicable pour un : engine, host ou context

exemple :<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"

Ecrit un fichier de logs contenant une ligne pour chaque requête HTTP

10.144.167.233 - - [10/Oct/2012:04:31:17 +0200] "POST /servau/thrift/acces/ HTTP/1.1" 200 325 "null" "Java/THttpClient" 3

Le ConteneurLa valve

Page 41: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

Intercèpte les requêtes en amont d'une servlet pour un url pattern donné

Définie dans le web.xmlLe filtre est une classe Java

Souvent utilisé pour traiter vérifier la session et les habilitations d'une requête.

exemple : <filter> <filter-name>UserContextFilter</filter-name> <filter-class> fr.enib.cai.filter.UserContextFilter </filter-class> </filter>

<filter-mapping> <filter-name>UserContextFilter</filter-name> <url-pattern>/prive/*</url-pattern> </filter-mapping>

Le ConteneurLe filtre

Page 42: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

Execute une requête pour un mapping d'url donné

Définie dans le web.xmlLa servlet est une classe Java

exemple : <servlet> <servlet-name>authentication_servlet</servlet-name> <servlet-class> fr.enib.cai.servlet.SignInServlet </servlet-class> </servlet>

<servlet-mapping> <servlet-name>authentication_servlet</servlet-name> <url-pattern>/signin</url-pattern> </servlet-mapping>

Le ConteneurLa Servlet

Page 43: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

WAR = un fichier jar (donc un zip...) contenant :○ JSP○ Servlet○ classes Java○ fichiers (xml, html, js, css)○ taglibs (tld)

Cette archive est utilisée pour déployer une application web sur un serveur d'application.

Le WarWeb Application ARchive

Page 44: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

Le WarStructure

mywebapp.war

WEB-INF

libclasses tags

fr

foo

MyTag.tag

fr.foo.Foo.class

web.xml

META-INF

MANIFEST.MF

(public)resources

CSS

JS

PNG

(public)content

JSP

HTML(private)views

JSPs

PRIVATE : fichiers exposés par l'intermédiaire d'une servlet / filtre / web.xmlPUBLIC : fichiers exposés directement par le container

Page 45: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

Contener needs infrastructure !

Page 46: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

Un service web est un programme informatique permettant la communication et l'échange de données entre applications et systèmes hétérogènes dans des environnements distribués.

Il s'agit donc d'un ensemble de fonctionnalités exposées sur internet ou sur un intranet, par et pour des applications ou machines, sans intervention humaine, et de manière synchrone.

Source Wikipedia

Les web services utilisent comme medium de communication HTTP/S

Web service

Page 47: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

anciènement : Simple Object Access Protocol : protocol RPC orienté objet bâti sur XML

● Définit initialement par Microsoft et IBM.● recommandé par le W3C● utilisé dans les architecture SOA (Service Oriented Architecture)

Avantages : ● basé sur HTTP● indépendant de la plate-forme● "presque" indépendant du langage

Inconvénients : ● formalisme lourd (verbosité de l'xml)● couplage fort client / serveur● volume de données transactionnel

Web serviceSOAP

Page 48: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

<?xml version="1.0"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">

<soap:Header> <m:User xmlns:m="http://www.exemple.com/rights/" soap:actor="http://www.exemple.com/rights/RightsManager"> Charles </m:User>

<m:Session xmlns:m="http://www.exemple.com/session/" soap:mustUnderstand="1">12AE3C </m:Session><m:Lang xmlns:m="http://www.exemple.com/lang/" soap:actor="http://schemas.xmlsoap.org/soap/next" soap:mustUnderstand="0">

FR </m:Lang> </soap:Header>

<soap:Body> <m:GetPrice xmlns:m="http://www.exemple.com/prices"> <m:Item>Pomme</m:Item> </m:GetPrice>

<soap:Fault> <faultcode>soap:Server</faultcode> <faultstring>Impossible de router le message.</faultstring> <faultactor>http://www.exemple.com/messageDispatcher</faultactor> <detail> <m:error xmlns:m="http://www.exemple.com/errors">E_NO_ROUTE</m:error> </detail> </soap:Fault> </soap:Body></soap:Envelope>

Web serviceSOAP - Exemple

Page 49: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

Web Service Description Language: grammaire XML décrivant un Service Web

● v2.0 approuvée en 2007● recommandé par le W3C● décrit une interface publique dans les architecture SOA

Le WSDL sert à décrire :● le protocole de communication (SOAP RPC ou SOAP orienté message)● le format des messages● les méthodes que le client peut invoquer● la localisation du service

Le wsdl est compilé (wsdl2java) pour obtenir les couches client / serveurDes implementation sont disponibles avec les frameworks :

○ cxf○ axis ○ un conteneur Web Profile (tomEE entre autres)

Web serviceWSDL

Page 50: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> <!-- Définition d'un message getTermRequest contenant une chaîne de caractères term --> <wsdl:message name="getTermRequest"> <wsdl:part name="term" type="xs:string"/> </wsdl:message>

<!-- Définition d'un message getTermResponse contenant une chaîne de caractères value --> <wsdl:message name="getTermResponse"> <wsdl:part name="value" type="xs:string"/> </wsdl:message>

<!-- Description du WebService glossaryTerms contenant une opération (action) qui prend en entrée un message getTermRequest et retourne un message getTermResponse --> <wsdl:portType name="glossaryTerms"> <wsdl:operation name="getTerm"> <!-- On peut rajouter une description textuelle de l'opération --> <wsdl:documentation .... /> <wsdl:input message="getTermRequest"/> <wsdl:output message="getTermResponse"/> </wsdl:operation> </wsdl:portType>

<!-- Association de l’accès SOAP pour le WebService glossaryTerms --> <wsdl:binding type="glossaryTerms" name="b1"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> <wsdl:operation> <soap:operation soapAction="http://www.example.com/getTerm"/> <wsdl:input> <soap:body use="literal"/> </wsdl:input> <wsdl:output> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding></wsdl:definitions>

Web serviceWSDL - Exemple

Page 51: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

REST (REpresentational State Transfer)● un style d'architecture logicielle permettant de construire une application

devant fonctionner sur des systèmes distribués● très proche du Web (définit par Roy Fielding, un des rédacteurs de la norme

HTTP 1.1)● aux sources du Web - STATELESS -

Bref, REST est donc le style d'architecture soutenant le Web.

Web serviceREST

Page 52: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

● PUT créer des ressources / urls sur un serveur● GET récupérer une ressource● POST créer ou modifier une ressource sur le server● DELETE supprimer une ressource

Exemple : http://myIncredibleRestServer:8080/context/rest/articles?prix=3.05

[ { "nom": "article a", "prix": 3.05, "disponible": false, "descriptif": "mon article a ..." }, { "nom": "article b", "prix": 3.05, "disponible": true, "descriptif": null }]

Web serviceREST - The Web Spirit !

Page 53: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

● Un langage de description d'interfaces (IDL) pour les données et services

● Un compilateur qui génère le code pour mettre en place les servicesMulti-langage : Java, Python, C/C++, PHP...

● Du code pour la description des données (beans)

● la sérialisation/désérialisation

● le transport (HTTP, TCP...)

● le client et le serveur

Web serviceC'est quoi Thrift

Page 54: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

enum PhoneType { HOME, WORK, MOBILE, OTHER,} struct Phone { 1: i32 id, 2: string number, 3: PhoneType type,}

struct Contact { 1 : i32 id, 2 : string name, 3 : string surname, 4 : list<Phone> phones,}

ThriftLes idls - décrire les données

struct GetContactByNameRequest { 1 : string name, 2 : string surname,}struct GetContactByNameResponse { 1 : GetContactByNameRequest request, 2 : Contact contact,}

Page 55: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

service GetContact { //Ici une belle description du service GetContactByNameResponse getContactByName( 1 : GetContactByNameRequest request );}

● Un et un seul paramètre en entrée NomDeLaMethodeRequest● Un et un seul objet en sortie NomDeLaMethodeResponse

● Le premier champ de l'objet response est toujours la request

Web serviceServices

Page 56: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

CloudYou did this really by youself ?

Page 57: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

CloudEnjoy, the Cloud save you life

Page 58: ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours

This afternoon...