Vous êtes sur la page 1sur 40

par Philippe Poulard

Servlet & JSP


1

Philippe.Poulard@sophia.inria.fr

Philippe Poulard

par Philippe Poulard

Sommaire Servlets et JSP

Intro : Servlets et JSP dans J2EE Le conteneur Web Comparaison avec d'autres technos Web, avantages de Java

Servlet & JSP

Rappels HTTP Utilisation d'une servlet Cycle de vie d'une servlet Servlet Web : requtes et rponses, exemple Paramtres, cookies, sessions Porte des objets, partage des ressources Applications Web : dploiement Serveurs de servlet

JSP
Constitution des pages Directives JSP et actions JavaBean dans les JSP Variables prdfinies Custom tags

Le paradigme MVC
Gnse MVC appliqu au Web Le modle La vue Le contrleur

exemple JavaBean exemple JSP exemple Servlet

par Philippe Poulard

Qu'est-ce ?

Spcifications : Composants Web de l'architecture J2EE Servlet http://java.sun.com/products/servlet/download.html http://java.sun.com/products/jsp/download.html Java Server Pages Firewall

EJB Container enterprise bean enterprise bean enterprise bean Web Container (Servlets, JSP, HTML, XML) JNDI JMS Javamail

Servlet & JSP

Client

Client Client

Enterprise Information Systems (RDBMS, ERP, Legacy Applications)

Client

Client Tier

Middle Tier

EIS Tier

par Philippe Poulard

Servlet

Une servlet est un composant qui tend les fonctionnalits d'un serveur web de manire portable et efficace. Un serveur web hberge des classes Java servlets qui sont excutes l'intrieur du container web. Le serveur web associe une ou plusieurs URLs chaque servlet. La servlet est invoque lorsque des requtes HTTP utilisateur sont soumises au serveur. Quand la servlet reoit une requte du client, elle gnre une rponse, ventuellement en utilisant la logique mtier contenue dans des EJBs ou en interrogeant directement une base de donnes. Elle retourne alors une rponse HTML ou XML au demandeur. Un dveloppeur de servlet utilise l'API servlet pour : Initialiser et finaliser la servlet Accder l'environnement de la servlet Recevoir ou rediriger les requtes et envoyer les rponses Interagir avec d'autres servlets ou composants Maintenir les informations de sessions du client Filtrer avant ou aprs traitement les requtes et les rponses Implmenter la scurit sur le tiers web

Servlet & JSP


4

par Philippe Poulard JSP = Document Centric servlet ASP PHP La technologie JSP fournit un moyen simple et extensible pour gnrer du contenu dynamique pour le client web.

JSP
Java Server Pages

Servlet & JSP


5

Une page JSP est un document texte qui dcrit comment traiter la requte d'un client et comment crer une rponse. Une page JSP contient : Des informations de formatage (modle) du document web, habituellement en HTML ou XML. Les concepteurs web peuvent modifier cette partie de la page sans affecter les parties dynamiques. Cette approche permet de sparer la prsentation du contenu dynamique. Des lments JSP et de script pour gnrer le contenu dynamique du document Web. La plupart des pages JSP utilisent aussi des JavaBeans et/ou des Enterprise JavaBeans pour raliser les oprations complexes de l'application. Les JSP permettent en standard d'instancier des beans, de modifier ou lire leurs attributs et de tlcharger des applets. La technologie JSP est extensible en utilisant des balises personnalises qui peuvent tre encapsules dans des bibliothques de balises personnalises (taglibs)

par Philippe Poulard

Exemple JSP
Le rsultat d'une page peut tre : HTML XML SVG WML

<%@ page import="java.util.*,MyLocales" %> <%@ page contentType="text/html; charset=ISO-8859-5" %> <html> <head> <title>Localized Dates</title> </head> <body bgcolor="white"> <jsp:useBean id="locales" scope="application" class="MyLocales"/> <form name="localeForm" action="index.jsp" method="post"> <b>Locale:</b> <select name=locale> <% String selectedLocale = request.getParameter("locale"); Iterator i = locales.getLocaleNames().iterator(); while (i.hasNext()) { String locale = (String)i.next(); if (selectedLocale != null && selectedLocale.equals(locale)) {%> <option selected><%=locale%></option> <% } else { %> <option><%=locale%></option> <% } } %> </select> <input type="submit" name="Submit" value="Get Date"> </form> <jsp:include page="date.jsp"/> </body> </html>

