Title: Programmation Web
1Programmation Web
2HTTP 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) throws
ServletException, IOException
response.setContentType("text/plain")
PrintWriter out response.getWriter()
out.println("HTTP Hello World!") public
String getServletInfo() return "HTTP Hello
World Servlet"
Lobjet réponse permet dobtenirle flux de
sortie en écriture
3HelloWorld JSP
- Entrelacer le code HTML et le code Java
Le fichier hello.jsp
Début du code
lthtmlgt ltbody bgcolor"white"gt lt
out.println("Hello World") gt lt/bodygt lt/htmlgt
out correspond au writer surle flux de sortie en
écriture
Fin du code
4Fichier de configuration
- Le fichier web.xml correspondant
lt?xml version"1.0" encoding"ISO-8859-1"?gt lt!DOCT
YPE web-app PUBLIC "-//Sun Microsystems,
Inc.//DTD Web Application 2.3//EN"
"http//java.sun.com/dtd/web-app_2_3.dtd"gt ltweb-ap
pgt ltdisplay-namegtAppli de Demolt/display-namegt
ltdescriptiongtCeci est une série de servlets
de démolt/descriptiongt lt/web-appgt
Rien, lassociation.jsp ? définir une JSP est
automatique
5Traduction 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().
6Traduction 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/htmlcharsetISO-885
9-1") pageContext _jspxFactory.getPageCon
text(this, request, response, null,
true, 8192, true) application
pageContext.getServletContext() config
pageContext.getServletConfig() session
pageContext.getSession() out
pageContext.getOut()
out.write("lthtmlgt\r\n ") out.write("ltbody
bgcolor\"white\"gt\r\n ")
out.println("Hello World") out.write("\r\n
") out.write("lt/bodygt\r\n")
out.write("lt/htmlgt") catch (Throwable t)
pageContext.handlePageException(t)
finally if (_jspxFactory ! null)
_jspxFactory.releasePageContext(pageContext)
7Hello 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 dExpression
9Directives JSP
Version XML
- ltjspdirective /gt ou lt_at_ gt
- Elles permettent de changer la façon de traduire
les pages JSP - Ils existent différents types directive de page
(sur la JSP)directive dincludedirective de
taglib
10Directive de page
Directive de page
par ex Java
- lt_at_ page languagescriptingLanguage
- extendsclassName
importimportList
sessiontruefalse
buffernonesizekb
autoFlushtruefalse
isThreadSafetruefalse
infoinfo_text errorPageerror_ur
l isErrorPagetruefalse
contentTypectinfo
pageEncodingpeinfo
isELIgnoredtruefalsegt
La JSP étend la classe
Liste de import Java
Utilise une session
taille du buffer réponse
Flush la réponse
Nest pas synchronizé
Redirige les erreurs
Est appelé en cas derreur
Langage de script (JSP 2.0)
11Commentaire
- Les balises lt-- et --gt spécifie des
commentaires non traduits
lthtmlgt ltbody bgcolor"white"gt lt!--
commentaire visible en HTML --gt lt--
commentaire invisible en HTML --gt lt
out.println("Hello World") gt lt/bodygt lt/htmlgt
12JSP Déclaration
- ltjspdeclaration /gt ou lt! gt
- Permet de déclarer
- Des variables dinstance de JSP(? dinstance de
servlet) - Des méthodes
13JSP Scriplet
- ltjspscriplet /gt ou lt gt
- Permet dinclure du code dans la JSP
lthtmlgt ltbody bgcolor"white"gt lt for(int
i0ilt5i) gt Hello Worldltbrgt lt
gt lt/bodygt lt/htmlgt
14JSP Expression
- ltjspexpression /gt ou lt gt
- Permet laffichage de valeur dune expression
lt_at_ page import"java.util." gt lthtmlgt ltbody
bgcolor"white"gt lth1gtHeaderslt/h1gt ltdlgt lt
for (Enumeration e request.getHeaderNames()
e.hasMoreElements()) String name
(String) e.nextElement() gt ltdtgtlt
name gtlt/dtgt ltddgtlt request.getHeader(name)
gtlt/ddgt lt gt lt/bodygt lt/htmlgt
15Affichage des Headers
- Afficher les headers de la requête
lt_at_ page import"java.util." gt lthtmlgt ltbody
bgcolor"white"gt lth1gtHeaderslt/h1gt ltdlgt lt
for (Enumeration e request.getHeaderNames()
e.hasMoreElements()) String name
(String) e.nextElement() gt ltdtgtlt
name gtlt/dtgt ltddgtlt request.getHeader(name)
gtlt/ddgt lt gt lt/bodygt lt/htmlgt
16Cycle de vie dune 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.
17Un compteur de visite
- Cycle de vie et directive dun compteur de page
Directive de page
pas obligatoire car les préférences sont
synchronizés
lt_at_ page import"java.util.prefs."
contentType"text/html"
isThreadSafe"false"gt lt! private Preferences
pref public void jspInit()
prefPreferences.userNodeForPackage(getClass())
public void jspDestroy() try
pref.sync() catch(BackingStoreException e)
getServletContext().log("can't save
prefs",e) prefnull gt
lthtmlgt ltbody bgcolor"white"gt lt int
counterpref.getInt("counter", 0) gt Page
accédée lt counter gt lt
pref.putInt("counter", counter) gt
lt/bodygt lt/htmlgt
Expression
Scriptlet
18Include Forward
- mêmes restrictions que pour les servlets
- Forward ltjspforward page"page.html"/gt
- Include ltjspinclude page"page.html"/gt lt_at_
include file"fichier.html"/gt
19Deux types dagrégations
- lt_at_ include file... gteffectuer lors de la
traduction, relatif au fichier, le contenu est
traduit. - ltjspinclude page /gteffectuer lors de
lexécution de la requête, relatif à la page
courante.
20Include Forward (2)
- ltjspparam ... /gt permet dajouter des paramètres
à un include ou un forward
ltjspforward page"parameters.jsp"gt ltjspparam
name"nouveauParamètre" value"toto"/gt
lt/jspforwardgt
21JSP et Objet
- Le tag jspuseBean permet de déclarer (et
dallouer) des objet java dans les JSP - Le tag jspgetProperty permet dobtenir la valeur
dune propriété suivant la norme java beans - Le tag jspsetProperty permet de changer la
valeur dune propriété dun objet
22JSP et Objet (2)
- Utilisation dun objet dans une JSP
lthtmlgt ltbody bgcolor"white"gt ltjspuseBean
id"myBean" scope"session" class"fr.umlv.jsp.dem
o.MyBean"/gt lth1gt ltjspgetProperty
name"myBean" property"name"/gt lt/h1gt
ltjspsetProperty name"myBean" property"name"
param"username"/gt lthrgt ltform
enctype"application/x-www-form-urlencoded"
action"bean.jsp" methodGETgt Nom
ltinput typetext size20 name"username"gt
ltbrgt ltinput typesubmit
value"Envoi"gt lt/formgt lt/bodygt lt/htmlgt
Récupère le paramètre username
package fr.umlv.jsp.demo public class MyBean
public String getName() return name
public void setName(String name) this.name
name private String name
23JSP et Objet (3)
- Le paramètre est stocké dans lobjet
paramètre username
Formulaire méthode GET
24Bean 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
25Scope Exemple
- Déclaration et récupération des valeurs
lthtmlgt ltbody bgcolor"white"gt
lth2gtBeforelt/h2gt ltjspinclude
page"beanIncludeScope.jsp"/gt ltjspuseBean
id"myBean1" scope"page" class"fr.umlv.jsp.demo.
MyBean"/gt ltjspuseBean id"myBean2"
scope"request" class"fr.umlv.jsp.demo.MyBean"/gt
ltjspuseBean id"myBean3" scope"session"
class"fr.umlv.jsp.demo.MyBean"/gt ltjspuseBean
id"myBean4" scope"application"
class"fr.umlv.jsp.demo.MyBean"/gt
ltjspsetProperty name"myBean1" property"name"
value"page"/gt ltjspsetProperty name"myBean2"
property"name" value"request"/gt
ltjspsetProperty name"myBean3" property"name"
value"session"/gt ltjspsetProperty
name"myBean4" property"name" value"appplication
"/gt lth2gtAfterlt/h2gt ltjspinclude
page"beanIncludeScope.jsp"/gt lt/bodygt lt/htmlgt
26Scope Exemple (2)
- Déclaration et modification de variables
ltjspuseBean id"myBean1" scope"page"
class"fr.umlv.jsp.demo.MyBean"/gt ltjspuseBean
id"myBean2" scope"request" class"fr.umlv.jsp.de
mo.MyBean"/gt ltjspuseBean id"myBean3"
scope"session" class"fr.umlv.jsp.demo.MyBean"/gt
ltjspuseBean id"myBean4" scope"application"
class"fr.umlv.jsp.demo.MyBean"/gt ltdlgt
ltdtgtmyBean1 lt/dtgt ltddgt ltjspgetProperty
name"myBean1" property"name"/gt lt/ddgt
ltdtgtmyBean2 lt/dtgt ltddgt ltjspgetProperty
name"myBean2" property"name"/gt lt/ddgt
ltdtgtmyBean3 lt/dtgt ltddgt ltjspgetProperty
name"myBean3" property"name"/gt lt/ddgt
ltdtgtmyBean4 lt/dtgt ltddgt ltjspgetProperty
name"myBean4" property"name"/gt lt/ddgt lt/dlgt
27Scope Exemple (3)
- Valeurs des variables suivants le scope
Session/application reste après reload
page ne passe pas les include
Reload
28Objet 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
derreurs
29La 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, SESS
ION_SCOPE, APPLICATION_SCOPE - Recherche dans les scopes
- Object getAttribute(String name)
- void setAttribute(String name, Object o)
- void removeAttribute(String name)
30Initialiser une JSP
31Récupération des erreurs
- Plusieurs types derreurs - erreurs de
traduction (pas récupérable)- erreurs
dexécution (récupérable) - Une page déclare posséder une page derreur
- Déclaration être une page derreur
32Récupération des erreurs (2)
lt_at_ page errorPage"/error.jsp" gt lthtmlgt ltbody
bgcolor"white"gt lt // oops Object
onull o.toString() gt lt/bodygt lt/htmlgt
est une page derreur
lt_at_ page isErrorPage"true"
import"java.io." contentType"text/pla
in" gt lt exception.printStackTrace( new
PrintWriter(out)) gt
Redirige les erreurs versla page error.jsp
33Traduction 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/htmlcharsetISO-885
9-1") pageContext _jspxFactory.getPageCon
text(this, request, response, null,
true, 8192, true) application
pageContext.getServletContext() config
pageContext.getServletConfig() session
pageContext.getSession() out
pageContext.getOut()
out.write("lthtmlgt\r\n ") out.write("ltbody
bgcolor\"white\"gt\r\n ")
out.println("Hello World") out.write("\r\n
") out.write("lt/bodygt\r\n")
out.write("lt/htmlgt") catch (Throwable t)
pageContext.handlePageException(t)
finally if (_jspxFactory ! null)
_jspxFactory.releasePageContext(pageContext)
34Interaction JSP/Servlet
- Application web gérant un panier dachat
35Interaction JSP/Servlet (2)
- Architecture de lapplication
Basket
Article
session
new
add/remove
BasketActionServlet /add /remove
getProductList
Forward
HTTP POST
article"manteau"
HTTP POST
article"voiture"
JSP
JSP
Servlet
36Interaction JSP/Servlet (3)
- Les classes Article et Basket
public class Article public Article(String
name) this.namename public String
getName() return name public int
getPrice() int price0 for(int
i0iltname.length()i) pricename.charAt(
i) return price public boolean
equals(Object o) return name.equals(((Articl
e)o).name)
public static String getProductList()
return new String "manteau","velo","cour
gette", "edredon" private String
name
public class Basket public void add(Article
article) list.add(article) public
void remove(Article article)
list.remove(article) public Iterator
iterator() return list.iterator()
private final ArrayList listnew ArrayList()
37Interaction JSP/Servlet (4)
lt_at_ page import"java.util.,fr.umlv.jsp.demo."
gt lthtmlgtltbody bgcolor"white"gt lth1gtAjouter un
Article au Panierlt/h1gt lttablegt lt
String productsArticle.getProductList()
for (int i0iltproducts.lengthi)
Article articlenew Article(productsi) gt
lttrgt lttdgtlt article.getName()
gtlt/tdgtlttdgtlt article.getPrice() gtlt/tdgt
lttdgt ltform enctype"application/x-www-form-
urlencoded" action"add"
method"POST"gt ltinput type"hidden"
name"article" value"lt article.getName() gt"gt
ltinput type"submit" value"Ajouter"gt
lt/formgt lt/tdgtlt/trgt lt gt lt/tablegt
lta href"basket-list.jsp"gtVisualiser le
panierlt/agt lt/bodygtlt/htmlgt
38Interaction JSP/Servlet (5)
lt_at_ page import"java.util.,fr.umlv.jsp.demo."
gt lthtmlgtltbody bgcolor"white"gt lth1gtContenu du
Panierlt/h1gt ltjspuseBean id"basket"
class"fr.umlv.jsp.demo.Basket"
scope"session"/gt lt int total0 gt
lttablegt lt for (Iterator itbasket.iterator(
)it.hasNext()) Article article
(Article) it.next() gt lttrgt
lttdgtlt article.getName() gtlt/tdgt lttdgtlt
article.getPrice() gtlt/tdgt lttdgt
ltform enctype"application/x-www-form-urlencoded"
action"remove"
method"POST"gt ltinput type"hidden"
name"article" value"lt article.getName() gt"gt
ltinput type"submit" value"Enlever"gt
lt/formgt
lt/tdgt lt/trgt lt totalarticle.getPr
ice() gt lttrgt lttd
colspan"3"gtlthrgtlt/tdgt lt/trgt lttrgt
lttdgtTotallt/tdgtlttdgtlt total gtlt/tdgt lt/trgt
lt/tablegt lta href"product-list.jsp"gtListe
des produitslt/agt lt/bodygtlt/htmlgt
39Interaction JSP/Servlet (6)
- La servlet BasketActionServlet
public class BasketActionServlet extends
HttpServlet protected void doPost(HttpServletR
equest request, HttpServletResponse response)
throws ServletException, IOException
HttpSession sessionrequest.getSession()
Basket basket(Basket)session.getAttribute("basket
") if (basketnull) basketnew
Basket() session.setAttribute("basket",bask
et) Article articlenew
Article(request.getParameter("article"))
String urirequest.getRequestURI()
if (uri.endsWith("add")) basket.add(article)
else basket.remove(article)
getServletContext().getRequestDispatcher("/basket/
basket-list.jsp"). forward(request,response)