Vous êtes sur la page 1sur 67

Partie 4 : Les JSP

Ahmed JEMAL
Email :
jmlhmd@gmail.com

1
Cest quoi ?
Le langage JSP est un langage de scripts
compos la fois :
de balises HTML
et dinstructions provenant du langage de
programmation Java.
On peut mettre des pages .jsp partout o on met
des pages HTML
Elles sont converties " la vole" en servlet par
le moteur de JSP

2
Du JSP la Servlet

Lorsque le serveur reoit une requte du type


http://localhost:8080/MaWebApp/MaJSP.jsp, le
serveur lance un interprteur de commande JSP qui
convertit alors lensemble des instructions places
dans le fichier MaJSP.jsp en un programme Java de
type Servlet.

Une fois la Servlet est entirement crite, le serveur


la compile par lintermdiaire de la JVM, la charge
en mmoire et lexcute automatiquement afin de
gnrer un rsultat sous la forme dune page HTML.

3
Prsentation des JSP (1/3)
Avec les Servlets, il est facile de :
lire des formulaires
lire les enttes HTTP
envoyer les enttes rponses, les codes dtat, les
pages rponses
partager les donnes entre Servlets
mmoriser des informations entre les requtes

Mais il est pnible de :


grer les instructions println de gnration dHTML
4
Prsentation des JSP (1/3)
Principe
Utilisation du HTML classique pour la majorit de la page,
Ajout du code Java marqu par des balises spciales,
La page JSP est traduite par le serveur en Servlet une seule
fois,
La Servlet obtenue est invoque chaque requte.

Exemple dune portion de page JSP


<H3>Aujourdhui, nous sommes le:</h3>
<I> <%= (new java.util.Date()) %> </I>

Rsultat
Aujourdhui, nous somme le Thu Oct 11:08:53 CEST 2010

5
Prsentation des JSP (1/3)
Avantage des JSP
criture directe du HTML
possibilit dutiliser les outils HTML classiques comme
DreamWeaver
possibilit de sparer la prsentation ralise en HTML et
le traitement ralis en Java
possibilit de modularit et de rutilisation en utilisant des
beans dans la partie Java
appel des pages JSP comme des pages HTML standards,
par utilisation dune URL avec un nom de fichier avec une
extension .jsp
http:\\localhost:8080\MaWebApp\xxxx.jsp

6
Balises JSP

Trois types :
1. Scripting elements : du code java
2. Directives : pour le contrle de la structure
3. Actions : importation de composants existants

7
Scripting elements

Syntaxe de base
Types des lments de scripting
Expressions
Variables prdfinies
Scriptlets
Dclarations

8
Syntaxe de base
Texte HTML
<H1>Titre</H1>
envoy au client et transform en code servlet sous le forme :
out.print("<H1>Titre</H1>");
Commentaires HTML
<!-- Comment -->
transform au code servlet comme le texte HTML
Commentaires JSP
<%-- Comment --%>
ne sera pas envoy au client
Pour obtenir <% comme output, on utilise <xmp><\%</xmp>

9
Types des lments de scripting
Expressions
Format: <%= expression %>
insre dans loutput de la servlet, c..d. elle gnre :
out.print(expression)
Scriptlets
Format: <% code %>
insre le code tel qu il est dans la mthode _jspService()
de la servlet (appel par service())
Dclarations
Format: <%! code %>
insre le code tel qu il est dans le corps de la classe de la
servlet au dehors de chaque mthode.

10
Les Expressions
Format <%= Expression Java%>
Rsultat
lexpression est value, convertie en String, et place dans
la page HTML.
Exemples
temps courant : <%= new java.util.Date() %>
Nom du host: <%= request.getRemoteHost() %>
Syntaxe compatible XML
<jsp:expression>Java expression</jsp:expression>
la version XML est non supporte par Tomcat. Les serveurs
ne sont pas senss supporter XML.

11
Variables Prdfinis
request
HttpServletRequest : (1er argument de service/doGet)
response
HttpServletResponse : (2me argument de service/doGet)
out
Writer : utilis pour envoy des informations au client
session
HttpSession : associe avec le request (si nest pas annule par l attribut
session de la directive page)
application
ServletContext : comme obtenu avec getServletConfig().getContext()

12
Correspondance JSP/Servlet
JSP Original
<H1>A Random Number</H1>
<%= Math.random() %>
Rsultat Possible
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>A Random Number</H1>");
out.println(Math.random());
...
}