Servlet & JSP


6

Le rsultat est une page HTML dynamique

par Philippe Poulard

Le conteneur Web

Les composants web sont hbergs dans des conteneurs de servlets, conteneurs de JSP et conteneurs web. En sus des fonctionnalits normales d'un conteneur de composants, un conteneur de servlets (servlets container) fournit les services rseaux par lesquels les requtes et rponses sont mises.

Servlet & JSP

Il dcode galement les requtes et formate les rponses dans le format appropri. Tous les conteneurs de servlets doivent supporter le protocole HTTP et peuvent aussi supporter le protocole HTTPS. Un conteneur de JSP (JSP container) fournit les mmes services qu'un conteneur de servlets. Ces conteneurs sont gnralement appels conteneurs web (Web containers). container Web requte HTTP servlet service cration d'un Thread pour chaque requte

par Philippe Poulard

Technos Web

(pas de "bricolage") La technologie J2EE offre une approche beaucoup plus formelle pour le traitement des applications Web que les technologies alternatives apparentes (ASP, PHP, CGI, ISAPI, NSAPI) CGI Un processus par requte est lance sur le serveur Servlets Rsidentes pas de temps de lancement Multithreads Gestion de cache Connexions persistantes (BD) Plus efficaces Plus pratiques Plus puissantes Portables Gratuites On peut faire des choses impossibles raliser avec des scripts CGI C'est du Java !
a rame

Servlet & JSP


8

