SlideShare une entreprise Scribd logo
1  sur  15
Télécharger pour lire hors ligne
<18/01/2010>
info@lorrainejug.org | http://blog.lorrainejug.org 1
Tapestry 5
Loïc Gangloff
loic.gangloff@atosorigin.com
<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
<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
 …
<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
<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
<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>
<18/01/01> info@lorrainejug.org | http://blog.lorrainejug.org 7
Templates
 Créer des layouts
 <t:body/>
 t:type sur balise html
<html
xmlns:t="http://tapestry.apache.org/schem
a/tapestry_5_0_0.xsd">
<head>
<title>LorraineJUG: Vidéothèque
avec Tapestry !</title>
</head>
<body>
<div id="banner"></div>
<div id="body">
<t:body/>
</div>
<div id="footer"></div>
</body>
</html>
<html t:type="layout"
xmlns:t="http://tapestry.apache.org/schema/tap
estry_5_0_0.xsd">
<h1>Index</h1>
</html>
<html t:type="layout"
xmlns:t="http://tapestry.apache.org/schema/tap
estry_5_0_0.xsd">
<h1>Edition d'un film</h1>
</html>
<html t:type="layout"
xmlns:t="http://tapestry.apache.org/schema/tap
estry_5_0_0.xsd">
<h1>Ajout d'un film</h1>
</html>
Index.tml
EditMovie.tml
CreateMovie.tml
Layout.tml
<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
<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
<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
<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
<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){…}
<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
<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
<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 !

Contenu connexe

Tendances

présentation Faille include
présentation Faille include présentation Faille include
présentation Faille include sahar dridi
 
MIC QRS "JWT, la superstar pour sécuriser vos WebAPI"
MIC QRS "JWT, la superstar pour sécuriser vos WebAPI"MIC QRS "JWT, la superstar pour sécuriser vos WebAPI"
MIC QRS "JWT, la superstar pour sécuriser vos WebAPI"Denis Voituron
 
Introduction à CakePHP
Introduction à CakePHPIntroduction à CakePHP
Introduction à CakePHPPierre MARTIN
 
Cours javascript
Cours javascriptCours javascript
Cours javascriptkrymo
 
Tuto atelier securisation_site_web
Tuto atelier securisation_site_webTuto atelier securisation_site_web
Tuto atelier securisation_site_websahar dridi
 
Formation PHP avancé - Cake PHP
Formation PHP avancé - Cake PHPFormation PHP avancé - Cake PHP
Formation PHP avancé - Cake PHPkemenaran
 
Beautiful CSS : Structurer, documenter, maintenir
Beautiful CSS : Structurer, documenter, maintenirBeautiful CSS : Structurer, documenter, maintenir
Beautiful CSS : Structurer, documenter, maintenirYves Van Goethem
 
Cours php & Mysql - 5éme partie
Cours php & Mysql - 5éme partieCours php & Mysql - 5éme partie
Cours php & Mysql - 5éme partiekadzaki
 
Soutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonySoutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonyVincent Composieux
 
2014.12.11 - TECH CONF #3 - Présentation Node.js
2014.12.11 - TECH CONF #3 - Présentation Node.js2014.12.11 - TECH CONF #3 - Présentation Node.js
2014.12.11 - TECH CONF #3 - Présentation Node.jsTelecomValley
 
Les Z'ApéroTech Toulouse #2 - Présentation des nouveautés de JakartaEE 8
Les Z'ApéroTech Toulouse #2 - Présentation des nouveautés de JakartaEE 8Les Z'ApéroTech Toulouse #2 - Présentation des nouveautés de JakartaEE 8
Les Z'ApéroTech Toulouse #2 - Présentation des nouveautés de JakartaEE 8DocDoku
 
Web dev open door
Web dev   open doorWeb dev   open door
Web dev open doorLeTesteur
 
Les données transitoires (transients) vous veulent du bien
Les données transitoires (transients) vous veulent du bienLes données transitoires (transients) vous veulent du bien
Les données transitoires (transients) vous veulent du bienBoiteaweb
 
