JSP - electricservices

Download Report

Transcript JSP - electricservices

JSP
Introduction



Une page JSP est une page de texte contenant des
balises (souvent HTML, XHTML, WML ou XML)
pouvant être interprétées par un browser.
A l'intérieur de ces balises, on trouve des éléments
spéciaux, propres à JSP (scriptlets avec du code Java,
tags personnalisés).
Chaque page JSP est transformée par le container en
une servlet : le schéma suivant présente le cycle de
vie d'une page JSP
Cycle de vie d'une page JSP
Bien écrire du JSP

On veillera à respecter trois critères

Possibilité de réutilisation


Lisibilité


utilisation de tags au lieu de code Java
Facilité de maintenance


par utilisation de tag libraries
les deux points précédents, s'ils sont atteints, aident à la
maintenance. Veiller à séparer ce qui est maintenu par le
Webmaster de ce qui doit l'être par le développeur Java
Donc utiliser des tag libraries
Architecture Modèle 1
Architecture Modèle 1


Cette architecture est valable pour de petites
applications
Elle présente des problèmes de



maintenance : la logique est mélangée à la présentation, les
pages sont dès lors plus compliquées, moins lisibles et moins
maintenables
réutilisation : puisque la logique est placée dans la
présentation, on ne sait pas l'utiliser ailleurs
sécurité : risque de dévoiler dans la page, des données
sensibles liées à l'accès à la base de données
Architecture Modèle 2 (MVC2)
Architecture Modèle 2 (MVC2)



Permet de développer/d'accéder à une grosse
application entreprise.
L'utilisation de javabeans par les pages JSP y est
moins nécessaire.
Les problèmes précédents sont résolus par la
séparation de la logique (servlet) et de la
présentation (page JSP).
Serveur

Lancer le serveur JBoss 4.2.1.GA:








dans Eclipse : ouvrez l'onglet Servers (Windows – Show
View – Other – Server – Servers)
dans cet onglet cliquez à droite : New – Server
choisissez JBoss v 4.2, cliquez Next, entrez l'adresse où est
installé JBoss via le bouton Browse et cliquez sur Finish
dans l'onglet Servers apparaît maintenant JBoss 4.2
double cliquez dessus; dans la fenêtre qui s'ouvre suivez le
lien "Open launch configuration"
Ouvrez l'onglet Arguments
Dans Program arguments vous devez mettre
-c default –b 0.0.0.0
Cliquez sur OK
Développement



Dans Eclipse, vous créez un Dynamic Web Project :
New – Project – Web – Dynamic Web Project.
Si votre projet utilise aussi des EJB 3.0, un serveur
d’application est obligatoire et dans ce cas dans
Eclipse, créez un Enterprise Application Project (New
– Project – J2EE – Enterprise Application Project,
donnez un nom, faites Next, puis Next, cochez
Generate deployment descriptor, cliquez sur New
Module et selectionnez EJB Module et Web Module)
Quelle que soit la technique utilisée, vérifiez que les
jar pour les servlets et JSP (servlet-api.jar et jspapi.jar) soient dans votre classpath.
Déploiement





Avant d’exécuter une servlet ou une page JSP, vous devez
déployer votre application.
Pour cela il vous faut créer un fichier war (web archive) si vous
travaillez avec un Dynamic Web Project seul.
Si vous développez un Enterprise Application Project, il faut
créer un fichier ear (entreprise archive, qui contient le fichier
war et le fichier jar où sont placés les EJB).
Pour déployer, il suffit de copier ce fichier war ou ce fichier ear
dans la directory webapps de Tomcat ou deploy de JBoss.
La création de l’archive à déployer et le déploiement peut se
faire en une seule étape dans Eclipse en exportant le projet
concerné sous forme de WAR ou EAR dans la directory voulue.
Une première page JSP
<html>
<body>
<h2>Bonjour !</h2>
<p>Il est <%= new java.util.Date()%></p>
</body>
</html>
Les éléments de base - 1

Commentaires



Déclarations


HTML : <!-- transmis en sortie -->
JSP : <%-- non transmis en sortie --%>
<%!
%> ou <jsp:declaration>...</jsp:declaration>
<%! java.util Date date = new
java.util.Date(); %>
Expressions

<%= %> ou <jsp:expression>...</jsp:expression>
<%= new java.util.Date() %>
Les éléments de base - 2

Scriptlet
 <%
%> ou <jsp:scriptlet>…</jsp:scriptlet>
<%
String user =
request.getAttribute("user");
if (user != null) {
%>
Bienvenue
<%
}
%>
Objets implicites









request : HttpServletRequest
response : HttpServletResponse
out : JspWriter (extends PrintWriter) rarement
utile
session : HttpSession
application : ServletContext
config : ServletConfig
page = this, Object
pageContext : permet la recherche dans toutes les portées
(page, request, session, application), PageContext, généré
par le container
exception : Throwable, accessible dans les pages d’erreur
Les directives JSP

