Vous êtes sur la page 1sur 96

JSP : Java Server Page

Jean-Jacques LE COZ
Plan
Technologie
Syntaxe
Template
Directives
Dclarations
Objets Implicites
Expressions
Scriptlets
Actions
Technologie
JSP technologie
Cration dynamique de contenus
Ct serveur
La technologie combine
Java Servlet
HTML
XML
JavaBeans

J2EE
Web Container







JSP Page
Servlet
Java 2 Standard Edition APIs
EJB Container







EJB
JDBC
JMS
JNDI
JTA
JavaMail
JAF
RMI-IIOP
Du point de vue HTML
Extension de HTML
Code Java embarqu.
Le code Java gnre du contenu dynamique.
Le contenu est intgr dans du HTML/XML.
Du point de vue Java
Une autre faon d'crire des servlets
Sparation du contenu de la prsentation.
L'environnement d'excution compile le code
de la page JSP dynamiquement.
Contenus statiques
HTML
HyperText Markup Language
SVG
Scalable Vector Graphics
WML
Wireless Markup Language
XML
Extensible Markup Language
Accder aux pages statiques
Navigateur




Uniform Resource Locator (URL)
Serveur Web




index.html
HTTP request
HTTP response
(contenu de index.html)
1
2
3
Contenus dynamiques
Balises typiques JSP
Directives, dclarations, expressions, scripts
java
<%@, <%!, <%=, <%
Commentaires
<%-- le commentaire --%>
Balises XML JSP
Gestion des JavaBean
<jsp:useBean, <jsp:setProperty, ...
Contenus dynamiques
Balises JTL
Standard (JSTL)
Pseudo langage avec structures de contrle
<c:forEach, <c:when, <c:if, ...
Personnalis (JCTL)
Rfrence des librairies
<f:uneFonction, ....
Langage EL (Expression Language)
Accs aux attributs des objets
(${ objet.attribut } )
Accder aux pages dynamiques

Navigateur

nom :



dupont
valider
Serveur Web









index.html
login.jsp
excution
de
login.jsp
output.html
HTTP response
(contenu de output.html)
HTTP request (''dupont'', login.jsp)
1
2
3
5
4
6
Langage EL et EL unifi
Langage EL
Simplification des expressions JSP
Permet
Accs aux objets implicites
Accs aux classes Java
Facilite la gestion des collections
Syntaxe
${ expressionEL }
Mcanisme d'valuation immdiat
Quand la page est transforme en flux HTML
Read-only
Langage EL version JSP2.0
Unified Expression Language
Ajout la spcificationJavaServer Pages
Standard Tag Library (JSTL)
Pour rendre le langage EL compatible avec
celui de JSF
Pour permettre en plus du mode immdiat
le mode difrr
Read-Write

Unified Expression Language
Possibilits
valuation difrre des expressions
Durant le cycle de vie
Supporte les expressions qui peuvent
Modifier des valeurs
Invoquer des mthodes
Utilisation des balises JSTL pour les
itrations avec les expressions difrres
valuation difrre (1)
Exemple avec une expression JSF:
<h:inputText id="nom" value="#{etudiant.nom}"/>
Lors du chargement de la page
valuation immdiate
Lors de la soummission de la saisie
valuation difrre durant les phases JSF
valuation difrre (2)
Phases d 'valuation de l'exemple
apply request value
La valeur saisie est rcupre de la requte
process validation
La valeur saisie est valide
update model
La valeur saisie met jour le modle, ici le nom de
l'tudiant
Types d'expression (1)
Expression de valeur
Left expression
Lecture-criture
Syntaxe : #{expression difrre}
Right expression
Lecture
Syntaxe : ${expression immdiate}
Types d'expression (2)
Expression de mthode
Permet d'invoquer une mthode
Syntaxe : #{nomObjet.nomMthode}
Exemple avec JSF
<prefix:inputText id="id"
value="#{etudiant.id}"
validator="#{student.validerId}"/>
Le TLD qui dfinit la balise inputText spcifie la
signature de la mthode
La mthode validerId est invoque durant la
phase process validation du cycle de vie
Mcanisme extensible
Concept de ELResolver
Permet de dterminer si les
expressions sont rsolues par JSP ou
JSF
Classe gnrique ELResolver
Un ensemble de ELResolver est fourni
Mcanisme d'extension
Il est possible d'crire son propre Resolver
crire le Resolver
Enregistrer le Resolver auprs de l'application
Utiliser les expressions
Une simple page JSP
BonjourLeMonde.jsp