HTML5... La révolution maintenant!
HTML5... La révolution maintenant!HTML5... La révolution maintenant!
HTML5... La révolution maintenant!CARA_Lyon
 

Tendances (18)

Introduction à ajax
Introduction à ajaxIntroduction à ajax
Introduction à ajax
 
Tutoriel ajax jquery
Tutoriel ajax jqueryTutoriel ajax jquery
Tutoriel ajax jquery
 
présentation Faille include
présentation Faille include présentation Faille include
présentation Faille include
 
MIC QRS "JWT, la superstar pour sécuriser vos WebAPI"
MIC QRS "JWT, la superstar pour sécuriser vos WebAPI"MIC QRS "JWT, la superstar pour sécuriser vos WebAPI"
MIC QRS "JWT, la superstar pour sécuriser vos WebAPI"
 
Introduction à CakePHP
Introduction à CakePHPIntroduction à CakePHP
Introduction à CakePHP
 
Cours javascript
Cours javascriptCours javascript
Cours javascript
 
Tuto atelier securisation_site_web
Tuto atelier securisation_site_webTuto atelier securisation_site_web
Tuto atelier securisation_site_web
 
JQuery
JQueryJQuery
JQuery
 
Formation PHP avancé - Cake PHP
Formation PHP avancé - Cake PHPFormation PHP avancé - Cake PHP
Formation PHP avancé - Cake PHP
 
Beautiful CSS : Structurer, documenter, maintenir
Beautiful CSS : Structurer, documenter, maintenirBeautiful CSS : Structurer, documenter, maintenir
Beautiful CSS : Structurer, documenter, maintenir
 
Cours php & Mysql - 5éme partie
Cours php & Mysql - 5éme partieCours php & Mysql - 5éme partie
Cours php & Mysql - 5éme partie
 
Soutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonySoutenance Zend Framework vs Symfony
Soutenance Zend Framework vs Symfony
 
2014.12.11 - TECH CONF #3 - Présentation Node.js
2014.12.11 - TECH CONF #3 - Présentation Node.js2014.12.11 - TECH CONF #3 - Présentation Node.js
2014.12.11 - TECH CONF #3 - Présentation Node.js
 
Chiffrer et sécuriser MariaDB
Chiffrer et sécuriser MariaDBChiffrer et sécuriser MariaDB
Chiffrer et sécuriser MariaDB
 
Les Z'ApéroTech Toulouse #2 - Présentation des nouveautés de JakartaEE 8
Les Z'ApéroTech Toulouse #2 - Présentation des nouveautés de JakartaEE 8Les Z'ApéroTech Toulouse #2 - Présentation des nouveautés de JakartaEE 8
Les Z'ApéroTech Toulouse #2 - Présentation des nouveautés de JakartaEE 8
 
Web dev open door
Web dev   open doorWeb dev   open door
Web dev open door
 
Les données transitoires (transients) vous veulent du bien
Les données transitoires (transients) vous veulent du bienLes données transitoires (transients) vous veulent du bien
Les données transitoires (transients) vous veulent du bien
 
HTML5... La révolution maintenant!
HTML5... La révolution maintenant!HTML5... La révolution maintenant!
HTML5... La révolution maintenant!
 

En vedette

REST and some Python (or 'Python "sinners" must REST')
REST and some Python (or 'Python "sinners" must REST')REST and some Python (or 'Python "sinners" must REST')
REST and some Python (or 'Python "sinners" must REST')Sabin Buraga
 
NedGraphics Home Design Presentation
NedGraphics Home Design PresentationNedGraphics Home Design Presentation
NedGraphics Home Design PresentationDamir Gilyazov
 
Intro of textile design
Intro of textile designIntro of textile design
Intro of textile designPragya Dixit
 
Jacquad shedding
Jacquad sheddingJacquad shedding
Jacquad sheddingNafiz Antu
 
Fabric structure-and-design, by n. gokarneshan
Fabric structure-and-design, by n. gokarneshanFabric structure-and-design, by n. gokarneshan
Fabric structure-and-design, by n. gokarneshansakthi damodaran
 
