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

1 361 vues

Publié le

0 commentaire
0 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

  • Soyez le premier à aimer ceci

Aucun téléchargement
Vues
Nombre de vues
1 361
Sur SlideShare
0
Issues des intégrations
0
Intégrations
1
Actions
Partages
0
Téléchargements
61
Commentaires
0
J’aime
0
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

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

  1. 1. The ServerstrikesbackServlet, jsp, web server and so on
  2. 2. La ServletThe Web WarJe dois obéir à mon maître PerlTu souséstime le pouvoir de CGITon simple language est bienfaible comparé au coté obscur dePerlRobuste je suis grâce à JavaToujours en mouvement le WebestDu conteneur émane lénergie dela Servlet
  3. 3. La ServletGénéralitéeLa Servlet est une classe Java permettant de créer dynamiquement desdonnées au sein dun serveur HTTP.Une instance unique de la Servlet sexecute à chaque requête HTTP reçu parle conténeur (Serveur Web).Elle produit du code (HTML, XML, JS...) compréhensible par un navigateurWeb.● 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...)
  4. 4. La ServletHistoriqueServlet 3.0 12/2009 JavaEE/SE 6 Async Servlet, FileUploadingTomcat 7.x, Jetty 8.xServlet 2.5 09/2005 JavaEE/SE 5 Ajout des annotations Tomcat 6.x, Jetty 6.x-7.xServlet 2.4 11/2003 J2EE 1.4, J2SE 1.3 XML Schema pour le web.xmlTomcat 5.x, Jetty 5.xServlet 2.3 08/2001 J2EE 1.3, J2SE 1.2 Gestion des filtres Tomcat 4.x, Jetty 4.xServlet 2.2 08/1999 J2EE 1.2, J2SE 1.2 Intégration dans J2EE Tomcat 3.x, Jetty 3.xServlet 2.1 11/1998 Spécification officielle Jetty 2.xServlet 2.0 JDK 1.1Servlet 1.0 06/1997
  5. 5. Web BrowserJava Web ContaineurLa ServletDesigned to eat HTTP requestsGET http://localhost:8080/myservlet HTTP/1.0Decode et affiche la résponseHTMLHTTP/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.classProduit du code HTML
  6. 6. La ServletControlled by the containerCopyright : http://marakana.com/s/post/106/tomcat_architecture_diagram
  7. 7. La ServletLife cycleWeb Container Servlet Class Servlet ObjectBeerServlet.classClass LoadingInstantiation (Default contructor)Servlet readyto workinit()service()Servlet cleanupServletworkingdestoy()Handle client HttpRequestdoGet() doPost()each request in a separate ThreadCall once by the containerCall once by the containerThe servlet should only have thedefault contsructorCopyright : http://www.lifecyclesfilm.com/
  8. 8. 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/
  9. 9. POST : Permet de réaliser unetransaction afin de mettre à jourle modèle.Les données sont transmises vialentête de la page Web.Attention que se passe-t-il sila page est rejouée ?La ServletGet or Post MadnessGET...POST...ServletServletModel<html>...<html>...GET permet de récupérer undocument, ne doit RIEN changersur le serveur.Peut être rejoué (F5) sans effetsde bordsCopyright : http://www.lifecyclesfilm.com/
  10. 10. La ServletLa guerre des clonesJe vais cloner mes Servlets !Une pour chaque page !
  11. 11. La ServletAu modèle MVC vous fier, il faut !Le contrôleur neffectue aucun traitement, ne modifie aucune donnée.Il analyse la requête du client et se contente dappeler le modèle adéquat et de renvoyer la vuecorrespondant à la demande.Controller(Servlet)Modèle(Java)Vue(JSP)Ce avec quoi lutilisateur interagit.- présente les résultats renvoyéspar le modèle.- reçoit toute action de lutilisateur(clic de souris, etc...)- envoie les évènements aucontrôleur (HTTP Request)La vue neffectue pas detraitement, elle se contentedafficher les résultats destraitements effectués par lemodèle et dinteragir aveclutilisateur.Le modèle représente le cœur(algorithmique) de lapplication :traitements des données.- décrit les données manipulées parlapplication.- responsable de lintégrité des donnéesmétier.Les résultats renvoyés par le modèle nesoccupent pas de présentation.Le modèle ne contient aucun lien directvers le contrôleur ou la vue.BDD
  12. 12. La ServletRequête HTTP et modèle MVC1. Requête du navigateur2. Mapping url / servlet3. Appel du modèle métier4. La servlet ajoute la réponsedu modèle à la requête5. Forward vers la JSP6. La JSP récupére la réponse7. Génération de la page HTML8. Le conteneur envoie la pageau navigateurContainerlogicServletModèle(Java)Vue(JSP)21387546request
  13. 13. La ServletMy best work1. Requête du navigateur2. Mapping url / servlet3. Appel du modèle métier4. La servlet ajoute la réponsedu modèle à la requête5. Forward vers la JSP6. La JSP récupére la réponse7. Génération de la page HTML8. Le conteneur envoie la pageau navigateurprotected 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);}
  14. 14. 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 / JSP1. Requête du navigateur2. Mapping url / servlet3. Appel du modèle métier4. La servlet ajoute la réponsedu modèle à la requête5. Forward vers la JSP6. La JSP récupére la réponse7. Génération de la page HTML8. Le conteneur envoie la pageau navigateur
  15. 15. La ServletGestion de la sessionUne session web est une période délimitée pendant laquelle un serveur est encommunication et réalise des opérations au service dun client HTTP.Session implicite : Lié à un browserSession explicite : Liée a des credentials (login / password)Création dune session :HttpSession session = request.getSession(true);
  16. 16. La ServletHttpSessionPrincipales methodesConfiguration de la durée de sessionvoid setAttribute(String name, Object Value)Object getAttribute(String name) Ajoute ou récupère la valeur dun attribut en sessionEnumeration getAttributeNames() Retourne la liste de tous les attriutsString getId() Retourne lidentificant de sessionsvoid invalidate() Invalide la session couranteDans 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);
  17. 17. La ServletListener de SessionInterfacesà implémenterHttpSessionListerner HttpSessionAttributeListernerDéclaration dans le web.xmlNotification 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>
  18. 18. JSPIntroductionJSP = JavaServer PagesTechnologie Java crée par SunPermettent la génération de pages web dynamiques.Mélange de Java côté serveur et dHTML côté client.Adore se transformer !Adepte du ménage à 3 (la JSP nexiste pas sans container ni Servlet)
  19. 19. JSPTransformation<html><body><%= newString("Hello!") %></body></html>package ...importjavax.servlet...byte code0010 00101001 00010001 11000101 1010ServletHello.jsp Hello_jsp.java Hello_jsp.class Hello_jsp servlettranslated compiled loaded
  20. 20. JSPScriptletUglyScriptlet.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.");}}
  21. 21. JSPLes directivesUglyScriptlet.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" %>
  22. 22. JSPLes expressionsUglyScriptlet.jsp<%@ page import="plain.old.java.*" %><html><body>Pourquoi suis-je toujours aussi moche ?<br><%= (Reason.getText() ); %></body></html>Les expressions JSP permettent dinsérer simplement des chaînes de caractères généréesdynamiquement dans la page HTML.
  23. 23. JSPLes objets implicitesJava API jsp ObjectJspWriter outHttpServletRequest requestHttpServletResponse responseHttpSession sessionServletContext applicationThrowable exceptionPageContext pageContextObject pageLes expressions JSP permettent dinsérer simplement des chaînes de caractères généréesdynamiquement dans la page HTML.
  24. 24. JSPLes scopesPage scope- portée : une JSPRequest scope- portée : une http requestSession scope- portée : la session dun utlisateur du site- nest pas thread safe (plusieurs onglet dun browser peuvent partager lamême session)Application/Context scope- portée : globale (Servlet, Jsp, listener)- nest pas thread safe
  25. 25. JSPExpression Language (EL)Inclus à partir de JSP 2.0Un seul but : Code lessToo 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 - headerValuecookieinitParamIl faut toujours un exception : pageContextOracle tutorial : http://docs.oracle.com/javaee/1.4/tutorial/doc/JSPIntro7.html
  26. 26. JSPExpression Language (EL) - Implicit objectsAutre 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.htmlOuch
  27. 27. ● 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.3JSTLRelookez vos JSP
  28. 28. 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 optionnelJSTLLes gammes - core library
  29. 29. 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
  30. 30. un set vraiment open !des variables<c:set var="username" scope="" value="moi" />Pour les variables cest basicmême des Maps<c:set target="${PrettyMap}" property="prettyKey" value="prettyValue" />JSTLLes gammes - core library
  31. 31. 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
  32. 32. 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=enibJSTLLes gammes - core library
  33. 33. 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
  34. 34. 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èreLa "SQL" library :Hum, du Sql dans les JSP, je suis confus... ce nest pas vraiment MVCcompliant... mais ça existe.La "XML" library :A utiliser en dernier recours, à dose homeopathique !JSTLLaventure continue
  35. 35. Peut vous sauver la vie :● réduire la duplication de code dans vos JSP● intégrer la vue dun composant complexe● coder coté java quand le langage JSP / JSTL est aux limitesHelas trop long pour le parcourir !JSTLYeah je fais ma lib de tags
  36. 36. 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 dautresLe Conteneur
  37. 37. ● 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 lapplication 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 logsLe ConteneurSon rôle
  38. 38. Le ConteneurSchema généralCopyright : http://marakana.com/s/post/106/tomcat_architecture_diagram
  39. 39. Le Conteneurserveur.xmlCopyright : 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 lauthentification)○ host (les applications web du container)
  40. 40. Intercèpte TOUTES les requêtesDéfinie dans le server.xml ou context.xmlApplicable pour un : engine, host ou contextexemple :<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"Ecrit un fichier de logs contenant une ligne pour chaque requête HTTP10.144.167.233 - - [10/Oct/2012:04:31:17 +0200] "POST /servau/thrift/acces/ HTTP/1.1" 200 325"null" "Java/THttpClient" 3Le ConteneurLa valve
  41. 41. Intercèpte les requêtes en amont dune servlet pour un url pattern donnéDéfinie dans le web.xmlLe filtre est une classe JavaSouvent utilisé pour traiter vérifier la session et les habilitations dune 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
  42. 42. Execute une requête pour un mapping durl donnéDéfinie dans le web.xmlLa servlet est une classe Javaexemple :<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
  43. 43. 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 serveurdapplication.Le WarWeb Application ARchive
  44. 44. Le WarStructuremywebapp.warWEB-INFlibclasses tagsfrfooMyTag.tagfr.foo.Foo.classweb.xmlMETA-INFMANIFEST.MF(public)resourcesCSSJSPNG(public)contentJSPHTML(private)viewsJSPsPRIVATE : fichiers exposés par lintermédiaire dune servlet / filtre / web.xmlPUBLIC : fichiers exposés directement par le container
  45. 45. Contener needsinfrastructure !
  46. 46. Un service web est un programme informatique permettant la communication etléchange de données entre applications et systèmes hétérogènes dans desenvironnements distribués.Il sagit donc dun ensemble de fonctionnalités exposées sur internet ou sur unintranet, par et pour des applications ou machines, sans intervention humaine, etde manière synchrone.Source WikipediaLes web services utilisent comme medium de communication HTTP/SWeb service
  47. 47. anciènement : Simple Object Access Protocol : protocol RPC orienté objet bâtisur 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 langageInconvénients :● formalisme lourd (verbosité de lxml)● couplage fort client / serveur● volume de données transactionnelWeb serviceSOAP
  48. 48. <?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
  49. 49. 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 SOALe 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 serviceLe 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
  50. 50. <wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"><!-- Définition dun 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 dun 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 enentrée un message getTermRequest et retourne un message getTermResponse --><wsdl:portType name="glossaryTerms"><wsdl:operation name="getTerm"><!-- On peut rajouter une description textuelle de lopé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:operationsoapAction="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
  51. 51. REST (REpresentational State Transfer)● un style darchitecture logicielle permettant de construire une applicationdevant fonctionner sur des systèmes distribués● très proche du Web (définit par Roy Fielding, un des rédacteurs de la normeHTTP 1.1)● aux sources du Web - STATELESS -Bref, REST est donc le style darchitecture soutenant le Web.Web serviceREST
  52. 52. ● 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 ressourceExemple : 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 !
  53. 53. ● Un langage de description dinterfaces (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 serveurWeb serviceCest quoi Thrift
  54. 54. 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éesstruct GetContactByNameRequest {1 : string name,2 : string surname,}struct GetContactByNameResponse {1 : GetContactByNameRequest request,2 : Contact contact,}
  55. 55. service GetContact {//Ici une belle description du serviceGetContactByNameResponse 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 lobjet response est toujours la requestWeb serviceServices
  56. 56. CloudYou did this really by youself ?
  57. 57. CloudEnjoy, the Cloud save you life
  58. 58. This afternoon...

×