<HTML>
<HEAD><TITLE>Bonjour Le Monde JSP Exemple</TITLE></HEAD>
<BODY>
Bonjour Le Monde.
</BODY>
</HTML>

Une page JSP dynamique
BonjourLeMondeBIS.jsp

<HTML>
<HEAD><TITLE>Bonjour Le Monde JSP Exemple</TITLE></HEAD>
<BODY>
Bonjour Le Monde. La date est : <%= new java.util.Date() %>.
</BODY>
</HTML>


Note : c'est la date du serveur qui s'affiche ici, pas celle du client.

Une autre syntaxe
BonjourLeMondeTER.jsp

<HTML>
<HEAD><TITLE>Bonjour Le Monde JSP Exemple</TITLE></HEAD>
<BODY>
Bonjour Le Monde. La date est :
<jsp:expression> new java.util.Date() </jsp:expression>
</BODY>
</HTML>

La syntaxe XML est plus claire mais ne change rien au code produit lors
de la compilation et rien au rsultat.

Les pages JSP sont des
servlets
Techniquement une page JSP est
compile en une servlet :
La page JSP est traduite en code source
Java d'une servlet.
Le code source de la servlet est ensuite
compile.
Ralis une seule fois lors de la premire
invocation.
JSP : cycle de vie
navigateur
JSP container
JSP pages JSP page
contenu
statique
HTTP
request
HTTP
response
(Tomcat)
Traduite en
une servlet
et compile
servlet
excution
de la
servlet
servlet
output
Dploiement
Prfrable de dployer sous une forme
typique de fichier JAR.
Fichiers WAR (Web App Repository) .
A partir de la version 2.2 des spcifications.
Contiennent les rgles de dploiement :
Correspondance entre URIs (Uniform Resource
Identifiers) et les ressources.
Permet de dployer une application avec un
seul fichier binaire sans les sources.
Rappels sur les archives WAR
tape 1:
$>mkdir application_web
$>mkdir application_web/src
$>mkdir -p application_web/WEB-INF/classes
tape 2:
$>mv *.html application_web/
tape 3:
$>mv web.xml application_web/WEB-INF/
tape 4:
$>mv *.java application_web/src/
$>mv *.jsp application_web/
tape 5:
$>mv *.class application_web/WEB-INF/classes/
tape 6:
$>cd application_web
$>jar -cvfM applicationWeb.war
Interface JSP
Interface JspPage
Spcialise la classe Servlet.
Contrat entre la page JSP et le serveur.
Implmentation du protocole HttpJspPage.
Mthode _jspService.
JSP syntaxe
lments (1)
Contenu Template
Tout ce qui, dans la page, n'est pas du JSP.
Directives
Les instructions pour prciser comment
construire la page.
lments (2)
lments de script
Dclarations, expressions et scriptlets.
Actions
Fonctionnalits offertes partir de balises
spciales XML. Le code de ces fonctionnalits
est masqu.
Rsum
lment Syntaxe <% Syntaxe XML
Commentaire HTML
Commentaire JSP
Dclaration
Expression
Scriplet
Directive <%@ ... %>
<!-- commentaire --> <!-- commentaire -->
<%-- commentaire --%> <%-- commentaire --%>
<%! dclaration java %> <jsp:declaration> dclaration java </jsp:declaration>
<%= expression java %> <jsp:expression> expression java </jsp:expression>
<% instruction java %> <jsp:scriplet> instruction java </jsp:scriplet>
<jsp:directive type .../>
Template
Contenu Template
Template content
Tout ce qui n'est pas du JSP
Template text
HTML
Non transform
Pass tel quel au flux de sortie
Exemple de template
<jsp:directive.page import="java.util.Date"/>
<HTML>
<HEAD><TITLE>Bonjour Le Monde</TITLE></HEAD>
<BODY>
Bonjour Le Monde. La date est <%= new Date() %>.
</BODY>
</HTML>