Project Jacquard By google
Project Jacquard By googleProject Jacquard By google
Project Jacquard By googleDeepak Singh
 
Step by step guide to Ladderback Jacquard
Step by step guide to Ladderback JacquardStep by step guide to Ladderback Jacquard
Step by step guide to Ladderback JacquardSelf-Employed
 
Fancy weaves
Fancy weavesFancy weaves
Fancy weavesmystyle4u
 
Model Template Presentation PowerPoint
Model Template Presentation PowerPointModel Template Presentation PowerPoint
Model Template Presentation PowerPointHoai Nam NGUYEN
 
Mẫu slide powerpoint đẹp cho thuyết trình-Download miễn phí
Mẫu slide powerpoint đẹp cho thuyết trình-Download miễn phíMẫu slide powerpoint đẹp cho thuyết trình-Download miễn phí
Mẫu slide powerpoint đẹp cho thuyết trình-Download miễn phíPowerPoint Đẹp
 
RxJs - Reactive Extensions for JavaScript
RxJs - Reactive Extensions for JavaScriptRxJs - Reactive Extensions for JavaScript
RxJs - Reactive Extensions for JavaScriptLeTesteur
 

En vedette (14)

Tapestry
TapestryTapestry
Tapestry
 
textile design book
textile design booktextile design book
textile design book
 
REST and some Python (or 'Python "sinners" must REST')
REST and some Python (or 'Python "sinners" must REST')REST and some Python (or 'Python "sinners" must REST')
REST and some Python (or 'Python "sinners" must REST')
 
ReactiveX
ReactiveXReactiveX
ReactiveX
 
NedGraphics Home Design Presentation
NedGraphics Home Design PresentationNedGraphics Home Design Presentation
NedGraphics Home Design Presentation
 
Intro of textile design
Intro of textile designIntro of textile design
Intro of textile design
 
Jacquad shedding
Jacquad sheddingJacquad shedding
Jacquad shedding
 
Fabric structure-and-design, by n. gokarneshan
Fabric structure-and-design, by n. gokarneshanFabric structure-and-design, by n. gokarneshan
Fabric structure-and-design, by n. gokarneshan
 
Project Jacquard By google
Project Jacquard By googleProject Jacquard By google
Project Jacquard By google
 
Step by step guide to Ladderback Jacquard
Step by step guide to Ladderback JacquardStep by step guide to Ladderback Jacquard
Step by step guide to Ladderback Jacquard
 
Fancy weaves
Fancy weavesFancy weaves
Fancy weaves
 
Model Template Presentation PowerPoint
Model Template Presentation PowerPointModel Template Presentation PowerPoint
Model Template Presentation PowerPoint
 
Mẫu slide powerpoint đẹp cho thuyết trình-Download miễn phí
Mẫu slide powerpoint đẹp cho thuyết trình-Download miễn phíMẫu slide powerpoint đẹp cho thuyết trình-Download miễn phí
Mẫu slide powerpoint đẹp cho thuyết trình-Download miễn phí
 
RxJs - Reactive Extensions for JavaScript
RxJs - Reactive Extensions for JavaScriptRxJs - Reactive Extensions for JavaScript
RxJs - Reactive Extensions for JavaScript
 

Similaire à Tapestry

Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantSymfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantHugo Hamon
 
BordeauxJUG : Portails &amp; Portlets Java
BordeauxJUG : Portails &amp; Portlets JavaBordeauxJUG : Portails &amp; Portlets Java
BordeauxJUG : Portails &amp; Portlets JavaCamblor Frédéric
 
Présentation complète de l'HTML5
Présentation complète de l'HTML5Présentation complète de l'HTML5
Présentation complète de l'HTML5jverrecchia
 
HTML5... La révolution maintenant!
HTML5... La révolution maintenant!HTML5... La révolution maintenant!
HTML5... La révolution maintenant!CARA_Lyon
 
Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)Martin Latrille
 
La mobilité dans Drupal
La mobilité dans DrupalLa mobilité dans Drupal
La mobilité dans DrupalAdyax
 
