project:omega - o'reillynet-fr - jsp-servlets - fonctions avancées des librairies jsp de balises personnalisées
project:omega - o'reillynet-fr - jsp-servlets - fonctions avancées des librairies jsp de balises personnalisées
livres et documentations
outils
téléchargements d'outils unix
programmation cocoa
serveurs web
le terminal de mac os x
le langage java
carbon
nouvelles mac dev
objective-c
iapplications
le langage jsp et les servlets java
technologie sans-fil
le scripting
système unix
mozilla
développer sur mac os x
perl-ruby-python
intégration mac os x - windows
développement web
maîtrise de mac os x
guides techniques
développement
développement web
le langage ruby
portage d'applications vers mac os x
webobjects
meilleures astuces
sélections logiciel de la semaine
conchyo
firestarter - gravure et copie de cd
reveil
documentation
o'reillynet-fr
tutoriels
macosxhints-fr
produits
forums
liens
qui sommes-nous ?
contribuer et participer
soutenir l'association
recevoir la news letter
les statuts de l'association
note : 2.250
expert
(444 ko)
5621
1 - 2
dans la même série
sommaire
conseils pratiques pour servlet, partie 3
conseils pratiques pour servlet, partie 2
conseils pratiques pour servlet, partie 1
apprentissage de struts jakarta - partie 3
apprentissage de struts jakarta - partie 2
introduction à struts jakarta
tour d’horizon des jsp - partie 1
les librairies jsp de balises personnalisées
fonctions avancées des librairies jsp de balises personnalisées
les derniers articles parus
o'reillynet-fr-système unix
ssh en détails, partie 2
o'reillynet-fr-maîtrise de mac os x
qu'est ce que le firewire ? (et comment en tirer profit)
tutoriels-développement
vue d'ensemble de l'accessibilité
o'reillynet-fr-maîtrise de mac os x
mac os x pour le voyageur, partie 5
o'reillynet-fr-maîtrise de mac os x
mac os x pour le voyageur, partie 4
tous les articles parus
les dernières astuces osxfaq
semaine 106 - nouveautés de tiger
06/01/2006 - vendredi - bien propre avec tidy
05/01/2006 - jeudi - encore plus de commandes
04/01/2006 - mercredi - syntaxe colorée dans nano
03/01/2006 - mardi - pico devient nano
02/01/2006 - lundi - de zcat à gzcat
toutes les astuces parues
nos articles « coup de coeur »
portage d'applications vers mac os x-portage d'applications basées sur l'api win32 vers mac os x
portage d'applications vers mac os x-guide de portage unix
webobjects-qu'est-ce que webobjects ?
développement-les outils de développement de mac os x
développement-apprendre l'objective-c
livres recommandés
servlets et jsp
java in a nutshell - o'reilly
introduction à java - o'reilly
exemples en java in a nutshell, 2e édition - o'reilly
thinking in java
total java
mac os x à 200%
project:omega soutient mozilla !
project:omega soutient openoffice !
1 - 2
project:omega >>> o'reillynet-fr >> le langage jsp et les servlets java > fonctions avancées des librairies jsp de balises personnalisées
fonctions avancées des librairies jsp de balises personnalisées
par sue
spielman, 18/01/2001
traduit par thierry, 20/08/2002
dans cet article, le second de la série se rapportant
aux librairies de balises personnalisées, nous allons découvrir
des fonctions avancées et les moyens de s'en servir. si vous n'êtes
pas très à l'aise avec les librairies de balises, passez quelques
minutes à lire l'article précédent, if you aren't familiar
with tag libraries, spend a few minutes reading the previous article, concevoir des librairies
de balises personnalisées.
dans cet article vous allez découvrir :
les interactions entre les containers jsp et les balises,
les balises dotées de corps,
les balises imbriquées,
les informations extra-balise, et
les balises coopératives.
toutes les classes et les interfaces discutés ici proviennent
du package javax.servlet.jsp ou javax.servlet.jsp.tagext.
les interactions du container jsp avec les balises
si l'on veut se servir des fonctionnalités avancées
des librairies de balises il est important d'avoir une compréhension
basique de la manière dont le container jsp interagit avec les classes
gestionnaires de balises. nous allons d'abord aborder ceci avant de passer à
l'utilisation de ces fonctionnalités avancées.
l'interface balise
l'interface balise (tag interface) définit
le protocole basique utilisé entre un gestionnaire de balises et un container
jsp. il définit le cycle de vie et les méthodes à invoquer
au moment où les balises "start" et "end" d'une action
sont rencontrées.
le container jsp invoque les méthodes setpagecontext,
setparent, et celle de réglage des attributs
avant d'appeler dostarttag. le container garantit
aussi qu'une destruction sera effectuée dans le gestionnaire de balises
avant la fin de la page. une séquence typique d'appel de méthode
de gestionnaire de balises pourrait ressembler à ceci :
sometag tag = new sometag();
tag.setpagecontext(...);
tag.setparent(...);
tag.setattribute1(value1);
tag.setattribute2(value2);
tag.dostarttag();
tag.doendtag();
tag.release();
la méthode "release" du gestionnaire de balises
devrait réinitialiser son état et détruire toute ressource
privée qu'il aurait pu utiliser. en temps normal, il n'est pas nécessaire
de surpasser ("override") l'implémentation de base
de la classe.
l'interface corps de balise
si une balise tire son origine d'un bodytagsupport,
il y a des méthodes supplémentaires -- setbodycontent,
doinitbody, et doafterbody
-- contenues dans l'interface corps de balise (bodytag interface).
ces méthodes permettent à un gestionnaire de balise d'accéder
à son corps. le corps d'une balise est tout ce qui est contenu entre
le début et la fin d'une balise.
l'objet bodycontent est une sousclasse
de jspwriter, qui représente la classe chargée
de l'écriture utilisée en interne pour les variables jsp. l'objet
bodycontent est disponible via la variable bodycontent
dans doinitbody, doafterbody,
et doendtag. cet objet est essentiel parce qu'il contient
des méthodes que vous utiliser pour écrire, lire, effacer et acquérir
du contenu et l'incorporer dans le jspwriter original
durant le doendtag. nous verrons cela plus tard quand
nous explorerons un bout de code.
le setbodycontent crée un
contenu de corps et l'ajoute au gestionnaire de balises. le doinitbody
n'est appelé qu'une fois avant l'évaluation du corps de la balise,
il est habituellement utilisé pour effectuer les initialisations qui
dépendent du contenu du corps de la balise. si doafterbody
renvoie eval_body_tag, le corps entier de la balise
est de nouveau évalué. sinon, skip_body
est renvoyée pour indiquer que l'évaluation du corps de la balise
est terminée.
un gestionnaire typique de balises dérivé de
bodytagsupport comprendrait la séquence d'appel
de méthodes suivante, à partir du container jsp :
tag.dostarttag();
out = pagecontext.pushbody();
tag.setbodycontent(out);
// effectue les initialisations nécessitées après que le contenu du corps
// ait été évalué
tag.doinitbody();
tag.doafterbody();
// tant que doafterbody renvoie eval_body_tag nous recommençons
// l'évaluation du corps
...
tag.doafterbody();
tag.doendtag();
tag.pagecontext.popbody();
tag.release();
utilisation de balises à corps
l'utilisation de balise qui évalue un corps permet d'effectuer
des boucles. cela peut devenir une fonction puissante notamment pour traiter
des ensembles de données provenant d'une base de données ou d'autres
types de données sous forme de suite. au moment de définir une
balise qui utilise une corps, il y a deux étapes de base. premièrement,
la définition de la balise inscrite dans le fichier tld doit positionner
<bodycontent> à "jsp" ou dépendant
de la balise ("tagdependent"). "jsp" indique que
le corps est évalué par le container jsp et peut donc ensuite
être traité par la balise elle-même. tagdependent
indique que le corps n'est traité que par la balise. l'élément
du tld ressemble à :
<tag>
...
<bodycontent>jsp|tagdependent</bodycontent>
</tag>
deuxièmement, il faut dériver la balise de bodytagsupport.
bodytagsupport est la classe assistante de l'interface
bodytag, donc, techniquement, vous n'avez pas à implémenter n'importe
quelles méthodes puisqu'elles sont implémentées par défaut.
cependant, il se pourrait plutôt que vous soyer amené à
en surpasser une ou toute pour effectuer des traitements spécifiques
à votre balise.
la manière d'implémenter un gestionnaire de balises
pour une balise comprenant un corps dépend de la nécessité
d'interaction du gestionnaire avec le corps, où "interagir"
veut dire que le gestionnaire lit ou modifie les contenus du corps ou provoque
des évaluations répétées du corps. si le gestionnaire
interagit avec le corps, la valeur de retour skip_body
indique que le container jsp n'a pas à évaluer le code contenu
à l'intérieur du corps de la balise. la valeur eval_body_tag
n'est possible que si la classe est une extension de bodytagsupport.
si le gestionnaire n'a pas besoin d'interagir avec le corps, il doit alors implémenter
l'interface de balise (tag interface) ou être dérivé
de tagsupport. si le corps de la balise nécessite
d'être évalué, la méthode dostarttag
doit retourner eval_body_include; sinon elle doit
retourner skip_body. si le gestionnaire doit interagir
avec le corps, il doit alors implémenter l'interface de corps de balise
(bodytag interface) ou être dérivé de bodytagsupport.
habituellement, de tels gestionnaires implémentent les méthodes
doinitbody et doafterbody.
ces méthodes interagissent avec le contenu du corps passé au gestionnaire
de balise par le container jsp. la méthode dostarttag
doit retourner eval_body_tag; sinon elle doit renvoyer
skip_body. (ndt : ouf !)
voyons ensemble un exemple rapide qui illustre l'interaction
d'une balise avec un corps. cet exemple comprendra la définition de balise
inscrite dans le tld, le gestionnaire de balises et, finalement, la page jsp
qui appelle la balise. pour un exemple complet de fichier tld, consultez la
première partie de cette série d'articles (librairies
jsp de balises personnalisées).
la définition de cette balise dans le tld ressemble
à :
<tag>
<name>paramloop</name>
<tagclass>oreilly.examples.paramlooptag </tagclass>
<!-- autorise l'insertion d'un corps pour cette balise -->
<bodycontent>jsp</bodycontent>
<info>
this is a simple tag to demonstrate how to include
and evaluate the body of a tag
</info>
<!-- required attributes -->
<attribute>
<name>enum</name>
<required>true</required>
<rtexpvalue>true</rtexpvalue>
</attribute>
</tag>
le bout de code suivant est un gestionnaire de balises qui
affiche tous les paramètres de la requête dans une table et qui
interagit avec le corps :
import java.util.enumeration;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
import java.io.ioexception;
public class paramlooptag extend bodytagsupport{
enumeration enum=null;
public void setenum(enumeration enum){
this.enum = enum;
}
public int dostarttag() throws jspexception{
return eval_body_tag;
}
public void doinitbody() throws jspexception{
if (enum != null){
if (enum.hasmoreelements()){
pagecontext.setattribute("nextparamname",
enum.nextelement());
}
}
public void doafterbody() throws jspexception{
if (enum.hasmoreelements()){
pagecontext.setattribute("nextparamname",
enum.nextelement());
// on continue la boucle
return eval_body_tag;
} else {
// on a fini
return skip_body;
}
}
public int doendtag() throws jspexception{
try {
// obtient le bodycontent courant de cette balise et
// l'écrit via le jsp writer original
pagecontext.getout().print(bodycontent.getstring());
return eval_page;
}
catch (ioexception ioe){
throw new jspexception(ioe.getmessage());
}
}
}
le code jsp qui utilise cette balise ressemble à :
<html>
<body>
<%@ taglib uri="/oreillysample.tld" prefix="sample" %>
<h1>sample tag using body interaction</h1>
<table border="2">
<tr>
<th>parameter name</th>
<th>parameter value</th>
<sample:paramloop enum="<%=request.getparameternames() %>" >
<tr>
<%--
par simplicité, nous ne faisons aucun test d'erreur ici
et nous affichons la première valeur
--%>
<% string paramname =
(string)pagecontext.getattribute("nextparamname"); %>
<td> <%= paramname %> </td>
<% string[] paramvalues =
request.getparatmervalues(paramname); %>
<td><%= paramvalues[0] %>
</tr>
</sample:paramloop>
</table>
</body>
<html>
la table produite par l'exécution de cette balise en
supposant deux paramètres en entrée (personne et compagnie) ressemblerait
à :
nom du paramètre
valeur du paramètre
personnne
sue
compagnie
switchback software
project:omega : la référence pour les développeurs mac os x et plus encore !
documentation
|
o'reillynet-fr
|
tutoriels
|
macosxhints-fr
|
produits
|
forums
|
liens
copyright © 2001-2004 projectomega.org, association à but non lucratif. tous droits réservés.
toutes les marques déposées et tous les logos apparaissant sur projectomega.org sont la propriété de leurs sociétés respectives.
pour tout problème ou assistance à propos de ce site, contactez : webmaster@projectomega.org
pour tout autre propos : contact@projectomega.org
hosting : netsample.net | macgeneration.com | projectomega.com - design : projectomega.com
project:omega - o'reillynet-fr - jsp-servlets - fonctions avancées des librairies jsp de balises personnalisées Précédent 593 Précédent 592 Précédent 591 Précédent 590 Précédent 589 Précédent 588 Précédent 587 Précédent 586 Précédent 585 Précédent 584 Précédent 583 Précédent 582 Précédent 581 Précédent 580 Précédent 579 Précédent 578 Précédent 577 Précédent 576 Précédent 575 Précédent 574 Précédent 573 Précédent 572 Précédent 571 Précédent 570 Précédent 569 Précédent 568 Précédent 567 Précédent 566 Précédent 565 Précédent 564 Suivant 595 Suivant 596 Suivant 597 Suivant 598 Suivant 599 Suivant 600 Suivant 601 Suivant 602 Suivant 603 Suivant 604 Suivant 605 Suivant 606 Suivant 607 Suivant 608 Suivant 609 Suivant 610 Suivant 611 Suivant 612 Suivant 613 Suivant 614 Suivant 615 Suivant 616 Suivant 617 Suivant 618 Suivant 619 Suivant 620 Suivant 621 Suivant 622 Suivant 623 Suivant 624