Architectures Java Accès BD Plan

57
Olivier Perrin, Université de Lorraine LicencePro, 2014 Architectures Outils Java Servlets État servlet JSP Accès BD Conception Architectures n-tiers et applications Web Outils Java et applications Web Servlets État d’un servlet Les JSP Accès aux BD avec servlets Conception Plan 174

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” />