Introduction à JSF. Bien débuter avec Java Server Face. Pascal Urso François Charoy



Documents pareils
Cours en ligne Développement Java pour le web

Refonte front-office / back-office - Architecture & Conception -

TP JEE Développement Web en Java. Dans ce TP nous commencerons la programmation JEE par le premier niveau d une application JEE : l application web.

Projet Java EE Approfondi

Web Tier : déploiement de servlets

Compte Rendu d intégration d application

Module BD et sites WEB

Institut Supérieur de Gestion. Cours pour 3 ème LFIG. Java Enterprise Edition Introduction Bayoudhi Chaouki

Outil de planification en ligne pour des créations de rendez-vous ou de sondage

LICENCE PROFESSIONNELLE

Avant-propos 1. Avant-propos Organisation du guide À qui s'adresse ce guide?...4

Types d applications pour la persistance. Outils de développement. Base de données préexistante? 3 modèles. Variantes avec passerelles

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

WEB & DÉVELOPPEMENT LES BASES DU WEB LE LANGAGE HTML FEUILLES DE STYLES CSS HISTORIQUE D INTERNET ET DU WEB LES DIFFÉRENTS LANGAGES

Ociensa Technologies.

Architecture JEE. Objectifs attendus. Serveurs d applications JEE. Architectures JEE Normes JEE. Systèmes distribués

Devenez un véritable développeur web en 3 mois!

les techniques d'extraction, les formulaires et intégration dans un site WEB

Programmation Web. Madalina Croitoru IUT Montpellier

SIO Page 1 de 5. Applications Web dynamiques. Prof. : Dzenan Ridjanovic Assistant : Vincent Dussault

Environnements de Développement

Développement d un réseau social modulaire

THÉMATIQUES. Comprendre les frameworks productifs. Découvrir leurs usages. Synthèse

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

Magento. Magento. Réussir son site e-commerce. Réussir son site e-commerce BLANCHARD. Préface de Sébastien L e p e r s

Mise en œuvre des serveurs d application

Architecture Orientée Service, JSON et API REST

10. Base de données et Web. OlivierCuré

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Authentification et contrôle d'accès dans les applications web

4. SERVICES WEB REST 46

Technologies Web. Ludovic Denoyer Sylvain Lamprier Mohamed Amine Baazizi Gabriella Contardo Narcisse Nya. Université Pierre et Marie Curie

Alfstore workflow framework Spécification technique

Application web de gestion de comptes en banques

Auto-évaluation Aperçu de l architecture Java EE

CQP Développeur Nouvelles Technologies (DNT)

Création d une application JEE

BES WEBDEVELOPER ACTIVITÉ RÔLE

Applications distribuées: le retour du client "riche"

Extension SSO Java. Cette note technique décrit la configuration et la mise en œuvre du filtre de custom SSO Java.

JOnAS 5. Serveur d application d

Le développement d applications Web

Une Histoire de Migration Agile

Application Web et J2EE

Java et les bases de données

XML par la pratique Bases indispensables, concepts et cas pratiques (3ième édition)

Java et les bases de données: JDBC: Java DataBase Connectivity SQLJ: Embedded SQL in Java. Michel Bonjour

SITE WEB E-COMMERCE ET VENTE A DISTANCE

Développement des Systèmes d Information

7 villa de la citadelle Né le 13 mai Arcueil Nationalité : Française. Développeur Web JEE COMPÉTENCES

12/07/13 Oracle Application Express 4.2

Principales failles de sécurité des applications Web Principes, parades et bonnes pratiques de développement

AngularJS pour une application d'entreprise

AJAX. (Administrateur) (Dernière édition) Programme de formation. France, Belgique, Suisse, Roumanie - Canada

F O R M A T I O N CATALOGUE

Première coupe : Introduction à la plateforme Java EE JAVA JAVA. Introduction à la plateforme Java EE. Introduction à la plateforme Java EE

Architectures Web Services RESTful

ASP.NET MVC 4 Développement d'applications Web en C# - Concepts et bonnes pratiques

