Académique Documents
Professionnel Documents
Culture Documents
1/38
Technologie Web
Les Java Servlet Pages (JSP)
Alexandre Pauchet
INSA Rouen - Dpartement ASI
BO.B.RC.18, pauchet@insa-rouen.fr
INSA - ASI
2/38
Plan
INSA - ASI
3/38
Introduction
(1/4)
JSP = Java Servlet Page Les JSP sont comparables PHP Langage de script ct serveur
Une page JSP contient : Du contenu statique (texte simple, XHTML, XML, . . . ) Du code JSP qui produit dynamiquement du contenu
INSA - ASI
4/38
Introduction
Premier exemple
(2/4)
hello.jsp
<%@ page contentType="text/html; charset=utf-8" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1strict.dtd"> <html> <head> < title >Ma premire page JSP</title> </head> <body> <% String prenom=request.getParameter("prenom"); %> <h1>Bonjour <%=(prenom!=null && prenom.length()!=0)?prenom:"bel(le) inconnu(e)"%></h1> <% if (prenom!=null && prenom.equals("le monde")) { %> <h2>Bien jou !!!!</h2> <% } %> <form action="hello.jsp" method="post"> <label>Prnom : </label><input type="text" name="prenom" size="30"> <input type="submit" value="envoyer"> </form> </body> </html>
INSA - ASI
5/38
Introduction
(3/4)
Requte sur une JSP Une servlet compare les dates de la JSP et de sa servlet Si la servlet de la JSP est plus ancienne que la page :
Traduction de la JSP en servlet (drivation) Compilation de la servlet (cf. rpertoire work)
4 5
INSA - ASI
6/38
Introduction
(4/4)
<%@ ... %> : directives (validit : page) <%! ... %> : dclarations <% ... %> : scriptlet (i.e. script : tests, itration, . . . ) <%= ... %> : rcupration dune valeur dexpression (i.e. valuation) <jsp: include ... /> : inclusion lexcution <jsp:forward ... /> : dlgation un autre composant <jsp:useBean ... /> : utilisation dun java bean
INSA - ASI
7/38
Fonctionnement
Directives de page
(1/12)
Syntaxe
<%@ page directive %>
Exemples
<%@ page contentType="text/plain; charset=UTF-8" %> <%@ page import="java.io.*, java.util.*" %> <%@ page isThreadSafe="false" %> // 1 seule requte la fois entre le conteneur // et la JSP
INSA - ASI
8/38
Fonctionnement
(2/12)
Lexcution dune JSP est paramtrable via la directive page <%@ page buer="none|xxxkb"%> Spcie la taille du buer o est renvoye la rponse. Un petit buer allge en charge le serveur dapplication et envoie la rponse plus rapidement. <%@ page errorPage="le_name"%> Spcie la page (JSP ou non) vers laquelle le serveur dapplication renvoie lorsquune exception non gre est lance par la JSP. La directive <%@ page isErrorPage="true|false" %> permet de spcier si la page de renvoi est une page derreur et lui autorise ainsi la transmission de lexception pour un ventuel traitement.
INSA - ASI
9/38
Fonctionnement
page-HTML.jsp
(3/12)
<%@ page contentType="text/html; charset=UTF-8" %> <%@ page errorPage="erreur.html" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1strict.dtd"> <html> <head><title>Ma premire page jsp</title></head> <body><h1>1/0 = <%=1/0 %></h1></body> </html>
erreur.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> < title >Page derreur</title> </head> <body><h1>Il doit y avoir une erreur dans la JSP...</h1></body> </html>
INSA - ASI
10/38
Fonctionnement
page-JSP.jsp
(4/12)
<%@ page contentType="text/html; charset=UTF-8" %> <%@ page errorPage="erreur.jsp" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1strict.dtd"> <html> <head><title>Ma premire page jsp</title></head> <body><h1>1/0 = <%=1/0 %></h1></body> </html>
erreur.jsp
<%@ page contentType="text/html; charset=UTF-8" %> <%@ page isErrorPage="true" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1strict.dtd"> <html> <head><title>Page derreur</title></head> <body> <h1>Il doit y avoir une erreur dans la JSP...</h1> <p>(mais cette fois cest une JSP)</p> </body> </html>
INSA - ASI
11/38
Fonctionnement
Dclarations
(5/12)
Les dclarations permettent de dnir des classes, des variables, . . . Elles seront utilisables dans toute la JSP
Syntaxe
<%! dclarations %>
Ces dclarations sont places dans la classe au moment de la traduction de la JSP en Servlet les variables sont donc des attributs de la Servlet
INSA - ASI
12/38
Fonctionnement
(6/12)
Paramtrage de linitialisation et de la nalisation Initialisation lors du chargement par le serveur dapplication : public void jspInit() Finalisation lors du dchargement par le serveur dapplication : public void jspDestroy()
INSA - ASI
13/38
Fonctionnement
Scriptlets (scripts)
(7/12)
Syntaxe
<% script %>
Les scriptlets seront placs dans la mthode _jspService() qui excute la requte (GET, POST, . . . ) eectue sur la page JSP
INSA - ASI
14/38
Fonctionnement
Expressions
(8/12)
Syntaxe
<%= expression %>
INSA - ASI
15/38
Fonctionnement
Exemple
(9/12)
compteur.jsp
<%@ page isThreadSafe="false" %> <%@ page contentType="text/plain; charset=UTF-8" %> <%@ page import="java.io.*" %> <%! int compteur=0; String fichier; public void jspInit() { try { fichier=getServletContext().getRealPath("/compteur.txt"); FileReader file = new FileReader(fichier); BufferedReader reader = new BufferedReader(file); compteur = Integer.parseInt(reader.readLine()); reader.close(); } catch (FileNotFoundException exception) {} catch (IOException exception) {} catch (NumberFormatException exception) {} }
...
INSA - ASI
16/38
Fonctionnement
Exemple
(10/12)
compteur.jsp (suite)
...
public void jspDestroy() { try { FileWriter file = new FileWriter(fichier); PrintWriter writer = new PrintWriter(file); writer.println(compteur); writer.close(); } catch (IOException exception) { log("ErreurServlet : enregistrement de letat impossible pour la JSP compteur2.jsp"); log(""+exception); } } %> <% compteur+=1; %> Le compteur : <%=compteur%>
INSA - ASI
17/38
Fonctionnement
Objets disponibles
(11/12)
Objets directement disponibles dans une JSP request : httpServlet : correspondant la requte response : httpServlet : correspondant la rponse session : permet de grer une session out : le ot de sortie de la rponse application : Servlet application ; contient, entre autres, la mthode log() pour crire dans le chier log pageContext : gestion du contexte et des attributs de la JSP ...
INSA - ASI
18/38
Fonctionnement
Exemple
(12/12)
log.jsp
<%@ page contentType="text/html; charset=UTF-8" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1strict.dtd"> <html> <head> < title >Ecriture dans le fichier log</title> </head> <body> <% String phrase = ""; if(request.getParameter("phrase")!=null) phrase = request.getParameter("phrase"); application.log(phrase); %> <form action="log.jsp" method="post"> <label>Phrase a crire dans le fichier log : </label><input type="text" name="phrase" size="30"> <% out.println("<input type=\"submit\" value=\"envoyer\">"); %> </form> </body> </html>
INSA - ASI
19/38
Inclusion/Dlgation
Inclusion
(1/5)
INSA - ASI
20/38
Inclusion/Dlgation
Exemple
(2/5)
inclusion.jsp
<%@ page contentType="text/html; charset=UTF-8" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1strict.dtd"> <html> <head><title>JSP avec inclusion</title></head> <body><%@ include file="titre.txt" %> <p><jsp:include page="texte.jsp" /></p> <p><jsp:include page="parametre.jsp"> <jsp:param name="nom" value="Bob" /> </jsp:include> </p> </body> </html>
INSA - ASI
21/38
Inclusion/Dlgation
Exemple
(3/5)
titre.txt
<h1>Titre de la JSP, inclus a partir dun fichier texte</h1>
texte.jsp
<%@ page contentType="text/plain; charset=UTF-8" %> <% out.println("Texte genere par la JSP texte.jsp"); %>
parametre.jsp
<%@ page contentType="text/plain; charset=UTF-8" %> <% String nom = request.getParameter("nom"); out.println("Salut " + nom); %>
INSA - ASI
22/38
Inclusion/Dlgation
Dlgation
(4/5)
Syntaxe
<jsp:forward page="fichier " /> ou <jsp:forward page="fichier " > <jsp:param name="nom " value="valeur "/> ... </jsp:forward>
INSA - ASI
23/38
Inclusion/Dlgation
Exemple
(5/5)
delegation.jsp
<html> <head><title>JSP avec dlgation</title></head> <body> <jsp:forward page="parametre.jsp"> <jsp:param name="nom" value="Bob" /> </jsp:forward> </body> </html>
parametre.jsp
<html> <head><title>Affichage delegue</title></head> <body> <% String nom = request.getParameter("nom"); out.println("<p>Salut " + nom + " !</p>"); %> </body> </html>
INSA - ASI
24/38
JSP&JavaBeans
Dnition
(1/8)
Denition (JavaBean)
Classe java respectant certaines conventions (API) faisant delle un composant java rutilisable et facilement intgrable dans des applications. Les JSP orent des tags pour interagir avec un JavaBean
INSA - ASI
25/38
JSP&JavaBeans
(2/8)
Contraintes de conception
Pour tre un JavaBean, une classe doit : tre Serializable, Possder un constructeur sans argument, Avoir des accesseurs sur ses attributs respectant des conventions de nommage ; par exemple pour un attribut String name : public void setName(String) public String getName() Contenir les mthodes dinterception dvnements ncessaires.
INSA - ASI
26/38
JSP&JavaBeans
(3/8)
avec
si parametre_requete est absent, param=property ; si parametre_requete=*, rgle toutes les proprits ayant des noms identiques aux paramtres de requte Dnition des attributs la dclaration :
<jsp:useBean id="nom" class="classbean" scope="porte" > <jsp:setProperty name="nom" property="proprit" .../> ... </jsp:useBean>
<jsp:getProperty name="nom"property="proprit"/>
identique :
<%=nom.getProprit()%>
INSA - ASI
27/38
JSP&JavaBeans
Exemple
(4/8)
Personne.java
package asi; import java.beans.*; import java.io.*; public class Personne implements Serializable { private String nom; private String prenom; public Personne() { this.nom = "Leponge"; this.prenom = "Bob"; } public String getNom() { return this.nom; } public void setNom(String nom) { this.nom=nom; } public String getPrenom() { return this.prenom; } public void setPrenom(String prenom) { this.prenom=prenom; } }
INSA - ASI
28/38
JSP&JavaBeans
Exemple
(5/8)
javabean.jsp
<%@ page contentType="text/html" %> <%@ page language="java" import="asi.*" %> <jsp:useBean id="bob" class="asi.Personne" scope="page" /> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> < title >Un Hello Bob</title> </head> <body> <p>Salut <%= bob.getPrenom() %> <%= bob.getNom() %> !</p> </body> </html>
INSA - ASI
29/38
JSP&JavaBeans
(6/8)
INSA - ASI
30/38
JSP&JavaBeans
Personne.java
package asi; import java.beans.*; import java.io.*;
(7/8)
public class Personne implements Serializable { private String nom; public Personne() { this.nom = ""; } public String getNom() { return this.nom; } public void setNom(String nom) { this.nom=nom; } }
Gars.java
package asi; import java.beans.*; import java.io.*; public class Gars implements Serializable { private String nom; public Gars() { this.nom = ""; } public String getNom() { return this.nom; } public void setNom(String nom) { this.nom=nom; } }
INSA - ASI
31/38
JSP&JavaBeans
(8/8)
hello.jsp
<%@ page contentType="text/html; charset=utf-8" %> <%@ page language="java" import="asi.*" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head><title>Un autre Hello World !</title></head> <body> <form action="hello.jsp" method="post"> <label>Nom : </label><input type="text" name="nom" size="30"> <input type="submit" value="envoyer"> </form> <jsp:useBean id="personne" class="asi.Personne" scope="page"> <jsp:setProperty name="personne" property="*"/> </jsp:useBean> <jsp:useBean id="gars" class="asi.Personne" scope="page"> <jsp:setProperty name="gars" property="*"/> </jsp:useBean> <p>Personne : <%= personne.getNom() %></p> <p>Gars : <%= gars.getNom() %></p> </body> </html>
INSA - ASI
32/38
JSP&JavaBeans
UnMessage.java
package libMessage; import import import import java.beans.*; java.io.*; java.text.*; java.util.*;
(1/6)
public class UnMessage implements Serializable { private static SimpleDateFormat formatter = new SimpleDateFormat("E d MMM yyyy, H:m:s", Locale.FRANCE); private static Date date = new Date(); private String email; private String texte; public UnMessage() { date.setTime(System.currentTimeMillis()); } public String getDate() { return formatter.format(date); } public void setEmail(String email) { this.email=email; } public String getEmail() { return email; } public void setTexte(String texte) { this.texte=texte; } public String getTexte() { return texte; } }
INSA - ASI
33/38
JSP&JavaBeans
LivreOr.java
package libMessage; import java.beans.*; import java.util.*; import java.io.*;
(2/6)
public class LivreOr implements Serializable { private Vector messages; private String nomFichier; public LivreOr() { } public void setFichier(String fichier) throws FileNotFoundException,IOException, ClassNotFoundException { nomFichier = fichier; FileInputStream fis; ObjectInputStream ois = null; try { fis = new FileInputStream(nomFichier); ois = new ObjectInputStream(fis); messages = (Vector) ois.readObject(); } catch (Exception e) { messages = new Vector(); }
...
INSA - ASI
34/38
JSP&JavaBeans
(3/6)
LivreOr.java (suite)
...
public void addMessage(UnMessage msg) { messages.add(msg); } public Vector getMessages() { return messages; } public void enregistrer() throws FileNotFoundException, IOException{ FileOutputStream fos = new FileOutputStream(nomFichier); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(messages); } }
INSA - ASI
35/38
JSP&JavaBeans
livredor.jsp
(4/6)
<%@ page contentType="text/html" %> <%@ page language="java" import="libMessage.*" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> < title >Livre dor</title> </head> <body> <form action=livredor.jsp method=POST> <label>email :</label> <input type=text name=email size=50/><br/> <textarea name=texte rows=10 cols=80>Saisissez votre message ici</textarea><br/> <input type=submit name=submit value=Envoyer/> </form> <jsp:useBean id="msg" class="libMessage.UnMessage" scope="page" > <jsp:setProperty name="msg" property="*"/> </jsp:useBean> <jsp:useBean id="livreor" class="libMessage.LivreOr" scope="page"/> <jsp:setProperty name="livreor" property="fichier" value="/tmp/messages.txt"/>
...
INSA - ASI
36/38
JSP&JavaBeans
livredor.jsp (suite)
...
(5/6)
<% if(msg!=null && msg.getEmail()!=null && !msg.getEmail().equals("")) { livreor.addMessage(msg); livreor.enregistrer(); } if(livreor!=null && livreor.getMessages()!=null && !livreor.getMessages().isEmpty()) { for(Object lemsg : livreor.getMessages()) { %> <table border="1pt"> <tr> <td><%= ((UnMessage)lemsg).getEmail() %></td> <td><%= ((UnMessage)lemsg).getDate() %></td> </tr> <tr> <td colspan="2"> <pre> <%= ((UnMessage)lemsg).getTexte() %> <pre> </td> </tr> </table> <% }} %> </body> </html>
INSA - ASI
37/38
JSP&JavaBeans
(6/6)
Dploiement
LivredorJSP |_ WEB-INF | |_ classes | |_ libMessage | |_ LivreOr.class | |_ UnMessage.class |_ livredor.jsp
INSA - ASI
38/38
Les JSP fournissent une bibliothque de tags standards rpondant des besoins de base Quelques domaines : Core : tags permettant des fonctionnalits de base XML : tags permettant de manipuler des donnes XML I18n : tags permettant de traiter linternationalisation Database : tags permettant deectuer des requtes SQL (travail normalement ddi aux JavaBeans) Il est possible dtendre le langage en crant dautre tags