placées entre <%@
<%@ page … %>
<%@ include … %>
<%@ taglib … %>

les … représentent des attributs de la forme





%> ou <jsp:directive. …/>
attribut = valeur
les directives (sauf include) sont placées en tête de
page JSP
La directive page - 1



<%@ page … = "…" … = "…" %> ou
<jsp:directive.page … = "…" … = "…" />
les attributs possibles avec leurs valeurs sont




language = "java" seule valeur permise
extends= "nomDeClasse" // déconseillé
import = liste
exemple : import="java.util.*, java.io.*"
ne doivent pas être importés : java.lang.*,
javax.servlet.*, javax.servlet.http.*,
javax.servlet.jsp.*
session = "true" ou "false" (défaut : true)
La directive page - 2











buffer valeurs possibles : none ou xkb (ex : 32kb)
autoFlush= "true" ou "false" (défaut : true)
isThreadSafe = "true" ou "false" (défaut : true)
info : texte pour getServletInfo()
isErrorPage= "true" ou "false" (défaut : false)
errorPage valeur : url de la page d’erreur (prioritaire sur
web.xml)
contentType (défaut : "text/html")
pageEncoding (défaut : "ISO-8859-1")
isELIgnored = "true" ou "false" (défaut : false)
DeferredSyntaxAllowedAsLiteral = "true" ou
"false" (défaut : false) #{ permit comme littéral ?
trimDirectiveWhitespaces = "true" ou "false"
(défaut : false)
La directive include






<%@ include file="urlRelatif" %> ou
<jsp:directive.include file="urlRelatif" />
Elle permet d’inclure un fichier à l’endroit où est placée la
directive. Cette inclusion a lieu lors de la traduction en servlet.
Rien ne garantit que, si le fichier inclus est modifié, la page
l’incluant sera recompilée mais certains serveurs d’application
peuvent le faire.
Exemple : inclure un header et un footer.
Remarque : pour inclure un même header et un même footer
dans toutes les pages, il vaut mieux créer une section <jspproperty-group> dans la section <jsp-config> de
web.xml.
La directive taglib