Cloud. Définition? 08/11/2012. James Urquhart The Wisdom of Clouds

Architecture N-Tier. Ces données peuvent être saisies interactivement via l interface ou lues depuis un disque. Application

Jahia. Guillaume Monnette École Ingénieurs 2000 Marne-La-Vallée IR3

TP3. Mail. Attention aux fausses manoeuvres lors de ce TP vous pouvez endommager votre mail sur ouindose.

Europa. Développement JEE 5. avec Eclipse. K a r i m D j a a f a r. A v e c l a c o n t r i b u t i o n d e O l i v i e r S a l v a t o r i

Introduction à la plateforme J2EE

Programme «Analyste Programmeur» Diplôme d état : «Développeur Informatique» Homologué au niveau III (Bac+2) (JO N 176 du 1 août 2003) (34 semaines)

Petite définition : Présentation :

OpenPaaS Le réseau social d'entreprise

Module Com231A - Web et Bases de Données Notion 5 : Formulaires et utilisation des Bases de Données avec PHP

Développement d'applications Web HTML5 L'art et la manière avec Visual Studio 2015 et TFS

WINDEV MOBILE. ios SMARTPHONE SUPPORT: IOS, ANDROID, WINDOWS PHONE 8.

Les grandes facettes du développement Web Nicolas Thouvenin - Stéphane Gully

Institut Supérieure Aux Etudes Technologiques De Nabeul. Département Informatique

ADMINISTRATION DE ADOBE LIVECYCLE MOSAIC 9.5

La persistance des données dans les applications : DAO, JPA, Hibernate... COMPIL 2010 francois.jannin@inp-toulouse.fr 1

SharePoint 2013 Développez en.net pour personnaliser SharePoint (Apps, REST, CSOM et Azure)

WEB page builder and server for SCADA applications usable from a WEB navigator

INGÉNIEUR - DÉVELOPPEUR EXPÉRIMENT É JAVA - J2EE. 27 ans - 5 ans d'expérience

DEVELOPPEMENT WEB & PROGRAMMATION

Atelier Progress Rollbase

Programme ASI Développeur

Formation en Logiciels Libres. Fiche d inscription

Cours Master Recherche RI 7 Extraction et Intégration d'information du Web «Services Web»

Apache Camel. Entreprise Integration Patterns. Raphaël Delaporte BreizhJUG

Connexion à SQL Server 2005 à partir du serveur d application SJSAS 9 Utilisation d une interface JDBC

Programmation en Java IUT GEII (MC-II1) 1

Nuxeo 5.4 : les nouveautés

PRODUCTS LIST (updated 11th January 2010)

24/11/2011. Cours EJB/J2EE Copyright Michel Buffa. Plan du cours. EJB : les fondamentaux. Enterprise Java Bean. Enterprise Java Bean.

ContactForm et ContactFormLight - Gestionnaires de formulaire pour Prestashop Edité par ARETMIC S.A.

Francis Mignault. ! Coauteur : Expert Oracle Application Express. ! Membre du Oracle APEX Advisory Board apex.oracle.com/vote

Java Aspect Components (JAC)

Modèle de cahier des charges pour un appel d offres relatif à une solution de gestion des processus métier (BPM)

Projet 2. Gestion des services enseignants CENTRE D ENSEIGNEMENT ET DE RECHERCHE EN INFORMATIQUE. G r o u p e :

SYNC FRAMEWORK AVEC SQLITE POUR APPLICATIONS WINDOWS STORE (WINRT) ET WINDOWS PHONE 8

( Mauritius ) ( France )

Java Naming and Directory Interface

LANGAGUE JAVA. Public Développeurs souhaitant étendre leur panel de langages de programmation

TP1 : Initiation à Java et Eclipse

Optimiser pour les appareils mobiles

IBM Rational Application Developer pour WebSphere Software V8.5 accélère le développement d'applications de haute qualité.

Transcription:

Introduction à JSF Bien débuter avec Java Server Face Pascal Urso François Charoy