Commentaires
Trois faons d'introduire un commentaire
Commentaire HTML
Commentaire JSP
Commentaire dans un script
Commentaire HTML
<!-- commentaire HTML -->
<!-- La date est <%= new java.util.Date() %> -->
<HTML>
<HEAD><TITLE>Bonjour Le Monde Exemple</TITLE></HEAD>
<BODY>
Bonjour Le Monde.
</BODY>
</HTML>

Commentaire JSP
<%-- commentaire JSP --%>
<%-- Un nouvel exemple: --%>
<HTML>
<HEAD><TITLE>Bonjour Le MondeExemple</TITLE></HEAD>
<BODY>
Bonjour Le Monde.
</BODY>
</HTML>

Commentaire de script
<jsp:directive.page import="java.util.*"/>
<jsp:declaration>
/* date est une nouvelle variable, initialise lors de son instantiation.
Elle peut aussi tre utilise de la faon suivante :
out.println(''instancie ''+ date); // affiche la date aprs le texte
*/
Date date = new Date();
</jsp:declaration>
<HTML>
<HEAD><TITLE>Bonjour Le Monde Exemple</TITLE></HEAD>
<BODY>
Bonjour Le Monde.<BR>
Cette page a t charge en mmoire <%= date %>.<BR>
La date est <%= new Date() %>
</BODY>
</HTML>

Rgles de protection
Type d'lmentCaractre Protection
Template <% <\%
Script %> %\>
Attribut ' \'
Attribut ' \''
Attribut \ \\
Attribut <% <\%
Attribut %> %\>
Exemple de page JSP
<HTML>
<HEAD><TITLE>Bonjour Le Monde Escape Sequences</TITLE></HEAD>
<BODY>
<P>Bonjour Le Monde.<BR>
La date est <%= new java.util.Date() %>.<BR>
Le temps est calcul par l'expression JSP
<I>&lt;%=new Date()%&gt;.</I></P>
<P>Les protections JSP ne fonctionnent pas dans le code HTML.
Pourquoi ? Parce que HTML possde ses propres rgles. </P>
<P>La rgle HTML la plus importante est que '&lt;' est
cod ainsi <I>"&amp;lt;"</I>, '&gt;' est cod comme cela
<I>"&amp;gt;"</I>, et '&amp;' est cod ainsi <I>"&amp;amp;"</I>.
</P>
</BODY>
</HTML>
Rgles de protection HTML
Caractre Protection HTML
< &lt;
> &gt;
& &amp;
Liste officielle des caractres d'chappement HTML :

http://www.w3.org/TR/html401/sgml/entities.html
Directives
Directives JSP
Informations suplmentaires pour le
serveur :
Imports de paquetage,
Include de fichiers,
Accs aux librairies de custom tag
Syntaxe
<%@ directive [...] %>
<jsp:directive.directive [...] />
Rsum des directives
Directive Fonction
Page Contrle les proprits de la page JSP
Include Introduit le contenu d'un fichier dans la page JSP lors de la translation
Taglib Ralise le custom tag d'une librairie disponible pour la page JSP
Exemple de directive : page
<% page [attribut=''valeur''] %> ou <jsp:directive.page [attribut=''valeur''] />

Exemple :

<jsp:directive.page import="java.util.Date"/>
<HTML>
<HEAD><TITLE>Bonjour Le Monde JSP Exemple </TITLE></HEAD>
<BODY>
Bonjour Le Monde.
La date est <%= new Date() %>.
</BODY>
</HTML>
Attributs de la directive : page
Attribut Valeur Valeur par dfaut
Language Java Java
Extends Superclass
Import
Session True | false True
Buffer Kilobytes ou non 8Kb
AutoFlush True | false True
IsThreadSafe True | false True
Info Text
ErrorPage URL pour la page erreur
IsErrorPage True | false False
ContentType MIME type Text/html
Directive : include
Introduit le contenu d'un fichier dans la
page JSP.
Lors de la translation ou compilation.
Comme un #include en c/c++.
Diffrent de l'action include.
Opre au moment de la requte.
Syntaxe
<%@ include file=''nomFichier'' %>
<jsp:include page=''nomFichier'' />
Exemple de directive : include
<jsp:include page="/copyright.html" />
<HTML>
<HEAD><TITLE>Bonjour Le Monde</TITLE></HEAD>
<BODY>
Bonjour Le Monde.
</BODY>
</HTML>