On l’utilise, en début de page JSP pour déclarer les
librairies de tags (Tag Library) qu’on va utiliser.
Une tag library est une collection de tags (xml) qu’on
peut utiliser dans une page jsp.
<%@ taglib … %> ou <jsp:root xmlns:prefixe=uri
/> (prefixe est la valeur de prefix et uri la valeur d'uri)
Les … se remplacent par une uri et un prefix.
Ou par une tagdir et un prefix.
Le préfixe est utilisé pour faire appel à un tag de la
librairie.
La directive taglib - façon 1



Utiliser une uri absolue indiquant où se trouve le
fichier .tld décrivant la tag library
<%@ taglib uri="/WEB-INF/tld/uneTagLib.tld"
prefix = "unPrefixe" %>
On utilise alors la librairie avec le préfixe indiqué :
<unPrefixe:afficher fichier="unFichier.gif" />

Désavantage : l’adresse du fichier .tld est hard codé
dans la page jsp
La directive taglib - façon 2


Utiliser une uri relative, nommée. Son nom et sa valeur sont
placée dans le fichier web.xml
Dans web.xml
<jsp-config>
<taglib>
<taglib-uri>/uneTagLib</taglib-uri>
<taglib-location>
/WEB-INF/tld/uneTagLib.tld
</taglib-location>
</taglib>
</jsp-config>

Dans la page jsp
<%@ taglib uri="/uneTagLib" prefix="unPrefixe" %>
La directive taglib – façon 3




Utiliser un fichier jar contenant la tag library et son
fichier tld
<%@ taglib uri="/WEB-INF/lib/uneTagLib.jar"
prefix="unPrefixe" %>
Désavantage : le fichier .tld est d’accès difficile. En
cas de modification , il faut extraire puis reconstituer
l’archive.
Avantage : tag library facile à distribuer
La directive taglib – façon 4




On utilise cette façon avec des fichiers de tags. Ils se
terminent par un suffixe .tag ou .tagx.
On indique via l’attribut tagdir la directory où se
trouvent les fichiers de tags.
Cette directory doit être /WEB-INF/tags ou une de
ses sous directory
<%@ tagdir="/WEB-INF/tags/uneTagLib"
prefix="unPrefixe" %>
Les actions

On distingue trois types d’actions :




les actions standard
les actions JSTL
les actions personnalisées (custom actions)
Les actions standard sont





<jsp:include>
<jsp:forward>
<jsp:useBean>
<jsp:getProperty>
<jsp:setProperty>
L’action <jsp:include>



Elle permet d’inclure un fichier au moment de la requête.
Donc si le fichier inclus a été modifié, c’est la nouvelle version
qui est inclue.
<jsp:include page="autre.jsp" flush="true" />

L’attribut flush n’est pas obligatoire. Sa valeur par défaut est
false.
Le nom de la page peut être calculé dynamiquement

<jsp:include page="${next}" />

On peut passer des paramètres à la page inclue.


<jsp:include page="autre.jsp" >
<jsp:param name="user" value="michel" />
</jsp:include>
L'action <jsp:forward>




Cette action, comme on s'y attend, effectue un
forward vers une autre page.
<jsp:forward page="urlRelative" />
Comme pour <jsp:include>, on peut préciser des
paramètres supplémentaires à transmettre :
<jsp:forward page="/WEB-INF/jsp/login.jsp" >
<jsp:param name="user" value="moi"/>
<jsp:param name="password" value="xyz"/>
</jsp:forward>
L’action <jsp:useBean> - 1


L’utilisation de javabeans est la première façon de
limiter le code Java dans la page jsp.
Un javabean doit avoir
un constructeur sans paramètre
 pas de champs public
 un accès aux propriétés via des getters et setters
getXxx/setXxx pour une propriété xxx.
<jsp:useBean id="nom" scope="…" class="…"
type="…" />


L’action <jsp:useBean> - 2





La valeur de id est le nom de l'instance créée ou
récupérée.
scope vaut "page", "request", "session" ou
"application".
"page" est la valeur par défaut.
Si un bean de ce nom existe dans ce scope il est
récupéré s'il correspond à la classe et/ou au type
précisé (sinon c'est une erreur).
class : la classe complètement qualifiée du bean.
Obligatoire si le bean doit être créé.
exemple : class = "java.util.Date"
L’action <jsp:useBean> - 3




type s'il est présent doit indiquer le type de
déclaration du bean. Il doit être une superclasse de la
classe du bean ou une interface implémentée par le
bean
type ou class doit être présent.
Cette action peut avoir un body
Ce body n'est exécuté que si le bean est créé.
<jsp:useBean id="nom" scope="…" class="…"
type="…" >
body tel que création d'objet, setProperty…
</jsp:usebean>
L'action <jsp:getProperty>



Quand on utilise un Javabean, cette action permet
d'obtenir la valeur de la propriété demandée
<jsp:geProperty name="nomBean" property="xxx"
/>
Cette action a le même effet que
<%= nomBean.getXxx() %>

Elle contribue encore à supprimer le code Java dans
la page JSP
L'action <jsp:setProperty>


Cette action permet de modifier une propriété du
Javabean utilisé.
Elle admet quatre syntaxes


<jsp:setProperty name="nomDuBean"
property="xxx" value="valeur" /> a le même effet
que <% nomDuBean.setXxx("valeur"); %>
<jsp:setProperty nom= "nom" property="xxx"
param="nomParam"/> associe automatiquement la valeur
du paramètre indiqué comme valeur de la propriété xxx du
bean. Ceci a le même effet que <%
nom.setXxx(request.getParameter("nomParam");
%>
L'action <jsp:setProperty>


<jsp:setProperty name="nom" property="xxx"
/>
associe automatiquement la valeur du paramètre xxx comme
valeur de la propriété xxx du bean. Ceci a le même effet que
<% nom.setXxx(request.getParameter("xxx");%>
<jsp:setproperty name="nom" property="*" />
associe automatiquement la valeur de chaque paramètre
comme valeur de la propriété de même nom du bean. Il faut
bien entendu qu'une telle propriété existe sous peine
d'erreur. Ceci a le même effet que <%
nom.setXxx(request.getParameter("xxx"); %>
pour chaque paramètre xxx.
JSP et Servlets en MVC2




Une ou plusieurs servlets servent de contrôleurs.
Les pages jsp sont les vues. Elles appellent une
servlet via un formulaire ou un lien.
La servlet effectue la tâche demandée, stocke les
résultats dans la requête, la session ou l'application
selon le cas et enfin, effectue un forward vers une
autre page jsp.
Celle-ci récupère les résultats via <jsp:useBean ou
via l'Expression Language puis se charge de leur
présentation.
Expression language (EL)




Inspiré d'ECMAScript qui est la version standardisée
de Javascript.
Inspiré également de XPath EL.
Dans le but de ne pas créer encore un nouveau
langage d'expressions et de sembler familier à un
Webmaster.
Introduit pour la première fois dans JSTL puis
incorporé dans JSP depuis la version 2.0 (qui
incorpore aussi JSTL 1.1).
Syntaxe

Les expressions d’EL s’écrivent interchangeablement




${expression} ou
#{expression}
Toutefois dans certaines circonstances (par exemple
dans les tags personnalisés (custom tags)), la
notation ${expression} implique une évaluation
immédiate.
Tandis qu’alors, #{expression}signifie que
l’évaluation de l’expression sera différée (jusqu’à
l’exécution du tag).
Littéraux





Booléens : true false
Entiers : un signe – est permis : -206 14 3
Flottants : un signe – est permis ainsi qu’un exposant
E ou e : -2.4 5. .5 42E-12 31.46e17
Strings : entre " " ou entre ' '. Utiliser \ pour
considérer " ou ' littéralement et \\ pour un \. On
fera '${' pour le considéré comme littéral
Valeur nulle : null
Valeurs par défaut



En cas d'erreur, bien souvent des valeurs par défaut
seront affichées au lieu de générer une erreur
exemple : ${17/0} affiche infinity
${user.nom}est vide si ${user} vaut null
Utilisation

Les expressions d'EL peuvent être utilisée 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> …
Objets prédéfinis











applicationScope : Map contenant les paires (nom, valeur) des
variables de portée (scope) application
sessionScope : idem de portée session
requestScope : idem de portée request
pageScope : idem de portée page
cookie : idem pour les cookies
initParam : idem pour les paramètres d'initialisation
param : Map contenant les paires (nom, 1ère valeur) des paramètres
header : idem pour les headers de request.
paramValues: Map<String,String[]> contenant les paires
(nom, tableau de toutes les valeurs) des paramètres
headerValues : idem pour les headers
pageContext : le PageContext
Opérateurs - 1

Par préséance décroissante :









[] .
() (les parenthèses)
- (unaire) not ! empty
* / div % mod
+ - (binaire)
< > <= >= lt gt le ge
== != eq ne
&& and
|| or
Opérateurs - 2

Les opérateurs ! et not sont identiques.

De même pour










/ et div
% et mod
< et lt
> et gt
<= et le
>= et ge
== et eq
!= et ne
&& et and
|| et or
Opérateurs - 3

Les opérateurs . et [] sont interchangeables :


On peut écrire
${user.nom} ou ${user["nom"]}
On les utilise pour l'accès aux champs et l'accès au éléments
des Maps :
${param["nom"]} ou $param.nom
Accès aux variables

On peut accéder aux variables stockées dans les
différentes portées comme suit :



${sessionScope.caddie}en précisant la portée ou
${caddie} sans préciser la portée. 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 première trouvée.
Les propriétés peuvent être emboîtées :

Si caddie contient une Collection articles, on peut
écrire ${caddie.articles[0].prix}pour accéder au
premier article (dans l'ordre de l'Iterator).
Désactiver 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 préciser seulement une page dans <url-pattern> :
<url-pattern>pasdel.jsp</url-pattern> ou toutes
avec *.jsp
Désactiver les scriptlets

A l'inverse, on peut interdire les scriptlets dans une,
un groupe ou toutes les pages via le fichier web.xml :

<jsp-config>
<jsp-property-group>
<url-pattern>
/pasDeScripts/
</url-pattern>
<scripting-invalid>
true
</scripting-invalid>
</jsp-property-group>
</jsp-config>
Les fonctions




Une fonction EL correspond à une méthode static d'une
classe Java.
Une telle fonction peut se mettre dans les attributs des tags ou
dans le corps de la page.
Elles peuvent avoir des paramètres.
On les appellent en utilisant un préfixe


Ce préfixe est déclaré dans une directive taglib, par exemple :



<MesFonctions:uneFonction("param")}
<%@ taglib uri="WEB-INF/tld/fonctions.tld"
prefix="MesFonctions" %>
Voir démo : Fonctions.java, fonctions.tld, salut.jsp, source.jsp.
Fonctions emboîtées : voir souceMAJ.jsp
JSTL




Un problème reste encore : fournir une forme de
logique de contrôle.
Ceci peut être fait par scriptlet avec les problèmes
que l'on sait.
Il faut créer une librairie de tags le permettant.
JSTL en est une. La version 1.0 est parue en 2002.
Depuis lors, adieu les scriptlets !
Installation de JSTL



Downloadez JSTL à l'adresse http://jakarta.apache.org/taglibs.
Suivez Downloads et choisissez Standard 1.1 Taglib
Décompressez l'archive.
On peut alors travailler de deux manières


Placer standard.jar et jstl.jar dans le WEB-INF/lib de votre projet :
Ils seront alors contenu dans votre fichier .war
ou placer standard.jar et jstl.jar dans la directory lib de votre
serveur d'application. Pour JBoss 4.2.1.GA, c'est inutile, il contient
déjà jstl. Vous n'avez donc rien à faire. Veillez néanmoins à ce que
ces deux jar soient dans votre classpath (le Build Path de votre
projet dans Eclipse). Pour JBoss 4.2.1.GA, vous devez seulement
ajouter %JBOSS_HOME%/server/default/deploy/jbossweb.deployer/jstl.jar dans le Build Path. (il contient les deux jar de
JSTL)
Utilisation de JSTL



Pour que votre projet puisse utiliser JSTL, il faut
encore préciser dans votre web.xml où se trouvent
les fichier .tld de JSTL
Ouvrez standard.jar avec WinRar. Si vous travaillez
avec JBoss, ouvrez leur version de jstl.jar avec
WinRar. dans les deux cas déplacez-vous dans METAINF et extrayez les fichiers c.tld , fmt.tld, sql.tld et
x.tld. Placez les dans la directory WEB-INF/tld de
votre application.
Ces 4 tld correspondent aux 4 tag libraries de jstl
Les 4 tag libraries

c.tld


fmt.tld


formatage et internationalisation
sql.tld


core : logique de base
accès aux bases de données
x.tld

traitement de fichier xml
La librairie Core



On la déclarre avec
<%@ taglib uri= "http://java.sun.com/jstl/core"
prefix ="c" %>
Dans web.xml on ajoute la déclaration de cet uri
<jsp-config>
<taglib>
<taglib-uri> http://java.sun.com/jstl/core
</taglib-uri>
<taglib-location>
/WEB-INF/tld/c.tld
</taglib-location>
</taglib>
</jsp-config>
La librairie Core - 1

<c:out value="${personne.adresse.ville}"
default="inconnu" />

<c:set var="ville" value="…" scope="…" />

<c:remove var="ville" scope="…" />
La librairie Core - 2



<c:catch var="exception">
…
</c:catch>
<c:if test="${ville == 'Bruxelles'}">
…
</c:if>
Il n'y a pas de else
La librairie Core - 3

<c:choose>
<c:when test="…">
…
</c:when>
<c:when test="…">
…
</c:when>
<c:otherwise>
…
</c:otherwise>
</c:choose>
La librairie Core - 4


<c:forEach [var="…"] items="collection"
[varStatus="…"]>
…
</c:forEach>
<c:forEach [var="…"] [varStatus="…"] begin="…"
end="…" [step="…"]>
…
</c:forEach>
La librairie Core – 5




<c:forTokens items="stringDeTokens"
delim="délimiteurs" [var="…"] [varStatus="…"]
[begin="…"] [end="…"] [step="…"]>
…
</c:forTokens>
begin doit être >= 0. 0 est le défaut.
end doit être >= begin. Le dernier token est le
défaut.
step doit être >= 1. 1 est le défaut
La librairie Core - 6

<c:param name="…" value="…"/>
ou
<c:param name="…" >
valeur
</c:param>
permet de rajouter un paramètre (de requête) à une
url. Ne s'emploie qu'avec comme ancêtre <c:url>,
<c:import> ou <c:redirect>
La librairie Core - 7







<c:import url=http://... [context="…"] [var = "url"]
[scope="…"] [charEncoding="…"] [varReader="…"]/>
Plus général que <jsp:include>
Il permet d'inclure un fichier d'une autre application
déployée sur le même serveur si on précise un context
(dans le format renvoyé par request.getContextPath()).
On peut stocker le contenu du fichier inclus dans une
variable avec var
On peut accéder au contenu via un Reader avec
varReader. Dans ce cas, <c:import> doit avoir un body
pour traiter le Reader qui est local à l'action
L'attribut scope indique la portée de var
L'action <c:import> peut aussi avoir un body pour ajouter
des paramètres avec <c:param>
La librairie Core - 8






<c:url value="une_url" [context="…"] [var="…"]
[scope="…"] />
Définit une url (relative ou absolue)
Si le browser de la requête refuse les cookies, l'action
pratique l'url rewriting
Si var est présent, l'url (rewritée) sera placé dans la
variable indiquée, dans le scope indiqué (page par
défaut)
Un attribut context permet de placer une url faisant
partie d'une autre application du même serveur
Le tag peut avoir un body, pour ajouter des
paramètres à l'url.
La librarie Core - 9



<c:redirect url="…" [context="…"]/>
Redirige la requête vers l'url indiquée, pratiquant l'url
rewriting si nécessaire
L'attribut context permet de préciser une page d'une
autre application
Librairie de Formattage



On la déclarre avec
<%@ taglib uri= "http://java.sun.com/jstl/fmt" prefix
="fmt" %>
Dans web.xml on ajoute la déclaration de cet uri
<jsp-config>
<taglib>
<taglib-uri> http://java.sun.com/jstl/fmt
</taglib-uri>
<taglib-location>
/WEB-INF/tld/fmt.tld
</taglib-location>
</taglib>
</jsp-config>
Librairie de Formatage :
Internationalisation (i18n) - 1


<fmt:setLocale value="…" [scope="…"]/>
où value est par exemple "en_US", "fr_FR" ou "fr_BE" ou
simplement "en", "fr", …
On peut définir une Locale par défaut dans web.xml
<context-param>
<param-name>
javax.servlet.jsp.jstl.fmt.locale
</param-name>
<param-value>en</param-value>
</context-param>

Idem avec fallbackLocale si le Locale demandé n'est pas
supporté par le serveur
Librairie de Formatage :
Internationalisation (i18n) - 2
ResourceBundle :

ResourceBundle mesTrads =
ResourceBundle.getBundle("MesTraductions",
Locale.FRENCH);
public class MesTraductions extends
PropertyResourceBundle {
MesTraductions() {
super(new
FileInputStream("mestrad.properties");
}
}
mestrad.properties





firstName=prénom
lastName=nom
Librairie de Formatage :
Internationalisation (i18n) - 3





<fmt:setBundle baseName="…" [var="…] [scope="…"]/>
baseName indique le nom de la classe du ResourceBundle : ex :
"MesTraductions" y compris le nom de package.
var, si présent, sert à stocker le bundle dans une variable qu'on
précisera lors d'un emploi futur
Si var n'est pas présent, on définit ainsi le ResourceBundle par
défaut
Il suffit de placer le fichier MesTraductions_fr.properties ou
MesTraductions_fr_FR.properties dans la directory src de votre
projet. Le reste est automatique.
Librairie de Formatage :
Internationalisation (i18n) - 4


On peut préciser un bundle par défaut dans web.xml
<context-param>
<param-name>
javax.servlet.jsp.jstl.fmt.localizationContext
</param-name>
<param-value>messages.MesTraductions</param-value>
</context-param>
Librairie de Formatage :
Internationalisation (i18n) - 5



<fmt:message key="…" [bundle="…"] [var="…"]
[scope="…"]/>
Sans var, affiche le message correspondant à la clé
indiquée. La recherche de cette clé se fait dans le
ResourceBundle par défaut sauf si l'attribut bundle
est présent. Il indique le contenu d'une variable
définie avec <setBundle … var="…"/>
Si var est présent, le message est placé dans la
variable.
Librairie de Formatage :
Internationalisation (i18n) - 6


Si le message attend des paramètres, on utilise
<fmt:param value="objet" />


<fmt:message key="${clef}">
<fmt:param value="${prenom}"/>
<fmt:param value="${nom}"/>
</fmt:message>
Dans le fichier .properties on a clef=Bonjour {0} {1}
Librairie de Formatage :
Internationalisation (i18n) - 7




<fmt:bundle baseName="…" [prefix="…"]>
définit un bundle localement
baseName, comme dans setBundle
prefix pour être employé dans les fmt:message

<fmt:bundle baseName="MesTraductions">
<fmt:message key="trad.nom"/>
<fmt:message key="trad.age"/>
</fmt:bundle>
Librairie de Formatage :
Internationalisation (i18n) - 8

Avec un préfixe :

<fmt:bundle baseName="MesTraductions" prefix="trad" >
<fmt:message key="nom"/>
<fmt:message key="age"/>
</fmt:bundle>
Librairie de Formatage :
Formatage des dates - 1

<fmt:setTimeZone value="…" [var="…"]
[scope="…"]/>



value doit être une String ou une TimeZone
Si var est présent, la variable indiquée stockera le TimeZone.
Sinon, le fuseau horaire est modifié.
<fmt:timeZone value="…">
…
</fmt:timeZone>

définit une TimeZone locale au corps du tag qui est
généralement constitué de <fmt:formatDate>
Librairie de Formatage :
Formatage des dates - 2

<fmt:formatDate value="date"
[type="{time|date|both}"]
[dateStyle="{default|short|medium|long|full}"]
[timeStyle="{default|short|medium|long|full}"]
[pattern="customPattern"]
[timeZone="timeZone"]
[var="varName"]
[scope="{page|request|session|application}"]/>


timeZone est une String ou une TimeZone
si var est présent le résultat est stocké, sinon affiché
Librairie de Formatage :
Formatage des dates - 3

<fmt:parseDate value=”dateString”
[type=”{time|date|both}”]
[dateStyle=”{default|short|medium|long|full}”]
[timeStyle=”{default|short|medium|long|full}”]
[pattern=”customPattern”]
[timeZone=”String ou TimeZone”]
[parseLocale=”String ou Locale”]
[var=”de type java.util.Date”]
[scope=”{page|request|session|application}”]/>
Librairie de Formatage :
Formatage des dates - 4



<fmt:parseDate> peut aussi être utilisé avec un
body. Dans ce cas il n'y a pas d'attribut value et la
valeur parsée est le body..
Il est recommandé de n'utiliser cette action qu'avec
un pattern (de style SimpleDateFormat) car les
dateStyle et timeStyle varient avec le Locale
Si la chaîne parsée ne correspond pas au format
attendu, une exception se produit
Librairie de formatage :
Formatage des nombres - 1

<fmt:formatNumber value=”numericValue”
[type=”{number|currency|percent}”]
[pattern=”customPattern”]
[currencyCode=”currencyCode”]
[currencySymbol=”currencySymbol”]
[groupingUsed=”{true|false}”]
[maxIntegerDigits=”maxIntegerDigits”]
[minIntegerDigits=”minIntegerDigits”]
[maxFractionDigits=”maxFractionDigits”]
[minFractionDigits=”minFractionDigits”]
[var=”varName”]
[scope=”{page|request|session|application}”]/>
Librairie de formatage :
Formatage des nombres - 2




<fmt:formatNumber> peut aussi avoir un body. dans
ce cas, il n'y a pas d'attribut value et le body est
constitué de la valeur numérique à formater.
Le pattern est de style DecimalFormat.
currencyCode est le code ISO 4217 de la monnaie.
currencySymbol et currencyCode ne sont
normalement pas indiqués tous deux. S'ils le sont
c'est currencyCode qui prévaut. Si aucun des deux
n'est présent c'est la Locale qui décide.
Librairie de formatage :
Formatage des nombres - 3



<fmt:parseNumber value=”numericValue”
[type=”{number|currency|percent}”]
[pattern=”style DecimalFormat”]
[parseLocale=”String ou Locale”]
[integerOnly=”{true|false}”]
[var=”varName”]
[scope=”{page|request|session|application}”]/>
Peut aussi être utilisé avec un body au lieu de value.
Une exception se produit si la string parsée ne
correspond pas à un nombre.
La librairie SQL - 1

<sql:setDataSource
{dataSource="dataSource" |
url="jdbcUrl"
[driver="driverClassName"]
[user="userName"]
[password="password"]}
[var="varName"]
[scope=”{page|request|session|application}”]/>


Si on utilise dataSource, il faut y mettre une entrée JNDI qui
sera préfixée par java:comp/env/
sinon on utilise l'url, le driver, le user et le password comme
en JDBC
La librairie SQL - 2

Syntaxe 1: Sans body
<sql:query sql="sqlQuery"
var="varName"
[scope=”{page|request|session|application}”]
[dataSource=”dataSource”]
[maxRows="maxRows"]
[startRow="startRow"]/>
La librairie SQL - 3

Syntaxe 2: Avec un body pour passer des paramètres
<sql:query sql="sqlQuery"
var="varName"
[scope=”{page|request|session|application}”]
[dataSource=”dataSource”]
[maxRows="maxRows"]
[startRow="startRow"]>
<sql:param …>
</sql:query>
La librairie SQL - 4

Syntaxe 3: Avec un body pour spécifier le query et
éventuellement des paramètres
<sql:query var="varName"
[scope=”{page|request|session|application}”]
[dataSource=”dataSource”]
[maxRows="maxRows"]
[startRow="startRow"]>
query
[<sql:param …>]
</sql:query>
La librairie SQL - 5




Le query peut contenir des ?
Dans ce cas les paramètres les remplacent dans
l'ordre des ? et des paramètres
Si la variable stockant le résultat s'appelle res, on la
parcourt avec un
<c:forEach var="ligne" items="${res.rows}">
Dans ligne on peut accéder aux colonnes de la table :
ligne.ID, ligne.NAVIRE_ID…
La librairie SQL - 6

Syntaxe 1: Sans body
<sql:update sql="sqlUpdate"
[dataSource=”dataSource”]
[var="varName"]
[scope=”{page|request|session|application}”]/>

var si présent, récupère le nombre de lignes modifiées
La librairie SQL - 7

Syntaxe 2: Avec un body pour passer des paramètres
<sql:update sql="sqlUpdate"
[dataSource=”dataSource”]
[var="varName"]
[scope=”{page|request|session|application}”]>
<sql:param …>
</sql:update>
La librairie SQL - 8

Syntaxe 3: Avec un body pour spécifier le query et
éventuellement des paramètres
<sql:update [dataSource=”dataSource”]
[var="varName"]
[scope=”{page|request|session|application}”]>
update, insert ou delete
[<sql:param …>]

</sql:update>
La librairie SQL - 9

<sql:transaction [dataSource=”dataSource”]
[isolation=isolationLevel]>
<sql:query> et <sql:update>
</sql:transaction>
isolationLevel ::= "read_committed"
| "read_uncommitted"
| "repeatable_read"
| "serializable"
La librairie XML - 1

définit des actions




de type core
de type contôle
de type transformation
nécessite xalan.jar


soit dans WEB-INF/lib de votre projet
soit dans une directory chargée par le serveur d'application
(dans JBoss, il se trouve dans
%JBOSS_HOME%\lib\endorsed)
La librairie XML - 2


On utilise les notations XPath pour voyager dans le
fichier XML
On a également accès aux objets jstl prédéfinis avec
la syntaxe suivante






$brol (une variable de portée non précisée)
$param:brol
$header:brol
$cookie:brol
$initParam:brol
$pageScope:brol (ou $requestScope, $sessionScope,
$applicationScope)
La librairie XML - 3

Considérons le fichier livre.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<livre>
<titre>
Professional JSP 2, 4th Edition
</titre>
<auteur>Brown et. al</auteur>
<isbn>1-59059-513-0</isbn>
<publié>December 2005</publié>
<éditeur>Apress</éditeur>
<url>
http://www.apress.com/book/bookDisplay.html?bID=464
</url>
</livre>
La librairie XML - 4


On pourra parser ce fichier en faisant
<c:import url="livre.xml" var="url"/>
<x:parse doc="${url}" var="livre"/>
Puis on accédera aux données du fichier à l'aide de la
variable livre et par navigation :
<x:out select="$livre/livre/titre"/>
<x:out select="$livre/livre/auteur"/>
La librairie XML – 5



Core :
<x:parse
{doc=”XMLDocument”|xml=”XMLDocument”}
{var=”var” [scope=”scope”]|varDom=”var”
[scopeDom=”scope”]}
[systemId=”systemId”]
[filter=”filter”]/>
L'attribut xml est deprecated. doc ou xml doivent être
une String ou un Reader
La librairie XML – 6

<x:parse
{var=”var” [scope=”scope”]|varDom=”var”
[scopeDom=”scope”]}
[systemId=”systemId”]
[filter=”filter”]>
Document XML à parser
</x:parse>




systemId est l'uri de l'emplacement physique du fichier
var, la variable qui contiendra le xml parsé (+son scope)
ou varDom (idem de type org.w3c.dom.Document (+son
scope= scopeDom)
filter= le filtre SAX à appliquer au fichier XML
(org.xml.sax.XMLFilter)
La librairie XML - 7

<x:out select=”XPathExpression”
[escapeXml=”{true|false}”]/>


escapeXML indique s'il faut que <,>,&,'," doivent être
remplacés par leurs codes respectifs : &lt;, &gt;, &amp;,
&#039;, &#03; true par défaut
<x:set select=”XPathExpression” var=”…”
[scope=”…”]/>
La librairie XML - 8


Contrôle :
<x:if select=”XPathExpression” [var=”…”] [scope=”…”]>
body

</x:if>
<x:choose>
<x:when select="…">
…
</x:when>
…
<x:otherwise>
…
</x:otherwhise>
</c:choose>
La librairie XML - 9

<x:forEach [var=”…”] select=”XPathExpression”>
[varStatus=”varStatusName”]
[begin=”begin”] [end=”end”] [step=”step”]>
body content
</x:forEach>
La librairie XML - 10



Transformation XSLT
Par exemple :
<c:import url="livres.xml" var="livres" />
<c:import url="livres.xsl" var="xslt" />
<x:transform doc="${livres}" xslt="${xslt}"/>
De nombreux attributs sont possibles, des
paramètres et le document peut être placé en body.
Voir la spécification pour plus de détails.
Contenu d'un fichier .tld


Les tags y sont définis : <description>, <name>, <tag-class>
se comprennent d'eux même.
<body-content> peut prendre les valeurs





empty : pas de body
JSP : n'importe qu'el code JSP
scriptless : idem sans code Java
tagdependent : c'est le tag qui décide si le body est inclus ou
évalué. Le body est considéré comme du texte simple mais peut
contenir du code d'un autre langage que le tag passera à un
parseur pour ce langage
<attribute> a un <name>, peut être <required> et accepter
des request time expression ou non (<rtexprvalue>)
Custom tags ou Javabeans



Utilisez les Javabeans pour y stocker de l'information
Utilisez les customs tags (et les fonctions EL) pour y
définir des traitements sur ces informations, de la
logique liée à la présentation de ces informations.
Les customs tags se répartissent en



tag files
simple tags
classic tags
Tag files






Constitués de code JSP
Placés dans WEB-INF/tags ou une de ses sous-directories
Utilisés avec la version 4 de la directive taglib
Il n'y a pas de .tld
Semblable à <jsp:include> avec plus de possibilités
Exemple : copyright.tag:
Copyright 2007, www.ipl.be

usage : <%@ taglib prefix="tags" tagdir="/WEB-INF/tags %>

<tags:copyright>
en xml : <jsp:root
xmlns:tags="urn:jsptagdir:/WEB-INF/tags"

peut aussi être indiqué dans le tag <html>