License Creative Commons Cette création est mise à disposition selon le Contrat Paternité-Pas d'utilisation Commerciale-Partage des Conditions Initiales à l'identique 2.0 France disponible en ligne http://creativecommons.org/licenses/by-nc-sa/2.0/fr/ou par courrier postal à Creative Commons, 171 Second Street, Suite 300, San Francisco, California 94105, USA. 2 CC by-nc-sa

JSF Késako? Un framework pour le developement d'applications web Principes essentiels : Orienté composants MVC2

Parmis d'autres

Architecture Desktop Browser HTML Server JSF Page HTML RenderKit Front ctrl JSF Page App Backend Phone WML WML RenderKit

Propriétés importantes Modèle de composants de vue extensible Modèle de rendu flexible Modèle de gestion des évènements Environnement de validation Support pour le flot de pages Internationalisation Accessibilité

Techniquement Du code JSP avec des les lib html et core <%@ page contenttype="text/html" %> <%@ taglib uri="http://java.sun.com/jsf/html" prefix="html" %> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="core" %> <core:view> <html:outputtext value="hello! (en JSF!)" /> </core:view> Résultat produit par des com.sun.faces.taglib.* javax.faces.component.*

NetBean : Intro création code java

Traitement d une requête (c) Sun

Un servlet pour les contrôler tous Toutes les requêtes passent par lui Attention à l URL pattern

Architecture MVC2 Centré sur les beans instanciation Bean update Requête HTTP Request / Session / Application FaceServlet JSF notification data Vue : JSP ou facelet Controler action

Beans Managés JSF

Beans managés Géré par JSF Déclaré dans faces-config.xml <faces-config>... <managed-bean> <managed-bean-name>unbean</managed-bean-name> <managed-bean-class>monpackage.monbean</managedbean-class> <managed-bean-scope>request</managed-bean-scope> </managed-bean> </faces-config>

Expression Language (EL) <%@ page contenttype="text/html" %> <%@ taglib uri="http://java.sun.com/jsf/html" prefix="html" %> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="core" %> <core:view> <html:outputtext value="un champ :" /> <html:outputtext value="#{unbean.unchamp}" /> </core:view> Appelle la méthode getunchamp().! différente de l'el jsp ${...} Composition #{unbean.unattribut.unchamp}

EL JSP vs EL JSF Unifiés depuis JSP 2.0 <core:view> <html:outputtext value="#{unbean.unchamp}" /> </core:view> pareil que ${unbean.unchamp} EL JSP : évaluation immédiate EL JSF : évaluation différée (à la demande) affectation actions

NetBean : bean mystère getx request/session

Formulaire de Saisie Utilisation du tag form <html:form> Nouvelle valeur : <html:inputtext value="#{unbean...unchamp}"/> </html:form> Positionné à la valeur du champ Appelle la méthode setunchamp() Conversion automatique depuis/vers String Mais aussi inputtextarea, inputsecret, selectbooleancheckbox, selectoneradio,...

Properties <html:outputtext value="#{unbean.prop}" /> getprop() peut être définie sans attribut Prop sans setter <html:inputtext value="#{unbean.prop}" /> La méthode setprop(type valeur) peut être définie sans attribut prop mais pas sans getter (valeur par défaut)

Syntaxe (depuis JSF 2.0) Bean managé : classe annoté @ManagedBean("name") Visibilité @ApplicationScoped, @SessionScoped, @RequestScoped

Traitement d une requête setprop getprop (c) Sun

Navigation JSF

La navigation JSF gère un ensemble de page reliées par un flot de contrôle. Définit dans faces-config.xml Navigation statique dynamique (c) JavaWorld.com

La navigation JSF gère seul la navigation Attention à l'accès direct à une page Prévoir un mécanisme pour bloquer l'accès (si besoin) tests filtres

Navigation Statique Dans la page JSP : toujours dans un formulaire HyperLien HTML <html:form> <html:commandlink action="actiona" value="par ici" /> </html:form> Boutton HTML <html:form> <html:commandbutton action="actiona" value="par ici aussi" /> </html:form>