1-Introduction JQuery.pptx
1-Introduction JQuery.pptx1-Introduction JQuery.pptx
1-Introduction JQuery.pptxlaabid1
 
Atelier autour de UWA à ParisWeb 2007
Atelier autour de UWA à ParisWeb 2007Atelier autour de UWA à ParisWeb 2007
Atelier autour de UWA à ParisWeb 2007Netvibes
 
GWT : under the hood
GWT : under the hoodGWT : under the hood
GWT : under the hoodsvuillet
 
Meetup python-bottle-telosys-2018-lgu-v1.0
Meetup python-bottle-telosys-2018-lgu-v1.0Meetup python-bottle-telosys-2018-lgu-v1.0
Meetup python-bottle-telosys-2018-lgu-v1.0Laurent Guérin
 
cours-introduction-dfggghhha-html-5.pptx
cours-introduction-dfggghhha-html-5.pptxcours-introduction-dfggghhha-html-5.pptx
cours-introduction-dfggghhha-html-5.pptxradjadjouambi1
 

Similaire à Tapestry (20)

Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantSymfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
 
react-fr.pdf
react-fr.pdfreact-fr.pdf
react-fr.pdf
 
Rapport tp3 j2ee
Rapport tp3 j2eeRapport tp3 j2ee
Rapport tp3 j2ee
 
BordeauxJUG : Portails &amp; Portlets Java
BordeauxJUG : Portails &amp; Portlets JavaBordeauxJUG : Portails &amp; Portlets Java
BordeauxJUG : Portails &amp; Portlets Java
 
iTunes Stats
iTunes StatsiTunes Stats
iTunes Stats
 
Spring MVC
Spring MVCSpring MVC
Spring MVC
 
Présentation complète de l'HTML5
Présentation complète de l'HTML5Présentation complète de l'HTML5
Présentation complète de l'HTML5
 
HTML5... La révolution maintenant!
HTML5... La révolution maintenant!HTML5... La révolution maintenant!
HTML5... La révolution maintenant!
 
Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)
 
La mobilité dans Drupal
La mobilité dans DrupalLa mobilité dans Drupal
La mobilité dans Drupal
 
1-Introduction JQuery.pptx
1-Introduction JQuery.pptx1-Introduction JQuery.pptx
1-Introduction JQuery.pptx
 
Support de Cours JSF2 Première partie Intégration avec Spring
Support de Cours JSF2 Première partie Intégration avec SpringSupport de Cours JSF2 Première partie Intégration avec Spring
Support de Cours JSF2 Première partie Intégration avec Spring
 
Wicket - JUG Lausanne
Wicket - JUG LausanneWicket - JUG Lausanne
Wicket - JUG Lausanne
 
Atelier autour de UWA à ParisWeb 2007
Atelier autour de UWA à ParisWeb 2007Atelier autour de UWA à ParisWeb 2007
Atelier autour de UWA à ParisWeb 2007
 
Crs javascript
Crs javascriptCrs javascript
Crs javascript
 
Jboss Seam
Jboss SeamJboss Seam
Jboss Seam
 
Marzouk jsp
Marzouk jspMarzouk jsp
Marzouk jsp
 
GWT : under the hood
GWT : under the hoodGWT : under the hood
GWT : under the hood
 
Meetup python-bottle-telosys-2018-lgu-v1.0
Meetup python-bottle-telosys-2018-lgu-v1.0Meetup python-bottle-telosys-2018-lgu-v1.0
Meetup python-bottle-telosys-2018-lgu-v1.0
 
cours-introduction-dfggghhha-html-5.pptx
cours-introduction-dfggghhha-html-5.pptxcours-introduction-dfggghhha-html-5.pptx
cours-introduction-dfggghhha-html-5.pptx
 

Plus de Lorraine JUG

Milou fait un régime Guava Lombok
Milou fait un régime Guava LombokMilou fait un régime Guava Lombok
Milou fait un régime Guava LombokLorraine JUG
 