Exemple de construction
quivalences entre critures
Il n'y a pas toujours galit entre critures
Exemple
La directive include
<%@ include file=''fichier.html''%>
Mcanisme de mise en cache de la ressource
Statique
<jsp:include page=''fichier.html'' flush=''true''
/>
Attribut flush obligatoire en jsp1.1 pas en jsp1.2
Dynamique
Directive : taglib
Possibilit de crer ses propres balises
XML et de les utiliser dans une page JSP.
Chaque taglib fait rfrence une
librairie c'est dire une implmentation
Java.
Permet de dcoupler la prsentation de
la logique applicative contenue dans les
taglib.
Exemple d'utilisation de taglib
<jsp:directive.taglib uri="jdg.tld" prefix="jdg" />
<HTML>
<HEAD><TITLE>Bonjour Le Monde</TITLE></HEAD>
<BODY>
Bonjour Le Monde.
La date est <jdg:DATE />.
</BODY>
</HTML>

Mcanisme des taglib
JSP
web.xml
tags.tld
Tag Handler
(classe java)
<%@ taglib URI=''/tags'' prefix=''ex'' %>
<taglib>...
<tagclass>...
Dclarations
Dclaration JSP
Permet de dclarer des donnes et des
fonctions.
Utilises dans la page JSP.
Syntaxe
<%! dclarations java %>
<jsp:declaration> dclarations java
</jsp:declaration>
Exemple de dclaration
jsp:directive.page import="java.util.Date"/>
<jsp:declaration>
private static String loadTime = new Date().toString();
private static String getLoadTime() { return loadTime; }
private static String getCurrentTime() { return new Date().toString(); }
</jsp:declaration>
<HTML>
<HEAD><TITLE>Bonjour Le Monde</TITLE></HEAD>
<BODY>
Bonjour Le Monde.<BR>
Cette page a t charge en mmoire <%= getLoadTime()%>.<BR>
La date est <%= getCurrentTime() %>
</BODY>
</HTML>

Deux dclarations particulires
Mthodes optionnelles
Mthode: public void jspInit()
Mthode: public void jspDestroy()
Mthode jspInit()
Appele une seule fois lors du chargement de
la page JSP.
Mthode jspDestroy()
Appele une seule fois lors du dchargement.
Exemple avec
jspInit() et jspDestroy()
<jsp:directive.page import="java.util.*, java.text.*" />
<jsp:declaration>
private static DateFormat formateur;
private static String loadTime;
private static String getLoadTime() { return loadTime; }
private static String getCurrentTime() { return toGMTString(new Date()); }
private static String toGMTString(Date date)
{
return formateur.format(date);
}
public void jspInit()
{
formateur = new SimpleDateFormat("d MMM yyyy HH:mm:ss 'GMT'", Locale.US);
formateur.setTimeZone(TimeZone.getTimeZone("GMT"));
loadTime = toGMTString(new Date());
}
public void jspDestroy() { formateur = null; }
</jsp:declaration>

<HTML>
<HEAD><TITLE>Bonjour Le Monde</TITLE></HEAD>
<BODY>
Bonjour Le Monde.<BR>
Cette page a t charge en mmoire <%= getLoadTime() %>.<BR>
La date est <%= getCurrentTime() %>
</BODY>
</HTML>

Objets implicites
Objets implicites
Il y a un certain nombre d'objets
prdfinis par l'architecture JSP.
Ils permettent l'accs l'environnement
d'excution.
Ils font partie de l'API servlet
Les expressions et scriplets y ont accs.
Tableau des objets implicites
Objet Classe
out javax.servlet.jsp.JspWriter
request javax.servlet.ServletRequest
response javax.servlet.ServletResponse
session javax.servlet.http.HttpSession
pageContext javax.servlet.jsp.PageContext
config javax.servlet.ServletConfig
page java.lang.Object
application javax.servlet.ServletContext
exception java.lang.Throwable
Les objets implicites (1)
L'objet out
JspWriter mule java.io.PrintWriter.
JspWriter supporte java.io.BufferedWriter.
Exception par java.io.IOException.
L'objet request
Permet de rcuprer des dtails sur la requte et
le client.
Mthode request.getParameter().
Les objets implicites (2)
L'objet response
Permet l'accs au flux de sortie.
Il permet de positionner les enttes (header)
Cookies, content type, cache control, refresh,
redirection, ...
L'objet session
Permet de grer une session avec le client.
Les objets implicites (3)
L'objet pageContext
Permet l'accs l'environnement JSP et aux
beans.
Permet de dterminer l'acquisition de l'objet out.
Fournit l'interface pour include et forward.
L'objet config
Permet l'accs au ServletContext.
Les objets implicites (4)
L'objet page
Reprsente la page courante excutant la
requte.
Les mthodes de l'interface sont :
void jspInit(); // allows user action when initialized
void jspDestroy(); // allows user action when destroyed
public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException;

