1 / 38

Programmation Web

Programmation Web. Les JSP. HTTP HelloWorld. HelloWorld avec une servlet HTTP. import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloHttpServlet extends HttpServlet { protected void doGet ( HttpServletRequest request, HttpServletResponse response)

brooklyn
Download Presentation

Programmation Web

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Programmation Web Les JSP

  2. HTTP HelloWorld HelloWorld avec une servlet HTTP importjava.io.*; importjavax.servlet.*; importjavax.servlet.http.*; publicclassHelloHttpServletextendsHttpServlet{ protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ response.setContentType("text/plain"); PrintWriterout=response.getWriter(); out.println("HTTP Hello World!"); } publicStringgetServletInfo(){ return"HTTP Hello World Servlet"; } } L’objet réponse permet d’obtenirle flux de sortie en écriture

  3. HelloWorld JSP Entrelacer le code HTML et le code Java Le fichier hello.jsp Début du code <html> <body bgcolor="white"> <% out.println("Hello World"); %> </body> </html> out correspond au writer surle flux de sortie en écriture Fin du code

  4. Fichier de configuration Le fichier web.xml correspondant <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <display-name>Appli de Demo</display-name> <description>Ceci est une série de servlets de démo</description> </web-app> Rien, l’association*.jsp  définir une JSP est automatique

  5. jasper javac Page JSP Servlet .java Servlet .class Traduction des JSP Une JSP est traduite en Servletlors du premier appel à la JSP Hérite de javax.servlet.jsp.HttpJspPage et implémente la méthode _jspService().

  6. Traduction de HelloWorld public class hello_jsp extends HttpJspBase { public void _jspService(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException, ServletException { … try { _jspxFactory = JspFactory.getDefaultFactory(); response.setContentType("text/html;charset=ISO-8859-1"); pageContext = _jspxFactory.getPageContext(this, request, response, null, true, 8192, true); application = pageContext.getServletContext(); config = pageContext.getServletConfig(); session = pageContext.getSession(); out = pageContext.getOut(); out.write("<html>\r\n "); out.write("<body bgcolor=\"white\">\r\n "); out.println("Hello World"); out.write("\r\n "); out.write("</body>\r\n"); out.write("</html>"); } catch (Throwable t) { pageContext.handlePageException(t); } finally { if (_jspxFactory != null) _jspxFactory.releasePageContext(pageContext); } } }

  7. Hello World JSP (2) Répertoires sur le serveur Les fichiers JSP sont au même endroitque les fichiers HTML

  8. Éléments des pages JSP • Tag de Directive • Tag de Commentaire • Tag de Déclaration • Tag de Scriptlet • Tag d’Expression

  9. Directives JSP Version XML <jsp:directive … /> ou <%@ … %> • Elles permettent de changer la façon de traduire les pages JSP • Ils existent différents types :directive de page (sur la JSP)directive d’includedirective de taglib

  10. Directive de page Directive de page par ex: Java <%@ page language=”scriptingLanguage” extends=”className”import=”importList”session=”true|false”buffer=”none|sizekb”autoFlush=”true|false”isThreadSafe=”true|false”info=”info_text”errorPage=”error_url”isErrorPage=”true|false”contentType=”ctinfo”pageEncoding=”peinfo”isELIgnored=”true|false”> La JSP étend la classe Liste de import Java Utilise une session taille du buffer réponse Flush la réponse N’est pas synchronizé Redirige les erreurs Est appelé en cas d’erreur Langage de script (JSP 2.0)

  11. Commentaire Les balises <%-- et --%> spécifie des commentaires non traduits <html> <body bgcolor="white"> <!-- commentaire visible en HTML --> <%-- commentaire invisible en HTML --%> <% out.println("Hello World"); %> </body> </html>

  12. JSP Déclaration <jsp:declaration … /> ou <%! …%> Permet de déclarer : • Des variables d’instance de JSP( d’instance de servlet) • Des méthodes

  13. JSP Scriplet <jsp:scriplet … /> ou <% … %> Permet d’inclure du code dans la JSP <html> <body bgcolor="white"> <% for(int i=0;i<5;i++) { %> Hello World<br> <% } %> </body> </html>

  14. JSP Expression <jsp:expression … /> ou <%= … %> Permet l’affichage de valeur d’une expression <%@ page import="java.util.*" %> <html> <body bgcolor="white"> <h1>Headers</h1> <dl> <% for (Enumeration e= request.getHeaderNames(); e.hasMoreElements();) { String name= (String) e.nextElement(); %> <dt><%=name %></dt> <dd><%=request.getHeader(name)%></dd> <% } %> </body> </html>

  15. Affichage des Headers Afficher les headers de la requête <%@ page import="java.util.*" %> <html> <body bgcolor="white"> <h1>Headers</h1> <dl> <% for (Enumeration e= request.getHeaderNames(); e.hasMoreElements();) { String name= (String) e.nextElement(); %> <dt><%= name %></dt> <dd><%=request.getHeader(name) %></dd> <% } %> </body> </html>

  16. Cycle de vie d’une JSP Le cycle de vie d'une JSP : • la méthode jspInit() est appelée après le chargement ; • une méthode _jspService() est appelée à chaque requête dans une nouvelle thread. • la méthode jspDestroy() est appelée pour le déchargement.

  17. Un compteur de visite Cycle de vie et directive d’un compteur de page Directive de page pas obligatoire car les préférences sont synchronizés <%@ page import="java.util.prefs.*" contentType="text/html" isThreadSafe="false"%> <%! private Preferences pref; public void jspInit() { pref=Preferences.userNodeForPackage(getClass()); } public void jspDestroy() { try { pref.sync(); } catch(BackingStoreException e) { getServletContext().log("can't save prefs",e); } pref=null; } %> <html> <body bgcolor="white"> <% int counter=pref.getInt("counter", 0); %> Page accédée : <%= ++counter %> <% pref.putInt("counter", counter); %> </body> </html> Expression Scriptlet

  18. Include & Forward mêmes restrictions que pour les servlets • Forward :<jsp:forward page="page.html"/> • Include : <jsp:include page="page.html"/> <%@ include file="fichier.html"/>

  19. Deux types d’agrégations • <%@ include file=... %>effectuer lors de la traduction, relatif au fichier, le contenu est traduit. • <jsp:include page= />effectuer lors de l’exécution de la requête, relatif à la page courante.

  20. Include & Forward (2) <jsp:param ... /> permet d’ajouter des paramètres à un include ou un forward <jsp:forwardpage="parameters.jsp"> <jsp:paramname="nouveauParamètre" value="toto"/> </jsp:forward>

  21. JSP et Objet • Le tag jsp:useBean permet de déclarer (et d’allouer) des objet java dans les JSP • Le tag jsp:getProperty permet d’obtenir la valeur d’une propriété suivant la norme java beans • Le tag jsp:setProperty permet de changer la valeur d’une propriété d’un objet

  22. JSP et Objet (2) Utilisation d’un objet dans une JSP <html> <body bgcolor="white"> <jsp:useBeanid="myBean"scope="session"class="fr.umlv.jsp.demo.MyBean"/> <h1> <jsp:getPropertyname="myBean"property="name"/> </h1> <jsp:setPropertyname="myBean"property="name"param="username"/> <hr> <form enctype="application/x-www-form-urlencoded" action="bean.jsp" method=GET> Nom : <input type=text size=20 name="username"> <br> <input type=submit value="Envoi"> </form> </body> </html> Récupère le paramètre username packagefr.umlv.jsp.demo; publicclassMyBean{ publicStringgetName(){ returnname; } publicvoidsetName(Stringname){ this.name=name; } privateStringname; }

  23. JSP et Objet (3) Le paramètre est stocké dans l’objet paramètre username Formulaire méthode GET

  24. Bean et scope • Page :objet visible pour un page JSP • Request :objet visible pour une page et passe les include et forward • Session :objet ayant la durée de vie de la session • Application :objet ayant la durée de vie le la web-app

  25. Scope Exemple Déclaration et récupération des valeurs <html> <body bgcolor="white"> <h2>Before</h2> <jsp:include page="beanIncludeScope.jsp"/> <jsp:useBean id="myBean1" scope="page" class="fr.umlv.jsp.demo.MyBean"/> <jsp:useBean id="myBean2" scope="request" class="fr.umlv.jsp.demo.MyBean"/> <jsp:useBean id="myBean3" scope="session" class="fr.umlv.jsp.demo.MyBean"/> <jsp:useBean id="myBean4" scope="application" class="fr.umlv.jsp.demo.MyBean"/> <jsp:setProperty name="myBean1" property="name" value="page"/> <jsp:setProperty name="myBean2" property="name" value="request"/> <jsp:setProperty name="myBean3" property="name" value="session"/> <jsp:setProperty name="myBean4" property="name" value="appplication"/> <h2>After</h2> <jsp:include page="beanIncludeScope.jsp"/> </body> </html>

  26. Scope Exemple (2) <jsp:useBean id="myBean1" scope="page" class="fr.umlv.jsp.demo.MyBean"/> <jsp:useBean id="myBean2" scope="request" class="fr.umlv.jsp.demo.MyBean"/> <jsp:useBean id="myBean3" scope="session" class="fr.umlv.jsp.demo.MyBean"/> <jsp:useBean id="myBean4" scope="application" class="fr.umlv.jsp.demo.MyBean"/> <dl> <dt>myBean1 :</dt> <dd> <jsp:getProperty name="myBean1" property="name"/> </dd> <dt>myBean2 :</dt> <dd> <jsp:getProperty name="myBean2" property="name"/> </dd> <dt>myBean3 :</dt> <dd> <jsp:getProperty name="myBean3" property="name"/> </dd> <dt>myBean4 :</dt> <dd> <jsp:getProperty name="myBean4" property="name"/> </dd> </dl> Déclaration et modification de variables

  27. Scope Exemple (3) Valeurs des variables suivants le scope Session/application reste après reload page ne passe pas les include Reload

  28. Objet implicitement déclaré • request (request) requête courante • response (page) réponse courante • pageContext (page) • session (session) session courante • application (application) • out (page) écrivain sur la réponse • config (page) config de la JSP • page (page) équivalent à this. • exception (page) exception dans les pages d’erreurs

  29. La classe PageContext Permet de manipuler une variable quelque soit le scope : • Object getAttribute(String name,int scope) • void setAttribute(String name, Object o, int scope) • void removeAttribute(String name,int scope) Scopes possibles : PAGE_SCOPE, REQUEST_SCOPE, SESSION_SCOPE, APPLICATION_SCOPE Recherche dans les scopes : • Object getAttribute(String name) • void setAttribute(String name, Object o) • void removeAttribute(String name)

  30. Récupération des erreurs • Plusieurs types d’erreurs :- erreurs de traduction (pas récupérable)- erreurs d’exécution (récupérable) • Une page déclare posséder une page d’erreur • Déclaration être une page d’erreur

  31. Récupération des erreurs (2) <%@ page errorPage="/error.jsp" %> <html> <body bgcolor="white"> <% // oops Object o=null; o.toString(); %> </body> </html> est une page d’erreur <%@ page isErrorPage="true" import="java.io.*" contentType="text/plain" %> <% exception.printStackTrace( new PrintWriter(out)); %> Redirige les erreurs versla page error.jsp

  32. Traduction Helloworld (2) public class hello_jsp extends HttpJspBase { public void _jspService(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException, ServletException { … try { _jspxFactory = JspFactory.getDefaultFactory(); response.setContentType("text/html;charset=ISO-8859-1"); pageContext = _jspxFactory.getPageContext(this, request, response, null, true, 8192, true); application = pageContext.getServletContext(); config = pageContext.getServletConfig(); session = pageContext.getSession(); out = pageContext.getOut(); out.write("<html>\r\n "); out.write("<body bgcolor=\"white\">\r\n "); out.println("Hello World"); out.write("\r\n "); out.write("</body>\r\n"); out.write("</html>"); } catch (Throwable t) { pageContext.handlePageException(t); } finally { if (_jspxFactory != null) _jspxFactory.releasePageContext(pageContext); } } }

  33. Interaction JSP/Servlet Application web gérant un panier d’achat

  34. basket-product.jsp basket-list.jsp Interaction JSP/Servlet (2) Architecture de l’application Basket Article session new add/remove BasketActionServlet /add /remove getProductList Forward HTTP POST article="manteau" HTTP POST article="voiture" JSP Servlet JSP

  35. Interaction JSP/Servlet (3) Les classes Article et Basket publicclassArticle{ publicArticle(Stringname){ this.name=name; } publicStringgetName(){ returnname; } publicintgetPrice(){ intprice=0; for(inti=0;i<name.length();i++) price+=name.charAt(i); returnprice; } publicbooleanequals(Objecto){ returnname.equals(((Article)o).name); } publicstaticString[]getProductList(){ returnnewString[]{ "manteau","velo","courgette","edredon" }; } privateStringname; } publicclassBasket{ publicvoidadd(Articlearticle){ list.add(article); } publicvoidremove(Articlearticle){ list.remove(article); } publicIteratoriterator(){ returnlist.iterator(); } privatefinalArrayListlist=newArrayList(); }

  36. Interaction JSP/Servlet (4) <%@ page import="java.util.*,fr.umlv.jsp.demo.*" %> <html><body bgcolor="white"> <h1>Ajouter un Article au Panier</h1> <table> <% String[] products=Article.getProductList(); for (int i=0;i<products.length;i++) { Article article=new Article(products[i]); %> <tr> <td><%=article.getName() %></td><td><%=article.getPrice() %></td> <td> <form enctype="application/x-www-form-urlencoded" action="add" method="POST"> <input type="hidden" name="article" value="<%=article.getName() %>"> <input type="submit" value="Ajouter"> </form> </td></tr> <% } %> </table> <a href="basket-list.jsp">Visualiser le panier</a> </body></html> JSP : basket-product.jsp

  37. Interaction JSP/Servlet (5) JSP : basket-list.jsp <%@ page import="java.util.*,fr.umlv.jsp.demo.*" %> <html><body bgcolor="white"> <h1>Contenu du Panier</h1> <jsp:useBeanid="basket" class="fr.umlv.jsp.demo.Basket"  scope="session"/> <% int total=0; %> <table> <% for (Iterator it=basket.iterator();it.hasNext();) { Article article= (Article) it.next(); %> <tr> <td><%= article.getName() %></td> <td><%= article.getPrice() %></td> <td> <form enctype="application/x-www-form-urlencoded" action="remove" method="POST"> <input type="hidden" name="article" value="<%= article.getName() %>"> <input type="submit" value="Enlever"> </form> </td> </tr> <% total+=article.getPrice(); } %> <tr> <td colspan="3"><hr></td> </tr> <tr> <td>Total</td><td><%= total %></td> </tr> </table> <a href="product-list.jsp">Liste des produits</a> </body></html>

  38. Interaction JSP/Servlet (6) La servlet BasketActionServlet publicclassBasketActionServletextendsHttpServlet{ protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ HttpSessionsession=request.getSession(); Basketbasket=(Basket)session.getAttribute("basket"); if(basket==null){ basket=newBasket(); session.setAttribute("basket",basket); } Articlearticle=newArticle(request.getParameter("article")); Stringuri=request.getRequestURI(); if(uri.endsWith("add")) basket.add(article); else basket.remove(article); getServletContext().getRequestDispatcher("/basket/basket-list.jsp"). forward(request,response); }}

More Related