De Runnable & synchronized à parallele() et atomically()
De Runnable & synchronized à parallele() et atomically()De Runnable & synchronized à parallele() et atomically()
De Runnable & synchronized à parallele() et atomically()Lorraine JUG
 
Java Message Services
Java Message ServicesJava Message Services
Java Message ServicesLorraine JUG
 
Bonita Open Solution why, what, how?
Bonita Open Solution why, what, how?Bonita Open Solution why, what, how?
Bonita Open Solution why, what, how?Lorraine JUG
 
Stack Technologique Google
Stack Technologique GoogleStack Technologique Google
Stack Technologique GoogleLorraine JUG
 
The Java EE 6 platform
The Java EE 6 platformThe Java EE 6 platform
The Java EE 6 platformLorraine JUG
 
Comment concilier Agilité et projet au forfait ?
Comment concilier Agilité et projet au forfait ?Comment concilier Agilité et projet au forfait ?
Comment concilier Agilité et projet au forfait ?Lorraine JUG
 
Scrum, iceScrum et Rock'n Roll
Scrum, iceScrum et Rock'n RollScrum, iceScrum et Rock'n Roll
Scrum, iceScrum et Rock'n RollLorraine JUG
 

Plus de Lorraine JUG (13)

Couchbase
CouchbaseCouchbase
Couchbase
 
Milou fait un régime Guava Lombok
Milou fait un régime Guava LombokMilou fait un régime Guava Lombok
Milou fait un régime Guava Lombok
 
De Runnable & synchronized à parallele() et atomically()
De Runnable & synchronized à parallele() et atomically()De Runnable & synchronized à parallele() et atomically()
De Runnable & synchronized à parallele() et atomically()
 
NIO 2
NIO 2NIO 2
NIO 2
 
Java SE 7
Java SE 7Java SE 7
Java SE 7
 
Java Message Services
Java Message ServicesJava Message Services
Java Message Services
 
Bonita Open Solution why, what, how?
Bonita Open Solution why, what, how?Bonita Open Solution why, what, how?
Bonita Open Solution why, what, how?
 
Stack Technologique Google
Stack Technologique GoogleStack Technologique Google
Stack Technologique Google
 
GWT
GWTGWT
GWT
 
The Java EE 6 platform
The Java EE 6 platformThe Java EE 6 platform
The Java EE 6 platform
 
Comment concilier Agilité et projet au forfait ?
Comment concilier Agilité et projet au forfait ?Comment concilier Agilité et projet au forfait ?
Comment concilier Agilité et projet au forfait ?
 
Fcitr public
Fcitr publicFcitr public
Fcitr public
 
Scrum, iceScrum et Rock'n Roll
Scrum, iceScrum et Rock'n RollScrum, iceScrum et Rock'n Roll
Scrum, iceScrum et Rock'n Roll
 

Tapestry

  • 1. <18/01/2010> info@lorrainejug.org | http://blog.lorrainejug.org 1 Tapestry 5 Loïc Gangloff loic.gangloff@atosorigin.com
  • 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>
  • 7. <18/01/01> info@lorrainejug.org | http://blog.lorrainejug.org 7 Templates  Créer des layouts  <t:body/>  t:type sur balise html <html xmlns:t="http://tapestry.apache.org/schem a/tapestry_5_0_0.xsd"> <head> <title>LorraineJUG: Vidéothèque avec Tapestry !</title> </head> <body> <div id="banner"></div> <div id="body"> <t:body/> </div> <div id="footer"></div> </body> </html> <html t:type="layout" xmlns:t="http://tapestry.apache.org/schema/tap estry_5_0_0.xsd"> <h1>Index</h1> </html> <html t:type="layout" xmlns:t="http://tapestry.apache.org/schema/tap estry_5_0_0.xsd"> <h1>Edition d'un film</h1> </html> <html t:type="layout" xmlns:t="http://tapestry.apache.org/schema/tap estry_5_0_0.xsd"> <h1>Ajout d'un film</h1> </html> Index.tml EditMovie.tml CreateMovie.tml Layout.tml
  • 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 !