Apache Wicket : Application Web simplement avec Java Nicolas Giard Présentation d’Apache Wicket – 14/04/2008
Agenda Qu’est ce que Wicket ? Concepts Fondamentaux Développer un Composant Personnalisé Q&R Présentation d’Apache Wicket – 14/04/2008
Wicket en bref Open Source (Apache Sofware Foundation) Orienté Composant Pure Java + Pure xHTML Simple Communauté enthousiaste Présentation d’Apache Wicket – 14/04/2008
Qu’est ce que Wicket La technologie : Orienté Composant, manipulation ‘Programmatique’ des balises La mission : Apporter le développement objet à la couche présentation d’une application Web La récompense : S’amuser dans son travail et être de nouveau bons amis avec son manager Présentation d’Apache Wicket – 14/04/2008
Les réponses de Wicket Faire simplement des choses simples. Utiliser un modèle de Composant Orienté Objet où les composants sont réellement autonomes. Réappliquer le pattern Modele-Vue-Controleur sur les composants plutôt que sur les requètes, avec les modèles comme point d’entrée. Avoir une séparation de contenu propre entre HTML et Java. Proposer une gestion d’état transparente et complètement automatisée. Réduire au minimum les besoins de configuration. Plus d’XML! Rendre la création et l’utilisation de composants personnalisés plus simple que n’importe quel autre framework. Présentation d’Apache Wicket – 14/04/2008
Composant vs ‘Traditionnel’ Struts, WebWork, Spring MVC, etc. Eprouvé sur le web Beaucoup de développeurs Web disponibles Composants JSF, Wicket, Tapestry, etc. Modèle traditionnel pour le développement d'UI sur les clients lourds Beaucoup de développeurs disponibles Présentation d’Apache Wicket – 14/04/2008
Caractéristiques Composition des Pages Panels, Borders et héritage de balise Support excellent de la localisation et des styles Chargement de template et de resource (_fr.html, .xml) Model localisé (e.g. pour les labels) Chargement sophistiqué des ressources (par composition & héritage) Détection automatique des possibilités du client Mécanisme de conversion Intégration Spring Guice Hibernate JasperReports OSGi Composants fantaisistes ‘triable’, ‘filtrable’, ‘paginable’, tableau orienté données date picker, editeur de texte, Google Maps Panneaux à Onglets, navigation, arbre, wizard Présentation d’Apache Wicket – 14/04/2008
Caractéristiques Gestion de l’état Support du clustering Sessions à type sûr Support du clustering Support du bouton ‘précédent’ Double stratégies de ‘submit’ render redirect / redirect to buffered response / none Support des Test Unitaires Tests basés sur JUnit Rapports d’erreur et gestion des logs étendus Support natif d’Ajax Ajax sans écrire de JavaScript, Dojo, Scriptaculous, ... Contribution à l’en-tête HTML Javascript & CSS ‘Mounting’ d’URL URL intelligible Sécurité au niveau du Composant Présentation d’Apache Wicket – 14/04/2008
Agenda Qu’est ce que Wicket ? Concepts Fondamentaux Développer un Composant Personnalisé Q&R Présentation d’Apache Wicket – 14/04/2008
Concepts de Wicket Application Session RequestCycle Composants Behaviors Models Présentation d’Apache Wicket – 14/04/2008
Application Point d’entrée principal de votre application web Configuration Afficher les tags spécifiques Wicket? Vérifier les changements dans le html tout les …? Définir la page d’accueil Factories pour Session RequestCycle Security … Configurée dans le web.xml : <filter> <filter-name>wicket</servlet-name> <filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class> <init-param> <param-name>applicationClassName</param-name> <param-value>example.MyApplication</param-value> </init-param> <load-on-startup>1</load-on-startup> </filter> Présentation d’Apache Wicket – 14/04/2008
Concepts de Wicket Application Session RequestCycle Composants Behaviors Models Présentation d’Apache Wicket – 14/04/2008
Session Abstraction d’une session utilisateur Typiquement stockée dans HttpSession Conserve les données spécifiques à la Session Locale, infos du Client (browser, vendor, version) Vos propres données? Utilisateur authentifié Contenu d’un panier pour un site de commerce Historique limité des pages pour le support du bouton Précédent Présentation d’Apache Wicket – 14/04/2008
Session public class MySession extends WebSession { private ShoppingCart cart; public ShoppingCart getCart() { … } public void setCart(ShoppingCart cart) { … } } … mysession.setCart(new ShoppingCart()); ShoppingCart cart = mysession.getCart(); cart.add(quantity, selectedProduct); Présentation d’Apache Wicket – 14/04/2008
Concepts de Wicket Application Session RequestCycle Composants Behaviors Models Présentation d’Apache Wicket – 14/04/2008
RequestCycle Etapes du “Request Cycle”: Création de l’objet request cycle Décodage de la requète Identification des ‘cibles’ de la requète (page, component, …) Exécution des événements (onClick, onSubmit, …) Réponse (page, component, image, pdf, …) Nettoyage Présentation d’Apache Wicket – 14/04/2008
RequestCycle Deux types de requètes: Stateful Stateless Liée à une session d'utilisateur spécifique Pas ‘bookmarkable’ Stateless Pas nécessairement liée à une session d’utilisateur spécifique ‘Bookmarkable’ Présentation d’Apache Wicket – 14/04/2008
Concepts de Wicket Application Session RequestCycle Composants Behaviors Models Présentation d’Apache Wicket – 14/04/2008
Composants Encapsule la manipulation des balises Peut recevoir des événements onClick, onSubmit Sait lui même comment et où il doit s’afficher Créer un Composant personnalisé est aussi simple que d’écrire ‘extends’ L’héritage de wicket.Component fait le reste Disponible dans le classpath de l’application Présentation d’Apache Wicket – 14/04/2008
Composants Classe mère Ultime : org.apache.wicket.Component Label MultiLineLabel TextField PasswordTextField Image Link Tree BookmarkablePageLink JasperReports ListView Loop PagingNavigator ImageMap Button Ajax… Sorting, Paging, Repeaters Wizard DatePicker Présentation d’Apache Wicket – 14/04/2008
Composants et balises Un composant est identifié dans le balisage par wicket:id Html: <h1 wicket:id=“msg”>Gets replaced</h1> Java: new Label(“msg”, “Hello, World!”); Final (les tags wicket peuvent être masqués du source html): <h1>Hello, World!</h1> Présentation d’Apache Wicket – 14/04/2008
Composants et balises Un composant peut avoir son propre fichier html: Page Panel Border Mettre les fichiers Java, HTML et ressources dans le même package Présentation d’Apache Wicket – 14/04/2008
Example : Hello, World! Présentation d’Apache Wicket – 14/04/2008
Concepts de Wicket Application Session RequestCycle Composants Behaviors Models Présentation d’Apache Wicket – 14/04/2008
Behaviors Les Behaviors sont des ‘plug-ins’ pour les Composants Ils peuvent modifier les balises HTML des Composants item.add(new AbstractBehavior() { public void onComponentTag(Component component, ComponentTag tag) { String css = (((Item)component).getIndex() % 2 == 0) ? "even" : "odd"; tag.put("class", css); } }); Output: <tr class=“odd”>…</tr> <tr class=“even”>…</tr> Présentation d’Apache Wicket – 14/04/2008
Behaviors Modifier les attributs des balises du Composant Ajouter des évenements javascript Ajouter un ‘comportement Ajax’ component.add(new AjaxSelfUpdatingBehavior(Duration.seconds(1))); Présentation d’Apache Wicket – 14/04/2008
Concepts de Wicket Application Session RequestCycle Composants Behaviors Models Présentation d’Apache Wicket – 14/04/2008
<<Personne>> Models Les Models associent vos POJO’s aux composants Wicket Label(“nom”, model) <<Personne>> +nom : String +ville : String PropertyModel Présentation d’Apache Wicket – 14/04/2008
Models Le binding en Java n’est pas aisé Ne fera pas d’update: new TextField(“txt”, personne.getNom()) Provoquera une NullPointerException: new Label(“rue”, personne.getAdresse().getRue()) Solution: les expressions type OGNL/EL PropertyModel: new PropertyModel(personne, “nom”) new PropertyModel(personne, “adresse.rue”) Prévenir le NullPointer à l’update: Personne p = new Personne(); new TextField(“rue”, new PropertyModel(p, “adresse.rue”)); Présentation d’Apache Wicket – 14/04/2008
Agenda Qu’est ce que Wicket ? Concepts Fondamentaux Développer un Composant Personnalisé Q&R Présentation d’Apache Wicket – 14/04/2008
Pourquoi un composant personnalisé? Eelco Hillenius: « Imagine being told that you can use Java as your programming language, but at the same time being told not to create your own classes. [...] I fail to understand why that has to be different for UI development, and Wicket proves it doesn't have to be so. » Présentation d’Apache Wicket – 14/04/2008
Combien de temps pour un composant ? 464 pages … 20 minutes et encore… Présentation d’Apache Wicket – 14/04/2008
Example: Password strength weak medium strong Présentation d’Apache Wicket – 14/04/2008
Example: Password strength Les Panels permettent le regroupement Ils ont leur propre ficher html Peuvent être échangé dans les pages par d’autres composants Peuvent contribuer au header de la page html Peuvent contenir autant de composants que souhaité, même d’autres panels Présentation d’Apache Wicket – 14/04/2008
Example: Password strength Présentation d’Apache Wicket – 14/04/2008
Example: Password strength Présentation d’Apache Wicket – 14/04/2008
Example: Password strength Présentation d’Apache Wicket – 14/04/2008
Les Composants sont reutilisables Mettre le tout dans un JAR Packager toutes les ressources nécessaires: HTML, JavaScript, Images, CSS class file Mettre le JAR dans le classpath Prêt à être (re)utilisé Présentation d’Apache Wicket – 14/04/2008
Agenda Qu’est ce que Wicket ? Concepts Fondamentaux Développer un Composant Personnalisé Q&R Présentation d’Apache Wicket – 14/04/2008