gratuit implment sur tous les serveurs Web supporte tous les langages (les utilisateurs l'utilisent surtout avec PERL) assez lent parfois difficile dvelopper Manque d'volutivit (plusieurs processus crs, serveur trs sollicit) Contournement : FastCGI : instance partage des programmes CGI mod_perl (Apache) : script CGI interprt et excut dans le serveur Web

par Philippe Poulard

Avantages de Java ct serveur

Servlet & JSP

Servlets plus pratiques : C'est du Java ! API pour grer : les cookies le suivi de session le protocole HTTP (headers HTTP)

Portabilit de Java Supportes sur tous les serveurs : Apache Microsoft IIS WebStar

Plus facile utiliser que CGI/PERL

Partage de donnes entre servlets Chanage de servlets Gestion de sessions

Inconvnient : Comme toutes les technos Web, l'interface graphique utilisateur est limite HTML

par Philippe Poulard

Requtes HTTP Contenu d'une requte HTTP

infos den-tte URL de la ressource donnes de formatage Requte GET : pour extraire des informations sur le serveur intgre les donnes de formatage l URL
http://www.inria.fr/hello?param1=value1&

Servlet & JSP

Requte POST : pour modifier les donnes sur le serveur donnes de la page assembles/envoyes vers le serveur

Traitement d'une requte par le serveur


Avec la requte HTTP, le serveur Web : identifie lenvironnement d exploitation charger (mapping) en fonction de l extension du fichier (.jsp , .cgi , .php...) ou du rpertoire o il se trouve ( cgi-bin/, servlet/) charge lenvironnement d excution (run-time) interprteur Perl pour les programmes CGI en Perl JVM pour les servlets Java

10

par Philippe Poulard

Utilisation d'une servlet

Une servlet doit implmenter linterface javax.servlet.Servlet soit directement, soit en drivant dune classe qui implmente dj cette interface (comme GenericServlet ou HttpServlet ) L'interface javax.servlet.Servlet possde les mthodes pour : initialiser la servlet : init() recevoir et rpondre aux requtes des clients : service() dtruire la servlet et ses ressources : destroy()
import javax.servlet.*; public class MyServlet implements Servlet { public void init(ServletConfig config) throws ServletException { // phase d'initialisation } public void service( ServletRequest req, ServletResponse rep) throws ServletException, IOException { // phase de traitement des requtes } public void destroy() { // phase d'arrt }

Servlet & JSP

11

par Philippe Poulard

Cycle de vie
moteur de servlet

dmarrage du serveur

cre un pool de Thread instancie la servlet initialise la servlet

Thread

Thread Servlet init()

Servlet & JSP

requte HTTP 1 requte HTTP 2 rponse HTTP 1 rponse HTTP 2


arrt du serveur

affecter un Thread affecter un Thread service() service()

terminer le pool de Thread dtruire la servlet destroy()

12

par Philippe Poulard

Utilisation d'une servlet Web

Une servlet Web tend la classe javax.servlet.http.HttpServlet (elle implmente javax.servlet.Servlet) Plusieurs mthodes spcifiques au protocole HTTP remplacent la mthode service(), qui appelle la mthode correspondant au type de requte : Mthode Type de requte HTTP GET POST PUT DELETE HEAD OPTIONS TRACE
import javax.servlet.*; import javax.servlet.http.*; public class SimpleServlet extends HttpServlet {

Servlet & JSP

doGet() doPost() doPut() doDelete() doHead() doOptions() doTrace()

public void init(ServletConfig c) throws ServletException { // phase d'initialisation } public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { // phase de traitement des requtes HTTP GET } public void destroy() { // phase d'arrt } public String getServletInfo() { // dlivre des informations sur la servlet } }

Une servlet doit redfinir au moins l'une de ces mthodes

13

par Philippe Poulard

Requtes et rponses HTTP dans une servlet

Les mthodes doGet(), doPost(), doPut(), doDelete(), doHead(), doOptions()et doTrace() utilisent des objets HttpServletRequest et HttpServletResponse passs en paramtres pour implmenter le service. javax.servlet.http.HttpServletRequest contient les renseignements sur le formulaire HTML initial : la mthode getParameter() rcupre les paramtres dentre javax.servlet.http.HttpServletResponse contient le flux de sortie pour la gnration de la page HTML rsultat la mthode getWriter() permet de l'obtenir
import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class MyServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Use "request" to read incoming HTTP headers (e.g. cookies) // and HTML form data (e.g. data the user entered and submitted) // Use "response" to specify the HTTP response line and headers // (e.g. specifying the content type, setting cookies). PrintWriter out = response.getWriter(); // Use "out" to send content to browser } }

Servlet & JSP


14

par Philippe Poulard

Exemple de servlet

import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class DateDuJour extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("plain/text"); PrintWriter out = response.getWriter(); out.println("Nous sommes le " + (new java.util.Date()).toString()); out.flush(); } }

Servlet & JSP

Web Explorer

Nous sommes le Fri Apr 4 10:00:00 MEST 2003

15

par Philippe Poulard

Rcupration des paramtres

Les paramtres sont crs par les formulaires HTML Visibles (GET) ou non (POST) Ces paramtres doivent tre dcods (CGI) tche prpare en amont avec les servlets !

Servlet & JSP

http://www.inria.fr/hello?param1=value1&

La mthode getParameter() de HttpServletRequest fonctionne indiffremment avec GET ou POST


public void doGet( HttpServletRequest req, HttpServletResponse rep) throws ServletException, IOException { Enumeration list = req.getParameterNames(); String value1 = req.getParameter("param1"); if(value1 == null) { // } // }

16

par Philippe Poulard

Cookies Cest quoi ?

Informations envoyes par le serveur, stocke sur le client et renvoyes par le client quand il revient visiter le mme URL Dure de vie rglable Permet d'avoir des donnes persistantes ct client

Servlet & JSP

Utilisations courantes
Identification des utilisateurs Eviter la saisie dinformations rptition (login, password, adresse, tlphone) Grer des prfrences utilisateur, profils

Cookie et scurit
Jamais interprt ou excut : pas de virus Pas partageable : le navigateur ne distribue le cookie qu'au serveur qui l'a mis Un cookie est limit 4KB et les navigateurs se limitent 300 cookies (20 par site) : pas de surcharge de disque Bien pour rendre prives des donnes non sensibles (pas n CB !) mais ne constitue pas un traitement srieux de la scurit

17

par Philippe Poulard Une API pour manipuler les cookies :

Gestion des Cookies

Classe : javax.servlet.http.Cookie crire/lire un cookie : addCookie(cookie), getCookies(), positionner des attributs dun cookie : Cookie#setXxx() caractres non autoriss : espace [ ] ( ) = , " / ? @ : ;

Servlet & JSP

Exemple d'envoi d'un cookie :


Cookie unCookie = new Cookie("nom", valeur); // ici positionnement des attributs si ncessaire response.addCookie(unCookie);

Attributs des cookies


getValue()/setValue() getName()/setName() getComment()/setComment() getMaxAge()/setMaxAge() : dlai restant avant expiration du cookie (en seconde) (par dfaut : pour la session courante) getPath()/setPath() : rpertoire o s'applique le cookie (rpertoire courant ou chemin spcifique)

18

par Philippe Poulard

Exemple de Cookie

Servlet & JSP

Cookie [] cookies = request.getCookies(); String nom = getCookieValue(cookies, "nom", "non trouv"); // public static String getCookieValue(Cookie [] cookies, String cookieName, String defaultValue) { for(int i=0; i < cookies.length; i++) { Cookie cookie = cookies[i]; if(cookieName.equals(cookie.getName()) return(cookie.getValue()); } return(defaultValue); }

19

par Philippe Poulard

Gestion des sessions

Servlet & JSP

Trs simple avec l'API des servlets Interface javax.servlet.http.HttpSession Un objet "session" peut tre associ avec chaque requte Il va servir stocker des informations temporairement Dure de vie limite et rglable si la session n'existe pas dj : true : cre l'objet false : renvoie null
HttpSession session = request.getSession(true); Caddy caddy = (Caddy) session.getValue("caddy"); if(caddy != null) { // le caddy n'est pas vide ! afficheLeContenuDuCaddy(caddy); } else { caddy = new Caddy(); // caddy.ajouterUnAchat(request.getParameter("NoArticle")); session.putValue("caddy", caddy); } //

getID() isNew()

Quelques mthodes :

getCreationTime()/getLastAccessedTime() getMaxInactiveInterval() getValue()/removeValue()/putValue() invalidate()

20

par Philippe Poulard

Porte des objets

Servlet & JSP

Scope objects Web context

Classe

Accessibilit depuis les composants web d'une application les composants web en rapport avec les requtes d'une session (maintient de l'tat client) les composants web en rapport avec une requte la page JSP qui a cr l'objet

javax.servlet.ServletContext

session

javax.servlet.http.HttpSession

request page

javax.servlet.ServletRequest

javax.servlet.jsp.PageContext

21

par Philippe Poulard

Partage de ressources
Contrle des accs concurrents donnes en mmoire fichiers connections aux bases de donnes connections aux rseaux

Servlet & JSP

public class Counter { private int counter; public Counter() { counter = 0; } public synchronized int getCounter() { return counter; } public synchronized int setCounter(int c) { counter = c; return counter; } public synchronized int incCounter() { return(++counter); } }

22

par Philippe Poulard

Pourquoi JSP ?

Servlet & JSP

import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWorld extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 " + "Transitional//EN\">\n" + "<html>\n<head><title>Hello World</title></head>\n" + "<body bgcolor=\"white\"><h1>Hello World</h1>\n"); out.println("<p>" + (new java.util.Date()).toString() + "</p>"); out.println("</body></html>"); } }

<%@ page contentType="text/html; charset=ISO-8859-1" %> <!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 " "Transitional//EN"> <html> <head> <title>Hello World</title> </head> <body bgcolor="white"> <h1>Hello World</h1> <p><%=(new java.util.Date()).toString() %></p> </body> </html>

23

Le conteneur gnre une servlet Java partir du code JSP, puis compile la classe. Cette opration n'est faite qu'une fois, et sera renouvele en cas de modification du code JSP.

par Philippe Poulard

Constitution d'une page JSP


Directives Dclaration de variable

<%@ page import="java.util.*,MyLocales" %> <%@ page contentType="text/html; charset=ISO-8859-5" %> <%! char c = 0; %> <html> <head> <title>Localized Dates</title> </head> <body bgcolor="white"> <jsp:useBean id="locales" scope="application" class="MyLocales"/> <form name="localeForm" action="index.jsp" method="post"> <b>Locale:</b> <select name=locale> <% String selectedLocale = request.getParameter("locale"); Iterator i = locales.getLocaleNames().iterator(); while (i.hasNext()) { String locale = (String)i.next(); if (selectedLocale != null && selectedLocale.equals(locale)) {%> <option selected><%=locale%></option> <% } else { %> <option><%=locale%></option> <% } } %> </select> <input type="submit" name="Submit" value="Get Date"> </form> <jsp:include page="date.jsp"/> </body> </html>

Servlet & JSP

Scriptlet

Expressions

Elements JSP

24

par Philippe Poulard

Directives JSP et actions Directives

<%@ <%@ <%@ <%@ <%@ <%@

page page page page page page

language="java" import="java.util.*, java.net.*" %> contentType="text/plain" %> session="true|false " %> errorPage="pathToErrorPage" %> isErrorPage="true|false" %>

Servlet & JSP

<%@ include file="chemin relatif du fichier" %>

Actions
<jsp:include page="relative URL" flush="true" />

inclusion au moment o la page est servie, pas au moment o elle est compile
<jsp:usebean id="name" class="package.class" />

permet d'instancier un bean depuis une page JSP. ncessite de connatre le mcanisme des beans... associ <jsp:getProperty /> et <jsp:setProperty />
<jsp:forward page="/unAutreURI" />

redirige vers un autre URI/URL


25

par Philippe Poulard


<jsp:usebean id="name" class="paquetage.class" scope="page|request|session|application" />

JavaBean dans les JSP


rfrence l'instance du composant nom qualifi de la classe porte

Lecture d'une proprit du bean :

<jsp:getProperty name="name" property="property" />

Modification d'une proprit du bean :


<jsp:setProperty name="name" property="property" value="value" />

Servlet & JSP

Initialise tous les attributs de l objet name avec les paramtres HTTP du mme nom
<jsp:setProperty name="name" property="*" />

<html> <body> <jsp:usebean id="test" class="SimpleBean" /> <jsp:setProperty name="test" property="message" value="Hello !!" /> <h1>Le message est : <i><jsp:getProperty name="test" property="message" /></i></h1> </body> </html>

Exemple

26

public class SimpleBean { private String message = "no message"; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }

par Philippe Poulard Nom de la variable application config Classe

Variables JSP prdfinies


Description l'application Web de la page JSP informations d'initialisation de la servlet JSP accessible seulement depuis les pages d'erreur le flot de sortie l'instance de la servlet JSP les composants web en rapport avec une requte la requte courante la rponse la session courante

javax.servlet.ServletContext

javax.servlet.ServletConfig

Servlet & JSP

exception out page pageContext request response session

java.lang.Throwable

javax.servlet.jsp.JspWriter

java.lang.Object

javax.servlet.jsp.PageContext

javax.servlet.ServletRequest

javax.servlet.ServletResponse

javax.servlet.http.HttpSession

27

par Philippe Poulard


http://java.sun.com/products/jsp/taglibraries.html

JSP Custom Tag

Des lments de langage dfinir pour les pages JSP Dclaration :


<%@ taglib uri="/WEB-INF/my-tag.tld" prefix="mt" %>

Utilisation :
<mt:tag> body </mt:tag>

Servlet & JSP

JSTL

JSP Standard Tag Library

<c:forEach var="item" items="${sessionScope.cart.items}"> // </c:forEach> <c:set var="bookId" value="${param.Remove}"/> <jsp:useBean id="bookId" type="java.lang.String" /> <% cart.remove(bookId); %> <sql:query var="books" dataSource="${applicationScope.bookDS}"> select * from PUBLIC.books where id = ? <sql:param value="${bookId}" /> </sql:query> <x:set var="abook" select="$applicationScope.booklist/ books/book[@id=$param:bookId]" /> <h2><x:out select="$abook/title"/></h2>

28

par Philippe Poulard

Dploiement d'une application Web


web.xml WEB-INF welcome.jsp

<web-app> <display-name> tomcat webapps yourApp My web app </display-name> <description>A web app</description> <session-config> <session-timeout>60>/session-timeout> </session-config> myApp <servlet> <servlet-name>MyServlet</servlet-name> <servlet-class> MyServlet.class </servlet-class> <init-param> <param-name>foo</param-name> <param-value>bar</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern> /MyServlet </url-pattern> </servlet-mapping> <error-page> <exception-type> exception.DocNotFoundException </exception-type> <location>/error.html</location> </error-page> </web-app>

Descripteur de dploiement

MyServlet.class WEB-INF classes YourServlet.class

Servlet & JSP

myApp.jar lib YourApp.jar web.xml http://www.foo.com/myApp/MyServlet document.jsp

error.html

prsentation.xml

On peut zipper le tout dans une Web archive (myApp.war)

String xmlFileName = servletContext.getRealPath("/prsentation.xml")

29

/tomcat/webapps/myApp/prsentation.xml

par Philippe Poulard

Serveurs de servlet

Servlet & JSP

Serveurs de servlet Apache Tomcat Allaire Jrun New Atlanta Server Exec Sun Java Web Server...

Plate-forme de dveloppement Java Web Services Developer Pack

30

par Philippe Poulard

Servlet & JSP


31

Philippe.Poulard@sophia.inria.fr

par Philippe Poulard

Gnse JSP
Les applications deviennent centres sur les pages (JSPcentric) Architecture JSP "Model 1"

Servlet
Comme les CGI Production de HTML avec println()
Rapport - Web Explorer 54% 31% 15% charcuterie fromages primeurs

Servlet & JSP

Cette anne, la croissance est au rendez-vous ...

Architecture JSP "Model 1"


1 Request Response 4 2 3 Serveur Web JSP Data sources SGBD

L Les JSP doivent aussi prendre en charge le contrle des flux L Mixit de logique & prsentation

JavaBean

32

Meilleure approche : faire cooprer Servlet et JSP

Serveur d'application

par Philippe Poulard Modularisation Couplage faible Couvertures fonctionnelles spcifiques

MVC appliqu au Web


Model View - Controler

Servlet & JSP

Architecture JSP "Model 2"


Serveur Web Data sources SGBD Model JavaBean

Controler Request 1 3 5 Response JSP View Servlet

In st a 2 ncie

33

Serveur d'application

par Philippe Poulard

Le modle

Etat du systme Logique mtier

Servlet & JSP

Actions

Informations d'tat (JavaBean)

JavaBean autonome communiquant

Entity Enterprise JavaBean LDAP Server RDBMS

34

par Philippe Poulard CD.java


public class CD { private String album=""; private String artist=""; private float price=0; private int quantity=0; public CD() {} public void setAlbum( String album ) { this.album = album; } public String getAlbum() { return this.album; } public void setArtist( String artist ) { this.artist = artist; } public String getArtist() { return this.artist; } public void setPrice( float price ) { this.price = price; } public float getPrice() { return this.price; } public void setQuantity( int quantity ) { this.quantity = quantity; } public int getQuantity() { return this.quantity; }

Le modle : exemple de JavaBean


setAlbum() getAlbum()

CD
album artist quantity price

setArtist() getArtist() setPrice() getPrice() setQuantity() getQuantity()

Servlet & JSP

public boolean equals(Object o) { if (o instanceof CD) { CD cd = (CD) o; return this.album.equals(cd.album) && this.artist.equals(cd.artist); } return false; } public int hashCode() { return this.album.hashCode() ^ this.artist.hashCode(); } }

35

par Philippe Poulard

La vue

JSP Velocity XSLT

Template text + contenu dynamique Tags tels que <jsp:useBean> + custom tag libraries JSTL

Servlet & JSP

XML XSLT : transformations cross-media XSLT

Application

WML WAP
Web

HTML
36

PDF

par Philippe Poulard

La vue : exemple JSP


Shop.jsp

<%@page session="true" import="java.util.*, CD"%> <% Vector buyList = (Vector) session.getValue("shopping.cdCart"); if (buyList != null && (buyList.size()>0)) {%> <table border="2"> <%@page session="true"%> <tr><th>Album</th> <html> <th>Artiste</th> <head><title>Music shopping</title></head> <th>Prix</th> <body> <th>Quantit</th> <h1>Music shopping</h1> <th></th></tr> <form name="shopping" action="/cd/CdShopServlet" method="post"> <% for (int i=0; i<buyList.size();i++) { <b>CD :</b> CD cdOrder = (CD) buyList.elementAt(i);%> <select name="CD"> <tr><td><%=cdOrder.getAlbum()%></td> <option>Red hot chili peppers|Californication|16.95</option> <td><%=cdOrder.getArtist()%></td> <option>U2 |The joshua tree|14.95</option> <td><%=cdOrder.getPrice()%></td> <option>Rolling stones |best of |18.95</option> <td><%=cdOrder.getQuantity()%></td> <option>Radiohead |OK computer |15.95</option> <td><form name="deleteForm" </select> action="/cd/CdShopServlet" <b>quantit :</b> method="post"> <input type="text" name="qty" size="3" value="1"> <input type="submit" <input type="hidden" name="action" value="ADD"> value="Supprimer"> <input type="submit" name="submit" value="Ajouter au panier"> <input type="hidden" </form> name="delIndex" <jsp:include page="Cart.jsp" flush="true"/> value="<%=i%>"> </body> <input type="hidden" </html> name="action" * value="DELETE"> </form></td></tr> <% }%> </table> Music shopping - Web Explorer <p> <form name="checkout" action="/cd/CdShopServlet" method="post"> quantit : 1 <input type="hidden" name="action" value="CHECKOUT"> CD : Red hot chili peppers|Californication|16.95 <input type="submit" value="Commander"> Ajouter au panier </form> </p> Album Artiste Prix Quantit <% }%>

Servlet & JSP

Music shopping

Cart.jsp
37

best of OK computer

Rolling stones Radiohead

18.95 15.95

2 1

Supprimer Supprimer

par Philippe Poulard

Le contrleur

Servlet Struts XCL

Approche dclarative Approche procdurale

Servlet & JSP

Traite les requtes entrantes Invoque les composants appropris

38

par Philippe Poulard

Le contrleur : exemple servlet


CdShopServlet.java

39

import java.util.*; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import CD; public class CdShopServlet extends HttpServlet { public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOExcpetion { HttpSession session=req.getSession(false); if (session==null) { res.sendRedirect("error.html"); } Vector buyList= (Vector) session.getValue("shopping.cdCart"); String action = req.getParameter("action"); if ("CHECKOUT".equals(action)) { // order stuff here } else { if ("DELETE".equals(action)) { String del = req.getParameter("delIndex"); int d = Integer.parseInt(d); buyList.removeElementAt(d); } else if ("ADD".equals(action)) { CD newCd = getCD(req); int index = buyList.indexOf(newCd); private CD getCD(HttpServletRequest req) { if ( index!=-1) { String theCd = req.getparameter("CD"); CD cd = (CD) buyList.elementAt(index); String qty = req.getparameter("qty"); cd.setQuantity(cd.getQuantity()+newCd.getQuantity()); StringTokenizer t = } else { new StringTokenizer(theCd, "|"); buyList.addElement(newCd); CD cd = new CD(); } cd.setArtist(t.nextToken()); } cd.setAlbum(t.nextToken()); session.putValue("shopping.cdCart", buyList); int p = Integer.parseInt(t.nextToken()); String url="/cd/Shop.jsp"; cd.setPrice(p); ServletContext ctxt = getServletContext(); cd.setQuantity(Integer.parseInt(qty)); RequestDispatcher rd = ctxt.getRequestDispatcher(url); return cd; rd.forward(req, res); } } } }

Servlet & JSP

par Philippe Poulard Model : logique d'accs aux donnes View : page JSP qui assemble en HTML le rsultat Controler : servlet qui interprte les requtes du client

Publication Web avec une architecture MVC


Dveloppeur Web Dcode les requtes Rcupre les donnes brutes Applique les transformations XSLT Se connecte aux sources de donnes Accde aux donnes Programmeur du Systme dInformation Model

Servlet & JSP

Controler
Web

requte PDF rponse JSP View

XHTML

Rcupre les donnes calcules Les insre dans la page HTML Web designer
40

<html xmlns="http://www.w3.org/1999/xhtml"> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "xhtml1-strict.dtd"> <head> <title> <%=request.getAttribute("title")%> </title> <%=request.getAttribute("meta-datas")%> </head> <body background="fond.jpg"> <img src="logo.gif"/> <%=request.getAttribute("toolbar")%> <%=request.getAttribute("content")%> </body> </html>

Vous aimerez peut-être aussi