Note : la mthode _jspService() est gnre alors que les deux autres mthodes
peuvent tre dclares.
Les objets implicites (5)
L'objet application
Instance de ServletContext.
Permet d'obtenir le RequestDispatcher.
L'objet exception
Prsent uniquement dans une page d'erreur.
Expressions
Les expressions
Sont des instructions java dont le rsultat est
une valeur.
values lors de l'excution.
Converties en String.
crites dans le flux de sortie (HTML, XML).
Syntaxe
<%= instruction java %>
<jsp:expression>instruction java </jsp:expression>
Scriptlets
Les scriptlets
Sont des instructions java.
Implmentation de la logique applicative
Contrles algorithmiques
Alternatives, itrations.
Syntaxe
<% instruction java %>
<jsp:scriptlet> instruction java </jsp:scriptlet>
Exemple de page JSP avec
scriptlets
<jsp:scriptlet>
String userAgent = (String) request.getHeader("user-agent");
</jsp:scriptlet>
<HTML>
<HEAD><TITLE>JSP Scriptlet Exemple</TITLE></HEAD>
<BODY>
<jsp:scriptlet>
if (userAgent.indexOf("MSIE") != -1)
{
</jsp:scriptlet>
<p>Vous utilisez Internet Microsoft Explorer.</p>
<jsp:scriptlet>
}
else
{
</jsp:scriptlet>
<p>Vous n'utilisez pas Internet Microsoft Explorer. Vous utilisez <%= userAgent %></p>
<jsp:scriptlet>
}
</jsp:scriptlet>
</BODY>
</HTML>
Dfaut des scriptlets
Couplage fort entre le code java et le
code HTML.
Non respect du patron MVC
Sparation de la logique applicative de la
logique de prsentation.
Remplacer les scriptlets par des
custom tag .
Car beaucoup de concepteurs graphique
web ne sont pas des programmeurs.
Actions
Les actions
Plus haut niveau de fonctionnalit que :
Dclarations, expressions et scriptlets.
Indpendantes de tout langage script.
Syntaxe
Que la syntaxe XML : <jsp:
Catgories d'action
Trois catgories d'actions standards
Pour utiliser les composants JavaBean.
Pour contrler le forwarding/including.
Pour prparer HTML pour les plug-in java.
Extensible par les taglib
Page JSP et JavaBeans
Intgration des JavaBeans et de HTML.
Action Fonctionnalit
<jsp:useBean> Prparation du bean
<jsp:setProperty> Valorisation des proprits du bean (cast implicite)
<jsp:getProperty> Rcupration des valeurs du bean sous forme de String
JavaBean
Une classe java
Peut implmenter Serializable.
Encapsule un tat.
Propose une interface avec :
Des mthodes d'accs get et set.
Mthodes Type getDonneMembre().
Mthodes void setDonneMembre().
<jsp:useBean
Si le bean n'est pas trouv alors il est
instanci.
L'attribut scope indique la porte du bean.
Portes : page, request, session, application.
Syntaxe
<jsp:useBean id=''nom'' scope=''porte'' spcification />
<jsp:useBean id=''nom'' scope=''porte'' spcification
> corps
</jsp:useBean>
Porte du bean
Scope Cycle de vie
Page La page, la requte
Request La page courante(scope page) et les pages ''forwardes''
Session Session
Application Commun toutes les sessions
Spcifications
Spcification: class='' ''
Classe du bean.
Spcification: class='' '' et type='' ''
Type et classe du bean.
Spcification: type='''' et beanName='' ''
Le type utiliser dans la page.
Nom d'un bean existant.
Spcification: type=''''
Le type utiliser dans la page.
<jsp:setProperty
Valorise les donnes membres du bean.
Syntaxe
<jsp:setProperty name=''nom '' expression
/>
Exemple :
<jsp:useBean id = "leBean" ... />

