Architectures Java Accès BD Plan
Transcript of Architectures Java Accès BD Plan
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
Architectures n-tiers et applications WebOutilsJava et applications WebServletsÉtat d’un servletLes JSPAccès aux BD avec servletsConception
Plan174
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
JSP: qu’est-ce que c’est ?Standard pour construire des applications Web
‣ permet de générer dynamiquement du HTML‣ de manière portable‣ avec une syntaxe empruntée à Java
Équivalent à ASP et PHP‣ plus “propre” et langage plus évolué pour la partie dynamique
que PHP‣ plus portable et langage plus évolué pour la partie dynamique
que ASP
Spécification‣ version 2.3 actuellement
Nombreuses librairies: taglibs
175
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
JSP et servletsTous deux basés sur JavaLes servlets sont peu adaptés à la génération de contenuLes JSP sont peu adaptées à la gestion de la logique de l’application et à l’extension de fonctions du serveurUne page JSP contient
‣ un modèle de document statique (code HTML)‣ des fragments de code Java contenus dans des balises
spécifiques pour exécuter une partie de la logique applicative
Plus facile d’écrire, de lire et de gérer le code HTMLPossibilité d’utiliser des outils
176
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
JSP et servlets (cont.)Séparer les tâches de développement
‣ une équipe/personne JSP‣ une équipe/personne Servlet‣ une équipe/personne SGBD
Séparer le code chargé de créer le contenu de celui chargé de le présenter
‣ premiers pas vers le modèle MVC
C’est un fichier texte (.jsp) qui est traduit en servlet, compilé, puis instancié lors de l’invocation de l’URLÀ retenir: JSP est du côté serveur !
177
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
Principe de fonctionnement178
La page JSP demandée est-elle
chargée?
Traduire le code enservlet source
Compiler et chargerle servlet
Exécuter leservlet
Réponse JSP
Requête client
Le fichier .jsp
a-t-il été modifiédepuis la dernière
traduction ?
oui
oui
non
non
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
Principe de fonctionnement (cont.)179
Req 1 Req 2 Req 3 Req 4 Req 5 Req 6
Page JSP traduite
Oui Non Non Non Oui Non
Servlet compilé
Oui Non Non Non Oui Non
Servlet instancié et chargé en mémoire
du serveur
Oui Non Oui Non Oui Non
init Oui Non Oui Non Oui Non
doGet Oui Oui Oui Oui Oui Oui
Page créée pour la première fois
Redém
arrage serveur
Page modifiée
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
C’est utilisé ?Parmi les 10 sites les plus populaires
‣ Google: technologie maison + Java‣ Yahoo: PHP et Java‣ MySpace: ColdFusion (Java en sous-main)‣ YouTube: Flash, Python, Java‣ EBay: Java‣ AOL: Java‣ Twitter
Nombre de pages Web utilisant JSP: 568 millions
Sources: alexa.com (2011), w3techs.com, Google
180
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
C’est utilisé ? (cont.)KLM, British Airways,…Avis, Hertz,…NY Stock Exchange, Bank of America,…Ikea, Nike, Orange,…Parties de GoogleEBayPayPal
181
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
Syntaxe des éléments de baseTexte HTML
‣ <H1>Le titre</H1>
Les commentaires HTML‣ <!-- commentaire HTML -->
Les commentaires JSP‣ <%-- commentaire JSP --%>
Échappement de <%‣ <\%
182
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
Types d’éléments dans une JSPExpressions: <%=…%>
‣ une expression est évaluée, transformée en chaîne et incluse dans la page
Scriplets: <%…%>‣ fragment de code Java exécuté dans la page
Déclarations: <%!…%>‣ déclaration de variables ou de méthodes utilisables dans la
page
Directives: <%@…%>‣ instruction pour le moteur JSP (page et include)
183
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
ExpressionsFormat: <%= … %>
‣ pour évaluer une expression ou un objet Java
Résultat‣ se transforme en out.print(…) dans la méthode _jspService du
servlet
Exemple‣ date: <%= new java.util.Date() %>‣ hôte: <%= request.getRemoteHost() %>
Syntaxe compatible XML‣ <jsp:expression>Java expression</jsp:expression>‣ on ne peut pas mélanger les syntaxes dans une même page
184
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
Correspondance JSP/servletJSP
Code du servlet
185
<H1>Un nombre aléatoire</H1><%= Math.random() %>
public void _jspService(HttpServletRequest request, ! ! ! ! ! ! ! ! ! ! ! ! ! HttpServletResponse response) ! ! ! ! throws ServletException, IOException { ! response.setContentType("text/html"); ! HttpSession session = request.getSession(true); ! JspWriter out = response.getWriter(); ! out.println("<H1>Un nombre aléatoire</H1>"); ! out.println(Math.random()); ! ... }
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
Exemple186
<HTML>...<BODY> ! <H2>Expressions</H2> ! <UL> ! ! <LI>Date actuelle: <%= new java.util.Date() %> ! ! <LI>Serveur: <%= application.getServerInfo() %> ! ! <LI>Session ID: <%= session.getId() %> ! ! <LI>Valeur de <CODE>testParam</CODE>: ! ! ! ! <%= request.getParameter("testParam") %> ! </UL> </BODY></HTML>
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
Variables prédéfiniesrequest
‣ HttpServletRequest
response‣ HttpServletResponse
out‣ l’objet Writer utilisé pour retourner le contenu au client
session‣ HttpSession associée à la requête (sauf si désactivé)
application‣ ServletContext (pour le partage de données) obtenu via
getServletContext()
187
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
Comparaison JSP/servletExemple des paramètres
188
public class AfficheParam extends HttpServlet { ! public void doGet(HttpServletRequest request, ! ! ! ! ! ! ! ! ! ! ! HttpServletResponse response) ! ! ! ! ! ! ! throws ServletException, IOException { ! ! ... ! ! out.println(docType + "<HTML>\n" + "<HEAD><TITLE>"+title + ! ! ! ! ! "</TITLE></HEAD>\n" + "<BODY BGCOLOR=\"#FDF5E6\">\n" + ! ! ! ! ! "<H1 ALIGN=\"CENTER\">" + title + "</H1>\n" + "<UL>\n"+ ! ! ! ! ! " <LI><B>param1</B>: " ! ! ! ! ! + request.getParameter("param1")+ "\n" + ! ! ! ! ! " <LI><B>param2</B>: " ! ! ! ! ! + request.getParameter("param2")+ "\n" + ! ! ! ! ! " <LI><B>param3</B>: " ! ! ! ! ! + request.getParameter("param3")+ "\n" + ! ! ! ! ! "</UL>\n" + "</BODY></HTML>"); ! } }
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
Comparaison JSP/servlet (cont.)Résultat
189
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
Comparaison JSP/servlet (cont.)190
<!DOCTYPE ...> <HTML> ! <HEAD> ! ! <TITLE>Affichage de 3 paramètres en JSP</TITLE> ! ! <LINK REL=STYLESHEET HREF="JSP-Styles.css" TYPE="text/css"> ! </HEAD> ! <BODY> ! ! <H1>Les paramètres</H1> ! ! <UL> ! ! ! <LI><B>param1</B>: ! ! ! ! <%= request.getParameter("param1") %> ! ! ! <LI><B>param2</B>: ! ! ! ! <%= request.getParameter("param2") %> ! ! ! <LI><B>param3</B>: ! ! ! ! <%= request.getParameter("param3") %> ! ! </UL> </BODY></HTML>
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
ScripletsFormat: <% code Java … %>
‣ contient du code Java valide
Résultat‣ le code est inséré tel quel dans _jspService du servlet
Exemple‣ <%
String donneesReq = requete.getQueryString(); out.println(“Données GET: “+ donneesReq);%>
Syntaxe compatible XML‣ <jsp:scriplet>code Java</jsp:scriplet>
191
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
Scriplets (cont.)JSP
Code du servlet
192
<H2>foo</H2><%= bar() %><% baz(); %>
public void _jspService(HttpServletRequest request, ! ! ! ! ! ! ! ! ! ! ! ! ! HttpServletResponse response) ! ! ! ! throws ServletException, IOException { ! response.setContentType("text/html"); ! HttpSession session = request.getSession(); ! JspWriter out = response.getWriter(); ! out.println("<H2>foo</H2>"); ! out.println(bar()); ! baz(); ! ... }
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
Scriplets (cont.)Exemple: un utilisateur peut modifier la couleur de fond de la pagePremière version
Problème ?
193
<BODY BGCOLOR= "<%= request.getParameter("bgColor") %>">
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
Scriplets (cont.)Version améliorée
Appel: http://localhost/bgColor.jsp[?bgColor=C0C0C0]
194
<!DOCTYPE ...> <HTML> <HEAD> ! <TITLE>Test couleur</TITLE> </HEAD> <% String bgColor = request.getParameter("bgColor"); if ((bgColor == null) || (bgColor.trim().equals(""))) { ! bgColor = "WHITE"; } %> <BODY BGCOLOR="<%= bgColor %>"> <H2 ALIGN="CENTER">Couleur de fond: "<%= bgColor %>"</H2> </BODY></HTML>
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
Scriplets (cont.)Utiliser les scriplets pour faire du JSP conditionnel
‣ possible, mais pas forcément recommandé
Exemple
Résultat
195
<% if (Math.random() < 0.5) { %> Have a <B>nice</B> day! <% } else { %> Have a <B>lousy</B> day! <% } %>
if (Math.random() < 0.5) { ! out.println("Have a <B>nice</B> day!"); } else { ! out.println("Have a <B>lousy</B> day!"); }
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
DéclarationsFormat: <%! code Java … %>
Résultat‣ le code est inséré tel quel dans la classe du servlet
Exemple‣ <%! private int toto = 5 %> ‣ <%! private void methodeBlabla() {…} %>
Conception‣ intéressant pour les attributs, moins pour les méthodes
Syntaxe compatible XML‣ <jsp:declaration>code Java</jsp:declaration>
196
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
Déclarations (cont.)JSP
Résultat
197
<H1>Some Heading</H1> <%! private String randomHeading() { ! return("<H2>"+ Math.random() + "</H2>"); } %> <%= randomHeading() %>
public class xxxx implements HttpJspPage { ! private String randomHeading() { ! ! return("<H2>" + Math.random() + "</H2>"); ! } ! public void _jspService(…) throws … { ! ! response.setContentType("text/html"); ! ! HttpSession session = request.getSession(true); ! ! JspWriter out = response.getWriter(); ! ! out.println("<H1>Some Heading</H1>"); ! ! out.println(randomHeading()); ! ! ... ! } }
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
Déclarations (cont.)Exemple
198
<!DOCTYPE ...> <HTML> <HEAD> <TITLE>Declarations JSP</TITLE> <LINK REL=STYLESHEET HREF="JSP-Styles.css" TYPE="text/css"> </HEAD> <BODY> <H1>Declarations</H1> <%! private int accessCount = 0; %> <H2>Nombre d’accès à la page depuis le démarrage: <%= ++accessCount %></H2> </BODY></HTML>
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
Cycle de vieUne page JSP a un cycle de vie comparable au servlet
‣ en fait, c’est un servlet !‣ init()‣ service()‣ destroy()
Problème: un servlet a déjà ses propres méthodes‣ utiliser la surcharge pose des problèmes‣ illégal d’utiliser des déclarations JSP pour déclarer init et destroy
À la place‣ jspInit‣ jspDestroy
199
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
ComparaisonScriplets, déclarations, expressions: lequel utiliser ?Tâche 1:
‣ afficher une liste de 5 nombres aléatoires entre 1 et 10
Tâche 2‣ afficher une liste de 1 à 10 nombres aléatoires entre 1 et 10
Tâche 3‣ générer un nombre aléatoire à la première requête, et afficher
ce nombre à tous les utilisateurs jusqu’à ce que le serveur soit redémarré
200
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
Tâche 1La structure de la page est fixe, donc une expression suffit
201
public class MesUtilitaires { ! public static int randomInt(int range) { ! ! return(1 + ((int)(Math.random() * range))); ! } ! public static void main(String[] args) { ! ! int range = 10; ! ! try { ! ! ! range = Integer.parseInt(args[0]); ! ! } catch(Exception e) { // Array index or number format ! ! } ! ! for(int i=0; i<100; i++) { ! ! ! System.out.println(randomInt(range)); ! ! }! }}
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
Tâche 1 (cont.)202
<!DOCTYPE ...> <HTML> <HEAD> ! <TITLE>Nombres</TITLE> </HEAD> <BODY> ! <H1>Nombres aléatoires</H1> ! <UL> ! ! <LI><%= MesUtilitaires.randomInt(10) %> ! ! <LI><%= MesUtilitaires.randomInt(10) %> ! ! <LI><%= MesUtilitaires.randomInt(10) %> ! ! <LI><%= MesUtilitaires.randomInt(10) %> ! ! <LI><%= MesUtilitaires.randomInt(10) %> ! </UL> </BODY></HTML>
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
Tâche 2Le nombre de lignes est dynamique, donc on utilise les scriplets
203
<!DOCTYPE ...> <HTML> <HEAD> ! <TITLE>Liste nombres</TITLE> </HEAD> <BODY> ! <H1>Liste aléatoire</H1> ! <UL> ! ! <% int numEntries = MesUtilitaires.randomInt(10); ! ! ! for(int i=0; i<numEntries; i++) { ! ! %> ! ! <LI><%= MesUtilitaires.randomInt(10) %> ! ! ! <% } %> ! ! </UL> </BODY></HTML>
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
Tâche 3Une variable d’instance semble être un bon moyen de gérer la persistence
204
<!DOCTYPE ...> <HTML> <HEAD> ! <TITLE>Nombre persistent</TITLE> </HEAD> <BODY> ! <%! private int randomNum = MesUtilitaires.randomInt(10); ! %> ! <H1>Nombre:<BR><%= randomNum %></H1> </BODY> </HTML>
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
Règles de conceptionOptions
‣ 30 lignes de Java dans une page JSP‣ 30 lignes de Java dans une classe, et une ligne pour l’appel dans
le fichier JSP
Quelle option est la meilleure ? et pourquoi ?
205
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
Règles de conception (cont.)Les JSP doivent
‣ servir à la conception de l’interface utilisateur en HTML
Les JSP ne doivent pas‣ implanter la logique applicative (celle-ci est prise en charge par
les composants/servlets)
Avantages des composants‣ meilleure lisibilité de la page JSP, mise au point‣ découplage entre présentation et traitement‣ réutilisation des composants‣ tests facilités
206
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
JSP et XMLLa syntaxe classique n’est pas compatible XML
‣ <%= … %>, <%…%>, <%!…%> ne sont pas autorisés en XML
On peut vouloir générer‣ du XHTML‣ des documents XML: Ajax, services Web,…
Seconde syntaxe disponible !
207
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
Syntaxe XML pour générer du XHTMLmonFichierjsp.jspx
208
<?xml version="1.0" encoding="UTF-8" ?> <html xmlns:jsp="http://java.sun.com/JSP/Page"> <jsp:output omit-xml-declaration="true" doctype-root-element="html" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" /> <jsp:directive.pagecontentType="text/html"/> <head><title>Some Title</title></head> <body bgcolor="#fdf5e6"> Body </body></html>
Namespace jsp
Nécessaire pour contourner un bug IE !
ou text/xml
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
Syntaxe XML pour générer du XMLmonFichierjsp.jspx
209
<?xml version="1.0" encoding="UTF-8" ?> <element-racine xmlns:jsp="http://java.sun.com/JSP/Page"> <tag1>foo</tag1> <tag2>bar</tag2> </element-racine>
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
Page HTML en syntaxe classique210
<!DOCTYPE HTML PUBLIC "-//W3C//DTD ..."> <HTML> <HEAD><TITLE>Exemple (syntaxe classique)</TITLE></HEAD> <BODY BGCOLOR="#FDF5E6"> <CENTER> <H1>Exemple (syntaxe classique)</H1> <H2>Nombre 1: <%= Math.random()*10 %></H2> <% double nb2 = Math.random()*100; %> <H2>Nombre 2: <%= nb2 %></H2> <%! private double nb3 = Math.random()*1000; %> <H2>Nombre 3: <%= nb3 %></H2> </CENTER> </BODY></HTML>
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
Page XHTML en syntaxe XML211
<?xml version="1.0" encoding="UTF-8" ?> <html xmlns:jsp="http://java.sun.com/JSP/Page"> <jsp:output omit-xml-declaration="true" doctype-root-element="html" doctype-public="-//W3C//DTD ..." doctype-system="http://www.w3.org...dtd" /> <jsp:directive.page contentType="text/html"/> <head><title>Exemple (syntaxe XML)</title></head> <body bgcolor="#fdf5e6"> <div align="center"> <h1>Exemple (syntaxe XML)</h1> <h2>Nombre 1: <jsp:expression>Math.random()*10</jsp:expression></h2> <jsp:scriptlet> double nb2 = Math.random()*100; </jsp:scriptlet> <h2>Nombre 2: <jsp:expression>nb2</jsp:expression></h2> <jsp:declaration> private double nb3 = Math.random()*1000; </jsp:declaration> <h2>Nombre 3: <jsp:expression>nb3</jsp:</div></body></html>
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
Document XML en syntaxe XML212
<?xml version="1.0" encoding="UTF-8" ?> <element-racine xmlns:jsp="http://java.sun.com/JSP/Page">
<element-1>Text</element-1> <element-2>
Nombre: <jsp:expression>Math.random()*10</jsp:expression>
</element-2></element-racine>
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
DirectivesCe sont des messages passés au moteur de JSP<%@ directive {attribut = “valeur”}* %>
‣ directive page‣ directive include
page‣ informations relatives à la page
include‣ fichiers à inclure littéralement
213
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
Directive page
Valeurs possibles‣ import‣ extends‣ contentType‣ pageEncoding‣ session‣ isThreadSafe‣ buffer‣ errorPage‣ isErrorPage‣ …
214
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
Directive page (cont.)import
‣ objectif: permet l’importation de classes ou de packages‣ <%@ page import = “package.class” %>
extends‣ objectif: permet de spécifier la classe parent du servlet issu de
la page JSP‣ <%@ page extends = “package.class” %>‣ à utiliser avec beaucoup de précautions
contentType‣ objectif: permet de spécifier le type MIME de la page générée‣ <%@ page contentType=”MIME-Type;
charset=CharacterSet”%>
215
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
Directive page (cont.)pageEncoding
‣ objectif: permet de spécifier l’encodage de la page générée‣ <%@ page pageEncoding = “Character-Set” %>
session‣ objectif: pour spécifier si la page appartient ou non à une
session (vrai par défaut)‣ <%@ page session = “false” %>
isThreadSafe‣ objectif: permet de déclarer votre code threadSafe ou non (par
défaut, threadSafe)‣ <%@ page isThreadSafe = “false” %>
216
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
Directive page (cont.)isThreadSafe
‣ attention, cela peut être source de dégradations de performances
‣ évaluer si on a réellement besoin de déclarer non thread safe
217
<%! private int idNum = 0; %> <%! String userID = "userID" + idNum; ! ! out.println("Votre ID est " + userID + "."); ! ! idNum = idNum + 1; // l’ID doit être unique%>
<%! private int idNum = 0; %> <%! synchronized(this) { ! ! ! String userID = "userID" + idNum; ! ! ! out.println("Votre ID est " + userID + "."); ! ! ! idNum = idNum + 1; ! ! } %>
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
Directive page (cont.)buffer
‣ objectif: pour définir la taille pour le PrintWriter (out)‣ <%@ page buffer = “16” %>
errorPage‣ objectif: permet de définir la page JSP qui gérera toutes les
exceptions qui ne sont pas récupérées dans la page‣ <%@ page errorPage = “URL” %>
isErrorPage‣ objectif: permet de spécifier si la page courante sert de page
d’erreur à une autre page JSP (non par défaut)‣ <%@ page isErrorPage = “true” %>
218
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
Directive page (cont.)219
<!-- Vitesse.jsp --><HTML>...<BODY> <%@ page errorPage="/WEB-INF/PageErreur.jsp" %> <TABLE BORDER=5 ALIGN="CENTER"> <TR><TH CLASS="TITLE">Vitesse</TABLE> <%! ! private double toDouble(String value) { ! ! ! ! return(Double.parseDouble(value)); ! ! ! } %> <% !double dist = toDouble(request.getParameter("dist")); ! ! double temps = toDouble(request.getParameter("temps")); ! ! double vitesse = dist/temps; %> <UL> ! <LI>Distance: <%= dist %> ! <LI>Temps: <%= temps %> ! <LI>Vitesse: <%= vitesse %> </UL> </BODY></HTML>
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
Directive page (cont.)220
<!-- PageErreur.jsp --><HTML>...<BODY> <%@ page isErrorPage="true" %> <TABLE BORDER=5 ALIGN="CENTER"> ! <TR>! ! <TH CLASS="TITLE">Gestion des erreurs</TABLE> <P> ! Vitesse.jsp a rencontré l’erreur suivante: ! <I><%= exception %></I>. Le problème se situe ici:! <PRE> ! ! <%@ page import="java.io.*" %> ! ! <% exception.printStackTrace(new PrintWriter(out)); %> ! </PRE> </BODY></HTML>
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
Directive include
Pour inclure des fichiers avant la compilation de la page JSPLe fichier est interprété littéralement et peut être
‣ HTML‣ JSP
La page appelante peut être affectée par le fichier inclusPour réutiliser des contenus dans plusieurs pages et rendre modulaire les pages WebFormat
‣ <%@ include file=”URL” %>
221
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
Directive include (cont.)222
<%@ page import="java.util.Date" %> <%-- Les attributs suivants deviennent des attributsdans chaque servlet qui est le résultat d’une page JSPqui inclut ce fichier. --%> <%! private int decompteAcces = 0; private Date dateAcces = new Date(); private String hoteAcces = "<I>Pas d’accès</I>"; %> <P> <HR> Cette page a été accédée <%= ++decompteAcces %> fois depuis le redémarrage du serveur. Le dernier accèsconcerne <%= hoteAcces %> à <%= dateAcces %>. <% hoteAcces = request.getRemoteHost(); %> <% dateAcces = new Date(); %>
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
Directive include (cont.)223
<HTML>... <BODY> <TABLE BORDER=5 ALIGN="CENTER"> ! <TR><TH CLASS="TITLE">Une page</TABLE> <P> Blabla, blabla. <P> Blah, blah, blah. <P> Yadda, yadda, yadda. <%@ include file="/WEB-INF/ContactSection.jsp" %> </BODY></HTML>
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
<jsp:include>
Pour inclure des fichiers au moment où la page JSP est servie (pas au moment où elle est compilée)
Le contenu de la page n’est pas affecté par le fichier inclus
Pour inclure des éléments standards (entêtes, pieds de page) qui s’intégreront dans le flot de la page
Préférable dans la plupart des cas à la directive include
Format‣ <jsp:include page=”URL” />
224
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
Exemple <jsp:include … />225
<HTML>... <BODY> <TABLE BORDER=5 ALIGN="CENTER"> ! <TR><TH CLASS="TITLE">Nouvelles</TABLE> <P> Dernières nouvelles: <OL> ! <LI><jsp:include page="/WEB-INF/nouv1.html" /> ! <LI><jsp:include page="/WEB-INF/nouv2.html" /> ! <LI><jsp:include page="/WEB-INF/nouv3.html" /> </OL> </BODY></HTML>
<STRONG>Nouvelle Ducati.</STRONG> La nouvelle Ducati a étéprésentée hier ...Plus de détails sur <A HREF=”http://www.ducati.it/”>le siteDucati</A>
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
Comparaison226
<jsp:include> <%@ include … %>
Syntaxe <jsp:include page=”…”/> <%@ include file=”…”%>Inclusion: quand Exécution de la page JSP Traduction de la page JSPInclusion: quoi Output du fichier Contenu du fichier
Nombre de servlets résultants Deux UnAffecte la page principale Non Oui
Définition d’attributs/méthodes pour la page principale Non Oui
La page doit être mise à jour lorsque la page incluse change Non Oui
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
Comparaison (cont.)Utiliser jsp:include le plus souvent possible
‣ modifications de la page incluse ne nécessite pas de mise à jour de la page principale
‣ même si différence de vitesse (recompilation)
Les avantages de la directive <%@ include … %> ‣ besoin d'accéder à des variables dans la page principale‣ besoin de modifier le contenu de la page principale avec le
fichier inclus‣ exemple
• page principale: <%! int decompteAcces = 0; %>
• page incluse: <%@ include file=”toto.jsp” %><%= decompteAcces++ %>
227
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
Configuration des JSPConfiguration pour toutes les pages JSP dans web.xml
Propriétés‣ EL-enabled: utilisation du langage d’expression‣ Scripting-enabled: utilisation du langage de script‣ Page-encoding: encodage des pages‣ Include-preclude: ajoute un header à toutes les pages‣ Include-code: ajoute un footer après la génération de page‣ Is-xml: permet la validation XML des pages JSP
228
<jsp-config>! <jsp-property-group>! ! <url-pattern>*.jsp</url-pattern>! ! …! </jsp-property-group></jsp-config>
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
Gestion des sessions avec les JSPCookies et sessions fonctionnent de la même façon que dans l’API ServletCookie
Sessions‣ toutes les pages JSP disposent automatiquement d’un objet
session
229
<%! Cookie c = new Cookie(“Sport”, “Moto”);! reponse.addCookie(c);%>
<%! String val = (String)session.getValue(“Sport”);%>
Olivier Perrin, Université de Lorraine LicencePro, 2014
Architectures Outils Java Servlets État servlet JSP Accès BD Conception
Actionsjsp:include et jsp:forward
<jsp:include>‣ combine le contenu actuel avec celui de la page JSP incluse‣ au moment de la requête sur la page principale‣ équivalent à l’appel de include de la classe RequestDispatcher
<jsp:forward>‣ redirige vers un autre URI/URL
‣ ne peut pas afficher d’information‣ à éviter !
230
<jsp:forward page=”/unAutreURL” />