2. <18/01/01> info@lorrainejug.org | http://blog.lorrainejug.org 2
Plan
Qu’est ce que Tapestry ?
Architecture d’un projet Tapestry
Pages et composants
Tapestry Markup Language (Templates)
Les composants de base
Les annotations
Les évènements
Internationalisation
3. <18/01/01> info@lorrainejug.org | http://blog.lorrainejug.org 3
Tapestry ?
Qu’est ce que c’est ?
Framework web reposant sur les servlets
Fonctionne sur n’importe quel conteneur de servlets
Encore un autre framework web ?
Véritablement orienté objet
Pattern Convention over Configuration
Orienté composants
Rechargement à chaud
…
4. <18/01/01> info@lorrainejug.org | http://blog.lorrainejug.org 4
Architecture
Maven, bien évidemment…
mvn archetype:create
-DarchetypeGroupId=org.apache.tapestry
-DarchetypeArtifactId=quickstart
-DgroupId=org.apache.tapestry
-DartifactId=lorrainejug
-DpackageName=org.lorrainejug.tapestry5
Classe Java Template (x)html
Package des pages: org.lorrainejug.tapestry5.pages
Convention de nommage: Nom identique des templates et des classes
5. <18/01/01> info@lorrainejug.org | http://blog.lorrainejug.org 5
Pages et composants
Une page web est une classe Java
org.lorrainejug.tapestry5.pages.Index -> Page « Index »
org.lorrainejug.tapestry5.pages.movie.EditMovie -> Page « movie/edit » « movie/EditMovie »
Insensible à la casse (Index=index=inDeX)
Chaque page est associée à un template
Le template contient les composants utilisés par la page
Chaque composant
Un type identifiant la classe Java à instancier
Un identifiant unique, pouvant être assigné automatiquement par Tapestry
Pages != Servlets
Pas de singleton
Pool de pages géré par Tapestry
Les pages et composants sont de simple classe Java
Pas d’interface à implémenter, pas de classe à hériter
Un composant peut dériver d’un autre composant
6. <18/01/01> info@lorrainejug.org | http://blog.lorrainejug.org 6
Templates
Template au format XML
Extension .tml
Même nom que la classe (sensible à la casse)
À placer dans src/main/resources ou src/main/webapp
Namespace
http://tapestry.apache.org/schema/tapestry_5_0_0.xsd
Généralement, préfixe « t »
<html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd">
</html>
Expansion
Permet de « lire » une propriété de la page ou d’un bean
Format: ${proprieteDeMaPage} (insensible à la casse)
<p>${message:hello}, ${user.name}</p>
Ajout de composants
<t:textfield value="user.name"/>
<t:pagelink page="user/edit">Modifier</t:pagelink>
8. <18/01/01> info@lorrainejug.org | http://blog.lorrainejug.org 8
Composants inclus
Liens Description
ActionLink Déclenche un évènement « Action » sur le composant
EventLink Déclenche un évènement
PageLink Lien vers une autre page
Composant de
contrôle
Description
If Affiche son contenu si la condition est respectée
Loop Affiche son contenu en bouclant sur une « collection »
Output Affiche une donnée au format définit dans un Formatter
9. <18/01/01> info@lorrainejug.org | http://blog.lorrainejug.org 9
Composants inclus
Formulaire Description
Checkbox Case à cocher
DateField Champ de saisie d’une date avec calendrier
TextField Champ de saisie simple
PasswordField Champ de saisie de type password
TextArea Champ de saisie multi-ligne
Select Liste déroulante
Radio Bouton « radio »
Label Libellé associé à un champ formulaire
Form Conteneur des champs du formulaire
Submit Bouton permettant de soumettre un formulaire
LinkSubmit Lien javascript permettant de soumettre un formulaire
Errors Affiche les erreurs de validation du formulaire
10. <18/01/01> info@lorrainejug.org | http://blog.lorrainejug.org 10
Composants inclus
Composant
avancé
Description
BeanDisplay Affiche toutes les propriétés d’un JavaBean
BeanEditor Crée une interface permettant d’éditer les propriétés d’un
JavaBean
BeanEditorForm Associe un BeanEditor avec un composant Form
Grid Tableau affichant une collection de JavaBean, avec tri et
pagination
11. <18/01/01> info@lorrainejug.org | http://blog.lorrainejug.org 11
Les annotations
Attribut Description
@InjectPage Injecte une page dans un composant
@Persist Permet de sauvegarder des valeurs entre différentes
requêtes (stocker en session)
@Property Tapestry génèrera les getters et setters associés
Classe Description
@IncludeJavaScriptLibrary Ajouter un ou plusieurs script au composant
@IncludeStylesheet Ajouter un ou plusieurs css au composant
Méthode Description
@Log Tapestry loguera le début et la fin de la méthode
@OnEvent Définir une méthode pour qu’elle intercepte un évènement
@CommitAfter « Commiter » la transaction Hibernate après l’exécution de la
méthode
12. <18/01/01> info@lorrainejug.org | http://blog.lorrainejug.org 12
Les évènements
Convention de nommage
Nom de méthode: onEventNameFromComponentId
Annotation @OnEvent
@OnEvent(EventConstants.SUCCESS)
void updateMovie(){}
@OnEvent(component="delete")
void deleteMovie(int id){}
Template Classe Java
<t:form t:id=“editForm">
<!-- Champs de saisies -->
<input t:type="submit"/>
</t:form>
Pas de t:id ? -> void onSuccess(){…}
Sinon -> void onSuccessFromEditForm(){…}
<t:actionlink t:id="delete"
t:context=“movie.id">
Supprimer
</t:actionlink>
void onActionFromDelete(int id){…}
13. <18/01/01> info@lorrainejug.org | http://blog.lorrainejug.org 13
Les évènements
Valeur de retour de la méthode
Permet de définir la navigation entre les pages
Type Description
void Réaffiche la page courante
String Nom de la page à afficher
Class Classe de la page à afficher
Object L’instance d’une page à afficher (@InjectPage)
StreamResponse Flux d’octets envoyé au client
URL Url externe
14. <18/01/01> info@lorrainejug.org | http://blog.lorrainejug.org 14
Internationalisation
Détermination de la langue en fonction du client
Ficher properties portant le même nom que le template
Préfixé éventuellement par la langue
Chaque composant peut avoir son propre catalogue de message
App.properties pour les messages de l’application
Expansion: ${message:nomdelacle}
<p>${message:hello}, ${user.name}</p>
Récupérer le catalogue de message dans la page: @Inject
15. <18/01/01> info@lorrainejug.org | http://blog.lorrainejug.org 15
Exemple
Mini Vidéothèque
Couplé à Hibernate (hsqldb)
Utilisation des composants de haut niveau
Rechargement à chaud
Internationalisation
Et ça fonctionne !