13
Exemple
<BODY> <H2>JSP Expressions</H2>
<UL>
<LI>Current time: <%= new java.util.Date() %>
<LI>Your hostname: <%= request.getRemoteHost() %>
<LI>Your session ID: <%= session.getId() %>
<LI>The <CODE>testParam</CODE>
form parameter:<%= request.getParameter("testParam") %>
</UL>
</BODY>

14
Exemple Variable prdfinie
Exemple :
Ecrire le script JSP receptionPasswd.jsp qui permet
dafficher un mot de passe saisi laide dun formulaire
dcrit dans le fichier formulaire.html.
formulaire.html
<Form name=ident action=http://localhost:8080/MaWebApp/receptionPasswd.jsp method=POST>
Entrer votre mot de passe : <input type ="password" name="valeur" maxlength="8">
<input type="submit" value="ok">
</form>
</body>
</html>

receptionPasswd.jsp
<!-- Une JSP qui affiche un mot de passe -- >
<%
String motdepasse = request.getParameter("valeur");
out.println( "votre mot de passe est : "+ motdepasse);
%>

15
Les Scriptlets
Format: <% Java Code %>
Rsultat
Le Code est insr tel quil est dans la mthode _jspService
de la servlet
Exemple
<%String queryData = request.getQueryString();
out.println("Attached GET data: " + queryData); %>
<% response.setContentType("text/plain"); %>
Syntaxe compatible XML
<jsp:scriptlet>Java Code</jsp:scriptlet>

16
Correspondance JSP/Servlet
JSP Original
<%= foo() %>
<% bar(); %>
Rsultat Possible
public void _jspService(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
request.setContentType("text/html");
HttpSession session = request.getSession(true);
JspWriter out = response.getWriter();
out.println(foo());
bar();
...
}

17
Exemple de Scriptlets (1/3)
<HTML>
<HEAD> <TITLE>Color Testing</TITLE> </HEAD>
<%
String bgColor = request.getParameter("bgColor");
boolean hasExplicitColor;
if (bgColor != null) {
hasExplicitColor = true;
}
else {
hasExplicitColor = false;
bgColor = "WHITE";
}
%>

18
Exemple de Scriptlets (2/3)
<BODY BGCOLOR="<%= bgColor %>">
<H2 ALIGN="CENTER">Color Testing</H2>
<% if (hasExplicitColor) {
out.println("vous avez choisi la couleur" + bgColor );
}
else {
out.println(" la couleur blanche est choisie par dfaut ") ;
}
%>
</BODY>
</HTML>
19
Exemple de Scriptlets (3/3)

20
Utilisation des Scriptlets pour le
conditionnel (1/2)
Les Scriplets sont insrs dans la servlet tel quils sont
crits
Ne ncessitent pas dtre des expressions compltes
Les expressions compltes sont gnralement plus claires
et simple maintenir.

21
Utilisation des Scriptlets pour le
conditionnel (2/2)
Exemple
<% if (Math.random() < 0.5) { %>
Have a <B>nice</B> day!
<% } else { %>
Have a <B>lousy</B> day!
<% } %>

Rsultat reprsentatif
if (Math.random() < 0.5) {
out.println("Have a <B>nice</B> day!");
} else {
out.println("Have a <B>lousy</B> day!");}

22
Les Dclarations JSP
Format <%! Java Code %>
Rsultat
Le code est insr tel quil est dans la dfinition de la classe de
la servlet au dehors de chaque mthode.
Exemples
<%! private int someField = 5; %>
<%! private void someMethod(...) {...} %>
Syntaxe compatible XML
<jsp:declaration>Java Code</jsp:declaration>

23
Correspondance JSP/Servlet (1/2)
JSP Original

<H1>Some Heading</H1>
<%!
public String randomHeading() {
return("<H2>" + Math.random() +
"</H2>");
}
%>

<%= randomHeading() %>