Navigation Statique Dans faces-config.xml <navigation-rule> <from-view-id>/page1.jsp</from-view-id> <navigation-case> <from-outcome>actiona</from-outcome> <to-view-id>/page2.jsp</to-view-id> </navigation-case> <navigation-case> <from-outcome>actionsb*</from-outcome> <to-view-id>/page3.jsp</to-view-id> </navigation-case> </navigation-rule>

Navigation Statique (wildcard) Depuis plusieurs pages jsf <navigation-rule> <from-view-id>*</from-view-id> <navigation-case> <from-outcome>actiona</from-outcome> <to-view-id>/page2.jsp</to-view-id> </navigation-case> <navigation-case> <from-outcome>actionsb*</from-outcome> <to-view-id>/page3.jsp</to-view-id> </navigation-case> </navigation-rule>

Navigation Statique (default) Sans outcome : comportement par défaut <navigation-rule> <from-view-id>/page1.jsp</from-view-id> <navigation-case> <from-outcome>actiona</from-outcome> <to-view-id>/page2.jsp</to-view-id> </navigation-case> <navigation-case> <to-view-id>/default.jsp</to-view-id> </navigation-case> </navigation-rule>

NetBean : Navigation form

Navigation Dynamique Appel d'une méthode du bean pour calculer l'outcome <html:form> <html:commandbutton value="go" action="#{unbean.unemethode}"/> </html:form> Méthode renvoyant un String Outcome non prévu dans le flot :page courante rechargée

Navigation Dynamique Possibilité de préciser la méthode <navigation-rule> <from-view-id>/page1.jsp</from-view-id> <navigation-case> <from-action>#{unbean.metha}</from-action> <from-outcome>resulta</from-outcome> <to-view-id>/page2.jsp</to-view-id> </navigation-case> <navigation-case> <from-action>#{unbean.methb}</from-action> <from-outcome>resulta</from-outcome> <to-view-id>/page3.jsp</to-view-id> </navigation-case> </navigation-rule>

Navigation implicite (depuis JSF 2.0) Plus «usuel» On indique directement le nom de la page cible <html:commandlink action="unepage.jsp" value="par ici" /> <html:commandbutton action="unepage.jsp" value="soumettre" /> Marche aussi avec une méthode revoyant le nom d une page <html:command action="#{...}" value="par là" />

Limitations Pas d'argument pour les méthodes (get, set, actions) Impossible de définir une action par défaut dans les formulaires un seul bouton «action», le reste «actionlistener» ou commandlink Séparation modèle/vue/contrôle Vue : JSF Contrôle : bean managé Modèle : autres classes java

NetBean : play guess 3 outcomes Link +1 html

Traitement d une requête (c) Sun Navigation

Conception MVC JSF

Conception MVC Deux niveaux de contrôle Contrôle des requêtes : pris en charge par JSF Contrôle applicatif : bean managé Modèle : Classes métier Vue : Pages JSP (ou facelet) Contrôle : Beans managés Séparer le contrôle applicatif des classes métiers!!!

NetBean : properties Refactor MVC : choose triche

Table de Données JSF

Table de données

Table de données <html:datatable value="#{bank.clients}" var="client" border="1"> <html:column> <html:outputtext value="#{client.nom}"/> </html:column> <html:column> <html:outputtext value="#{client.prenom}"/> </html:column> </html:datatable>

Table de données : Header <html:datatable value="#{bank.clients}" var="client" border="1"> <html:column> <core:facet name="header"> <core:verbatim>nom</core:verbatim> </core:facet> <html:outputtext value="#{client.nom}"/> </html:column>... </html:datatable> facet : association avec le tag (et non avec le rendu du contenu)

NetBean : table demo avec input?