...

<jsp:setProperty name = "leBean" ... />
Expressions de setProperty (1)
Expression : property=''*''
Tous les membres donnes du bean sont
valoriss par les ''request parameter''.
Expression : property=''nom''
Valorise uniquement le membre donne.
Expressions de setProperty (2)
Expression :
property=''nom''
param=''nom''
Valorise le membre donne par la valeur
issue du paramtre.
Expression :
property=''nom''
value=''valeur''
Valorise le membre donne par la valeur.
La valeur peut tre une expression JSP.
<jsp:getProperty
Rcupration des valeurs des donnes
membres du bean.
Syntaxe
<jsp:getProperty name=''nom'' property=''nom''
La valeur est convertie en String.
Mme comportement que pour une expression.
(<%=nomBean.getProperty() %>
Exemple de JSP avec bean (1)
<HTML>
<jsp:declaration>
// Classe locale de bean
static public class BeanLocal
{
private String valeur;
public String getValeur() { return valeur;}
public void setValeur(String s) { valeur = s; }
}
</jsp:declaration>

<jsp:useBean id="BeanLocal" scope="page" class="BeanLocal" >

<%-- A chaque fois que le bean est cr il est initialis par ''coucou'' --%>
<jsp:setProperty name="BeanLocal" property="valeur" value="coucou" />
</jsp:useBean>

<jsp:setProperty name="BeanLocal" property="*" />
Exemple de JSP avec bean (2)
<HEAD><TITLE>Bonjour Le Monde</TITLE></HEAD>
<BODY>
<CENTER>
<P><H1>Hello
<jsp:getProperty name=''BeanLocal'' property=''valeur''/></H1></P>
<FORM method=post>
Entrer un nom:
<INPUT TYPE="text" SIZE="32" NAME="valeur"
VALUE="<jsp:getProperty name=''BeanLocal'' property=''valeur''/>">
<BR>
<INPUT TYPE="submit" VALUE="Submit">
</FORM>
</CENTER>
</BODY>
</HTML>
Les autres actions
Action jsp:include
Insertion de la ressource dans le contenu de
la page en include.
Action jsp:forward
Insertion de la ressource dans le contenu de
la page en forward.
Action jsp:param
Passage d'un paramtre la ressource.
<jsp:include
Insertion d'une autre ressource dans le flux
de sortie.
Statique : HTML
Dynamique : page JSP, servlet, script CGI
Syntaxe
<jsp:include page=''URLrelative'' flush=''true''/>
L'option flush est optionnelle
<jsp:forward
Transfert de la request vers une autre
ressource.
Le contenu de la ressource appele se
substitue celui de l'appelant.
Syntaxe
<jsp:forward page=''URLrelative'' />
<jsp:param
Fournit des paramtres la ressource
qui est incluse (include) ou appele
(forward).
Syntaxe
<jsp:param name=''nom'' value=''valeur'' />
Exemple de page JSP
<HTML>
<jsp:include page="head.jsp" flush="true">
<jsp:param name="html-title" value="JSP Include Action" />
</jsp:include>
<BODY>
</BODY>
</HTML>


head.jsp

<HEAD>
<TITLE>
<%=(request.getParameter("html-title") != null) ?
request.getParameter("html-title") : "UNTITLED"%>
</TITLE>

<META HTTP-EQUIV="Copyright" NAME="copyright" CONTENT="Copyright (C) 2001
Noel J. Bergman/DEVTECH All Rights Reserved." >
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
</HEAD>

<jsp:plugin
Permet la mise jour de la JVM
supporte par le navigateur du client.
Syntaxe
<jsp:plugin type=''bean | applet'' code='' ''
codebase=''URL''....
</jsp:plugin>
Langage EL

Bibliographie
Livres
Professional JSP diteur : Wrox Press - Auteur : Wrox Author
Team
JSP Professionnel diteur : Eyrolles - Auteurs : K. Avedal, D.
Ayers
Java Servlet and JSP Cookbook diteur : O'Reilly Auteur
Bruce W. Perry
Sites Web
http://java.sun.com/products/jsp
http://jakarta.apache.org

Vous aimerez peut-être aussi