24
Correspondance JSP/Servlet (2/2)
Rsultat Possible
public class xxxx extends HttpServlet {
public String randomHeading() {
return("<H2>" + Math.random() + "</H2>");
}
public void _jspService(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
request.setContentType("text/html");
HttpSession session = request.getSession(true);
JspWriter out = response.getWriter();
out.println(<H1>Some Heading</H1>);
out.println(randomHeading());
...
}

25
Exemple de dclarations
<HTML><HEAD><TITLE> Dclarations JSP
</TITLE>

</HEAD>
<BODY>
<H1> Dclarations JSP</H1>
<%! private int accessCount = 0; %>
<H2> Nombre daccs depuis le dmarrage
du serveur:
<%= ++accessCount %></H2>
</BODY>
</HTML>

26
Principe de traduction du JSP la Servlet
Les variables et les mthodes dclares dans une balise
<%! %> sont traduites en variables et mthodes de la
classe.
Les variables dclares lintrieur dune scriptlet sont
transformes en variables locales dune mthode
appele _jspService().
Les expressions JSP du type <%= %> sont places
dans un flux de sortie de type out.println();
Les commentaires JSP sont ignors.
Les balises HTML sont disposes lintrieur de la
mthode _jspService() dans leur ordre darrive et sont
places lintrieur dun flux dcriture de type
out.println().
Le code Java dfini lintrieur des scriptlets est plac
tel quel lintrieur de la mthode _jspService().

27
Application
Dveloppez une application web dynamique qui ralise
lopration dauthentification.
partir dune page auth.jsp, si les paramtres saisies sont
correctes, lutilisateur sera redirig vers une page index.jsp qui
lui affiche un message de bienvenu et ses paramtres daccs (
Login et Mot de passe)
En cas dchec, la page dauthentification auth.jsp est recharge
avec un message derreur affich en rouge en haut de la page
Veuillez vrifier vos paramtres daccs
On note que la page index.jsp ne peut tre affiche que suite
au passage par lauthentification. Si lutilisateur essaie de
contourner lauthentification, il y sera automatiquement
redirig. Pensez utiliser la session.
28
Directives
Format :
<%@ directive attribut1="valeur" attribut2="valeur"... %>

2 directives possibles (jsp1.0) :


page : informations relatives la page
include : fichiers inclure littralement

29
La directive : page
Valeurs possibles :
<%@ page language="java"
<%@ page import="java.util.*, java.net.*" %>
<%@ page contentType="text/plain" %>
<%@ page session="true|false " %>
<%@ page errorPage="pathToErrorPage"%>
<%@ page isErrorPage="true|false" %>
<%@ page

30
La directive : include
Valeurs possibles :
<%@include file="chemin relatif du fichier" %>
pour se rfrer au home dir du serveur Web : <%@include
file="/toto.html" %>

Interprt littralement, le fichier peut tre :


HTML, scripting elements, directives, actions, ...

L'insertion se fait au moment de la traduction de la


page...

31
Actions (1/2)
Syntaxe XML
Permettent de faire des actions au moment o la page est
demande par un client :
inclure dynamiquement un fichier
utiliser des beans
rediriger vers une autre page

32
Actions (2/2)
<jsp:include page="relative URL" flush="true" />
inclusion au moment o la page est servie, pas au moment
o elle est traduite en servlet.

<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
<jsp:forward page="parameters.jsp">
<jsp:param name="nouveauParamtre" value="toto"/>
33 </jsp:forward>
Usebean et getProperty
Mcanisme trs puissant ! Il faut mettre le
bean dans un
<jsp:useBean package
id="nom" (rfrence l'instance du composant)
class="package.class" (nom qualifi de la classe)
scope="page|request|session|application" (porte)
/>
Pour lire une proprit du bean :
<jsp:getProperty name="nom" property="proprit"
/>

34
Usebean et setProperty
Pour modifier une proprit du bean :
<jsp:setProperty name= "nom"
property="proprit"
value="valeur" />

<jsp:setProperty name= "nom"


property="*" />
Initialise tous les attributs de lobjet name avec les
paramtres HTTP du mme nom
En 2 lignes !

35
Exemple d'utilisation d'un bean (1/2)
La page JSP :

<html> ...
<jsp:useBean id="test" class="monpack.SimpleBean"
scope="session" />
<jsp:setProperty name="test" property="message"
value="Hello !!" />
<h1>Le message est : <i>
<jsp:getProperty name="test" property="message" />
</i></h1>
</html>

36
Exemple d'utilisation d'un bean (2/2)
Le code source Java du bean :
SimpleBean.java
package monpack;
public class SimpleBean {
private String message = "no message" ;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}

37
Exemple dun programme JSP (1/4)
Ecrire un programme JSP qui se comporte
diffremment en fonction des paramtres quil
rcupre depuis lURL dappel du programme.

Le premier appel du programme JSP seffectue en


lanant une requte par lintermdiaire dune URL
simple, nutilisant aucun paramtre, comme :
http://localhost:8080/MaWebApp/MaJSP.jsp.

Le navigateur affiche en rponse un formulaire


demandant lutilisateur de remplir le formulaire, puis
valider son choix en cliquant sur le boutant OK.

38
Exemple dun la programme JSP (2/4)
Exemple : Programme JSP appel
QuiFaitQuoi_if.jsp :
Formulaire avec bouton radio,
Manipulation de la structure Java if-else.

39
Exemple dun la programme JSP (3/4)
Exemple (suite) :
QuiFaitQuoi_if.jsp
<%@page import="java.util.*"%>
<!-- Script JSP Cr le : <%=new Date()%>-->
<html><head>
<%!
String lRealisateur [] = {"Jean-Jaques Beineix","Luc Besson", "Jean-Jaques Arnaud", "Jean-Pierre Jeunet" };
int i;
%>
<% String parametre = request.getParameter("valeur");
if (parametre == null) {
out.println("<TITLE> Question ....</TITLE>");
out.println("</head>");
out.println("<Body bgcolor=white <BR>");
%>
<!-- Dbut du formulaire html avec bouton radio -->
<form name=ques action=http://localhost:8080/MICE/QuiFaitQuoi_if.jsp method=Get>
<p><h1> Quel est le ralisateur du film <i> La guerre du feu <i/>?</h1><BR></p>
<input type="Radio" name="valeur" value="0"> Jean-Jacques Beinex <BR><BR>
<input type="Radio" name="valeur" value="1"> Luc Besson <BR><BR>
<input type="Radio" name="valeur" value="2"> Jean-Jacques Arnaud <BR><BR>
<input type="Radio" name="valeur" value="3"> Jean-Pierre Jeunet <BR><BR>
<input type="submit" value="Ok"> </p>
</form>
40<!-- Fin du formulaire html -->
40
Exemple dun la programme JSP (4/4)
Exemple (suite) :

QuiFaitQuoi_if.jsp (suite)
<%
}
else {
i= Integer.parseInt(parametre);
out.println("<Title> Rponse....</TITLE>");
out.println("</head>");
out.println("<Body bgcolor=white <BR>");
out.println("Votre rponse est :"+ lRealisateur[i]+"<BR><BR>");
out.println("La bonne rponse est : Jean-Jacques Arnaud");
}
%>
</head></html>

41
Collaboration entre JSP et Servlets :
LInterface RequestDispatcher (1/2)
Agrgation de traitements fournis par des JSP :
meilleure modularit,
meilleure rutilisation.

jsp1

Servlet jsp2

jsp3

42
Collaboration entre JSP et Servlets :
LInterface RequestDispatcher (2/2)
Obtention dun RequestDispatcher :
dans la mthode de traitement de requte de Servlet
..
RequestDispatcher rd;
rd = getServletContext().getRequestDispatcher("/*****.jsp");
if(rd==null) res.sendError(404);
.

Redirection dune requte


dans mthode de traitement de requte, demande un
JSP de rpondre au client
rd.forward(req, res);

43
EL: Expression language

44
Dfinition
Inspir d'ECMAScript qui est la version standardise
de Javascript.
Inspir galement de XPath EL.
Dans le but de ne pas crer encore un nouveau
langage d'expressions et de sembler familier un
Webmaster.
Introduit pour la premire fois dans JSTL puis
incorpor dans JSP depuis la version 2.0 (qui
incorpore aussi JSTL 1.1).

45
Syntaxe
Les expressions dEL scrivent interchangeablement
${expression} ou
#{expression}
Littraux :
Boolens : true false
Entiers : un signe est permis : -206 14 3
Flottants : valeurs ngatives permises ainsi quun exposant
E ou e : -2.4 5. .5 42E-12 31.46e17
Strings : entre " " ou entre ' '. Utiliser \ pour
considrer " ou ' littralement et \\ pour un \. On fera
'${' pour le considr comme littral
Valeur nulle : null
46
Syntaxe
Valeurs par dfaut
En cas d'erreur, bien souvent des valeurs par dfaut
seront affiches au lieu de gnrer une erreur
exemple : ${17/0} affiche infinity
${user.nom}est vide si ${user} vaut null
Utilisation
Les expressions d'EL peuvent tre utilise dans
les attributs des tags
<c:when test="${niveau != null}">
le corps de la page (template text)
<table border="1">
<tr><td>Hello ${param[nom]}</td>
47
Objets prdfinis
applicationScope : Map contenant les paires (nom, valeur) des
variables de porte (scope) application
sessionScope : idem de porte session
requestScope : idem de porte request
pageScope : idem de porte page
cookie : idem pour les cookies
initParam : idem pour les paramtres d'initialisation
param : Map contenant les paires (nom, 1re valeur) des paramtres
header : idem pour les headers de request.
paramValues: Map<String,String[]> contenant les paires
(nom, tableau de toutes les valeurs) des paramtres
headerValues : idem pour les headers
pageContext : le PageContext

48
Oprateurs - 1
Par priorit dcroissante :
[] .
() (les parenthses)
- (unaire) not ! empty
* / div % mod
+ - (binaire)
< > <= >= lt gt le ge
== != eq ne
&& and
|| or

49
Oprateurs - 2
Les oprateurs ! et not sont identiques.
De mme pour
/ et div
% et mod
< et lt
> et gt
<= et le
>= et ge
== et eq
!= et ne
&& et and
|| et or

50
Oprateurs - 3
Les oprateurs . et [] sont interchangeables :
On peut crire
${user.nom} ou ${user["nom"]}
On les utilise pour l'accs aux champs et l'accs au lments
des Maps :
${param["nom"]} ou $param.nom

51
Accs aux variables
On peut accder aux variables stockes dans les
diffrentes portes comme suit :
${sessionScope.caddie}en prcisant la porte ou
${caddie} sans prciser la porte. Dans ce cas, EL utilise
le pageContext pour la chercher d'abord dans la page,
puis la request, puis la session et finalement l'application,
renvoyant la premire trouve.
Les proprits peuvent tre embotes :
Si caddie contient une Collection articles, on
peut crire ${caddie.articles[0].prix}pour
accder au premier article (dans l'ordre de l'Iterator).

52
Dsactiver EL
Dans une page :
<%@ page isELIgnored="true" %>
Dans un groupe de pages, via web.xml :
<jsp-config>
<jsp-property-group>
<url-pattern>/pasDEL/</url-
pattern>
<el-ignored>true</el-ignored>
</jsp-property-group>
</jsp-config>
On peut prciser seulement une page dans <url-pattern> :
<url-pattern>pasdel.jsp</url-pattern> ou
toutes avec *.jsp
53
JSTL: Mise en uvre

54
JSTL
Un problme reste encore : fournir une forme de
logique de contrle.
Ceci peut tre fait par scriptlet avec les problmes
que l'on sait.
Il faut crer une librairie de tags le permettant.
JSTL en est une. La version 1.0 est parue en 2002.
Depuis lors, adieu les scriptlets !

55
Installation de JSTL
Convertir le projet en un maven project et ajouter
les dpendances suivante:
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>

56
Les 4 tag libraries
c.tld
core : logique de base
On la dclare avec <%@
taglib uri=
"http://java.sun.com/jstl/core" prefix ="c" %>

fmt.tld
formatage et internationalisation
On la dclarre avec <%@ taglib uri=
"http://java.sun.com/jstl/fmt" prefix ="fmt" %>

sql.tld
accs aux bases de donnes
x.tld
traitement de fichier xml
57
La librairie Core - 1

<c:out value="${personne.adresse.ville}"
default="inconnu" />

<c:set var="ville" value="" scope="" />

<c:remove var="ville" scope="" />

58
La librairie Core - 2

<c:if test="${ville == 'Bruxelles'}">



</c:if>
Il n'y a pas de else

59
La librairie Core - 3
<c:choose>
<c:when test="">

</c:when>
<c:when test="">

</c:when>
<c:otherwise>

</c:otherwise>
</c:choose>
60
La librairie Core - 4

<c:forEach [var=""] items="collection" [varStatus=""]>



</c:forEach>
<c:forEach [var=""] [varStatus=""] items="collection"
begin="" end="" [step=""]>

</c:forEach>

61
La librairie Core - 5

<c:forTokens items="stringDeTokens" delim="dlimiteurs"


[var=""] [varStatus=""] [begin=""] [end=""]
[step=""]>

</c:forTokens>
begin doit tre >= 0. 0 est le dfaut.
end doit tre >= begin. Le dernier token est le dfaut.
step doit tre >= 1. 1 est le dfaut

62
La librairie Core - 6

<c:param name="" value=""/>


ou
<c:param name="" >
valeur
</c:param>
permet de rajouter un paramtre (de requte) une url. Ne
s'emploie qu'avec comme anctre <c:url>, <c:import> ou
<c:redirect>

63
MVC: Mise en uvre

64
MVC: intrt
Indpendance entre:
La reprsentation logique dune application (Modle)
La reprsentation visuelle quon en donne (Vue)
Les actions que lutilisateur effectue (Controleur)
Sparation claire entre les donnes du programme et
linterface graphique affichant ces donnes
Possibilit de vues diffrentes dune seul modle
Lapplication peut donner ltat du modle de diffrentes
faons, avec diffrentes interfaces utilisateurs

65
Bean chang travers la requte
request.setAttribute("ref
_B", B)
Servlet (C)

3. Request
Utilisateur 5. Rsultat Dispatcher Bean (M)

JSP (V)

66
Bean chang travers la session
session.setAttribute("ref_
B", B)
Servlet (C)

Utilisateur 3. SendRedirect Bean (M)

session
JSP (V)

67