Binding <html:datatable binding="#{bank.datatable}" value="# {bank.clients}" var="client" border="1"> <html:column> <core:facet name="header"> <core:verbatim>nom</core:verbatim> </core:facet> <html:outputtext value="#{client.nom}"/> </html:column>... </html:datatable> Lier le bean avec le composant UI N'importe quel composant : input, box, column...

Binding import javax.faces.component.uidata; public class Bank { // UIData ancêtre de HtmlDataTable private UIData datatable; public UIData getdatatable(){ } return this.datatable; public void setdatatable(uidata dt){ this.datatable = dt; }... Composant UI : descendant de javax.faces.component.uicomponent

Binding example <html:datatable binding="#{bank.datatable}" value="# {bank.clients}" var="client" border="1">... <html:column> <html:selectbooleancheckbox binding="#{bank.checkbox}"/> </html:column> </html:datatable> <html:commandbutton value="supprimer les clients" action="#{bank.supprclientselection}"/> <html:inputtext binding="#{bank.nvnom}"/> <html:inputtext binding="#{bank.nvprenom}"/> <html:commandbutton value="ajouter un client" action="#{bank.ajoutclient}"/>

Binding Example class Bank {... private UIInput nvnom; public UIInput getnvnom() { } return this.nvnom; public void setnvnom(uiinput c) { } this.nvnom = c; public void ajoutclient(){ } Client c = new Client((String) nvnom.getvalue(), (String) nvprenom.getvalue(), 0); this.clients.add(c);

Binding Example } public void supprclientselection() { int size = this.datatable.getrowcount(); List<Client> selectedcustomers = new ArrayList<Client> (); } for (int i = 0; i < size; i++) { } this.datatable.setrowindex(i); if (this.checkbox.isselected()) selectedcustomers.add(this.clients.get(i)); this.clients.removeall(selectedcustomers); checkbox associé à la colonne

NetBean : Binding demo breakpoint

Et le MVC alors? La classe Bank s'occupe à la fois de la vue (composants UI) le modèle (données) le contrôle (suppression, ajout) Réifions tout ça!

MVC : Conception Bank customers Model Client model BankControl Seul Bean Managé

MVC : JSP <html:datatable binding="#{bankctrl.datatable}" value="#{bankctrl.model.customers}" var="customer" border="1">... <html:column> <html:selectbooleancheckbox binding="# {bankctrl.checkbox}"/> </html:column> </html:datatable> <html:commandbutton value="supprimer les clients" action="#{bankctrl.removeselectedcustomers}"/> <html:inputtext binding="#{bankctrl.nvnom}"/> <html:commandbutton value="ajouter un client" action="#{bankctrl.addcustomer}"/>

MVC : faces-config.xml <managed-bean> <description> Une un peu moins bete liste de client </description> <managed-bean-name>bankctrl</managed-bean-name> <managed-bean-class>core.mvc.controler</managedbean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean>

Agir sur les éléments d'une Table <html:datatable binding="#{bankctrl.datatable}" value="#{bankctrl.model.customers}" var="customer" border="1"> <html:column> <html:inputtext value="#{customer.cash}"/> </html:column> <html:column> <html:commandlink value="retrait" action="# {customer.withdraw}"/> </html:column> </html:datatable> PAS MVC

Agir sur les éléments d'une Table <html:datatable binding="#{bankctrl.datatable}" value="#{bankctrl.customersctrl}" var="customer" border="1"> <html:column> <html:inputtext value="#{customer.cash} /> </html:column> <html:column> <html:commandlink value="retrait" action="# {customer.withdraw}"/> </html:column> </html:datatable> Une liste contrôleur associés à chaque client

MVC : Conception 2 Bank customers Model Client model BankControl customersctrl ClientControl Seul Bean Managé

Conclusion MVC Vue : Pages jsf Contrôle : Beans managés Model : Classes métiers

Example Projet JSF promotion 2007-2008 «un (portail de) jeu asynchrone en ligne à l'aide du framework JSF.» «Vous pouvez choisir le jeu que vous voulez... du moment qu'il s'agit d'un jeu à au moins 2 joueurs au tour-par-tour.»

Plus sur les Formulaires JSF

<h:form> Questions? http://java.sun.com/javaee/javaserverfaces/reference/api/ Tag lib documentation html <h: core <f: API java.faces.*.* Formulaires <h:form> Méthode toujours POST car toujours un effet de bord (bean, compui)

Eléments Simples <h:outputtext value="#{unbean.uneprop}"/> <h:inputtext value="#{unbean.uneprop}"/> valeur pour l'initialisation et la soumission <h:inputsecret value="#{unbean.uneprop}"/> valeur à la soumission uniquement

Boutons <h:commandbutton value="label" Peut être une EL "#{unbean.uneprop}" action="#{unbean.unemethode}" Peut être statique "actionx" actionlistener="#{unbean.unemethode}" immediate="true" Remplace l'action. Le formulaire est réaffiché sans être soumis (setter non appelés). image="img" Bouton image (coordonnés du click : listener)

Lien <h:commandlink> attributs value, action, actionlistener paramètres <f:param name="..." value="..." /> exemple <html:datatable... var="elem">... <html:column> <html:commandlink value="supprimer" action="delete"> <f:param name="id" value="#{elem.id}"> </html:commandlink> </html:column> </html:datatable>

Valeur des Paramètres Directement : EL "#{param.id}" Dans un Bean : faces-config.xml <managed-bean>... <managed-property> <property-name>id</property-name> <value>#{param.id}</value> </managed-property> </managed-bean> Dans le code d'un bean managé FacesContext.getCurrentInstance().getExternalContext ().getrequest()

Elément avec valeur Check boxes Comboboxes List boxes Radio Buttons Textfields <h:selectbooleancheckbox> <h:selectonemenu> <h:selectmanymenu> <h:selectonelistbox> <h:selectmanylistbox> <h:selectoneradio> <h:inputtext> <h:inputtextarea> <h:inputsecret> Tous avec attribut valuechangelistener="# {unbean.unemethode}"

Sélection Combo, List, Radio <h:select... value="#{unbean.uneprop}"> <f:selectitems value="#{unbean.uneproplist}"/> </h:select...> uneprop : valeur initiale et de soumission une String pour selectone... une List<String> pour selectmany... unepropliste : une collection (liste ou tableau) de java.faces.model.selectitem

Validation JSF

Traitement d une requête Validation (c) Sun

Validation de Formulaire Indispensable Peut être fait à la main au moment de la soumission (chiant) Validation JSF Identifiant des champs Fonctionnement par exception

Champ Requis <h:inputtext value="#{unbean.uneprop}" required="true" id="unid"/> <h:message for="unid" styleclass="..."/> style CSS : errormessage (par exemple)

Validation Explicite <f:validatelength minimum="x" maximum="y"/> <f:validatelongrange minimum="x" maximum="y"/> <f:validatedoublerange minimum="x" maximum="y"/> Ou que minimun ou que maximun Exemple <h:inputtext value="#{bidbean2.userid}" id="userid"> <f:validatelength minimum="6"/> </h:inputtext> <h:message for="userid" styleclass="..."/>

Validation Ad-hoc <h:inputtext value="#{unbean.uneprop}" id="unid" validator="#{unbean.unemethode}"/> <h:message for="unid" styleclass="..."/> Méthode : public void validate(facescontext context, UIComponent componenttovalidate, Object value) throws ValidatorException {... }

Validation par annotation Hibernate (JSF 2.0) @Min: The annotated element must be a number whose value must be higher or equal to the specified minimum. @Max: The annotated element must be a number whose value must be lower or equal to the specified maximum. @Size: The annotated element must be between specified minimum and maximum boundaries. @NotNull: The annotated element must not be null. @Pattern: The annotated element must match the specified Java regular expression. @Valid: For a collection or a map, checks that all the objects they contain are valid @Email: Checks whether the string conforms to the email address specification

Composant UI JSF

Composants UI Tous les éléments d interface (<h:input >, <h:select >) sont des composants. Mais aussi view, outputtext,

Traitement d une requête UI (c) Sun

Facelet JSF

Facelet Kesako? Une autre façon (que JSP) propre à JSF pour présenter la vue HTML Pourquoi? JSP = servlet (confusion, cycle de vie) Plus léger Templates Extensible Format : XHTML

helloworld.xhtml <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/tr/xhtml1/dtd/ xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" </html> xmlns:h="http://java.sun.com/jsf/html"> <h:head> <title>facelet Title</title> </h:head> <h:body> Hello from Facelets </h:body> A première vue rien de neuf

Définition du template template.xhtml <!DOCTYPE html > <html xmlns:ui="http://java.sun.com/jsf/facelets" > <head> <title> <ui:insert name="titre" /> </title> </head> <body> <f:view> <p> <ui:insert name="entete"> <h:outputtext value="entete generique" /> </ui:insert> </p> <div> <ui:insert name="menu" /> </div> <p> <ui:insert name="contenu" /> </p> </f:view> </body> </html> Valeur par défaut

Utilisation du template <!DOCTYPE html > <html > <ui:composition template="/template.xhtml"> <ui:define name="titre">faq Java</ui:define> <ui:define name="entete"> <h:outputtext value="entete Java" > </ ui:define> <ui:define name="menu"> <h:form> <h:commandlink action="faq.xhtml" value="faq" /> <h:commandlink action="tutoriels.xhtml "action="tutoriels.xhtml" value= "Tutoriels" /> <h:commandlink action="forums.xhtml" value="forums" /> </h:form> </ui:define> <ui:define name="contenu"> <h:outputtext value="les FAQs Java" > </ ui:define> </ui:composition> </html>

Création de composant : zone.xhtml Similaire a la définition de tag jsp (mais sans java) Un composant est une composition <!DOCTYPE html > <html > <ui:composition> <ui:insert /> <h:outputtext value="#{titre}" styleclass="titre" /> <h:inputtext value="#{valeur}" styleclass="zonetexte" /> </ui:composition> </html> Avec des paramètres #{ } Et un corps <ui:insert />

Déclaration du composant Fichier /WEB-INF/taglib.xml <?xml version="1.0"?> <!DOCTYPE facelet-taglib PUBLIC "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN" "facelettaglib_1_0.dtd"> <facelet-taglib> <namespace>http://www.uhp.fr/monappli</namespace> <tag> </tag> <tag-name>zonedetexte</tag-name> <source>composants/zone.xhtml</source> </facelet-taglib>

Déclaration de la taglib Fichier web.xml <context-param> <param-name>facelets.libraries</param-name> <param-value>/web-inf/taglib.xml</param-value> </context-param>

Utilisation du tag <!DOCTYPE html > <html xmlns:mt=" http://www.uhp.fr/monappli"> <body> <f:view> <mt:zone titre="hello World" valeur="#{unmanagedbean.unchamp}"> <h:graphicimage value="img/arrow.png" alt="->"/> <mt:zone/> </f:view> </body> </html>

Quelques mots supplémentaire sur la conception Web Au milieu d un océan

Ce que l on n a pas vu Persistance Framework Hibernate, JDO, JPA Client (mi-)lourd : Javascript, AJAX Tests Framework AJAX: RichFaces, IceFaces, GWT Framework HTTPUnit, JSFUnit, Passage à l échelle Cache, cache distribué Du gros, du lourd, du cloud: NoSQL, App engine, MAP/REDUCE, CASSANDRA Ergonomie CSS, Web Sémantique

Test et servlet

Tests et servlet A la base pas facile Appel Web Impact du container Problèmes de session Concurrence, etc Librarie HTTPUnit, JSFUnit, A la base des mocks sur des appels aux méthodes des servlet (doget, )

Quelques mots sur la persistance JPA + JSF

Persistance Peut se faire Par des fichiers classique Par des appels JDBC (c est du java) Par la librairie de tag sql (jsp) Par des framework spécifique (hibernate, JDO, ) Par le standard javaee JPA