Introduction ¤ Grégory Galli
¤ Tokidev S.A.S. n Consulting, Bureau d’étude,
développement informatique.
n www.tokidev.fr
3
Avant de commencer ¤ Posez des questions !
n Si un point ne vous semble pas clair, n’hésitez pas à me poser des questions.
¤ Me contacter en dehors du cours n Si vous avez besoin d’aide en dehors des horaires de cours,
contactez moi par e-mail : [email protected] n Pour le cours ou vos projets.
4
Avant de commencer
¤ Google est votre ami ! n Si vous rencontrez un problème, ayez le réflexe de chercher
sur internet… la réponse y sera la plupart du temps !
¤ Débug n Développement web : Inspecteur (Chrome/Firebug) n Développement Grails : Débug pas à pas comme en Java
5
Planning
¤ Lundi 18 Novembre n Cours : 8h30 – 11h30 n TD : 13h – 16h
¤ Mercredi 20 Novembre n Cours : 8h30 – 11h30 n TD : 13h – 16h
6
¤ Mardi 19 Novembre n Cours : 8h30 – 11h30 n TD : 13h – 16h
Rappel : Web Services
¤ Programme informatique permettant la communication et l’échange de données entre applications.
¤ Deux principaux types de Web Services :
n SOAP (WSDL / UDDI) n REST
8
Rappel : Serveur d’application ¤ Machine ou service pour l’hébergement d’applications à
exécuter côté client ¤ Quelques exemples :
n JBOSS n Apache Tomcat n Glassfish n Websphere n …
9
Grails, c’est quoi ?
¤ Né en 2005, initié par Graeme Rocher ¤ Framework open source de développement agile ¤ Basé sur le langage Groovy ¤ Groovy on Rails (agile) > Grails ¤ Construit sur un modèle MVC
11
Groovy, c’est quoi ?
¤ Langage OO destiné à la plateforme Java ¤ Alternative inspirée de Python, Ruby et Smalltalk ¤ Intégré et compatible avec la JVM
n On peux utiliser des librairies Java n Être utilisé directement dans des classes Java
12
Philosophie : les cinq fondamentaux
¤ DRY : Don’t Repeat Yourself ¤ Développement rapide
n Prototypage n Scaffolding
n Gros projets ¤ Architecture orientée modèle ¤ Convention plutôt que configuration ¤ Exploite la puissance de la JVM : compilation en bytecode Java
13
Avantages ¤ Web MVC : Facile à utiliser ¤ GSP : Langage de template simple et complet ¤ Serveur embarqué ¤ GORM : Modélisation et accès aux données ¤ Base de donnée simulée (développement) ¤ Internationalisation ¤ Tests & Tests unitaires ¤ Documentation très riche
14
Plugins
¤ Tomcat ¤ Hibernate ¤ Très nombreux ¤ Accélèrent grandement le développement ¤ Ne pas en abuser ¤ Twitter Bootstrap
16
Hibernate
¤ Framework open source de persistance ¤ Adaptable à tous les serveurs d’application / web ¤ Remplacement d’une DAL classique
n Appel de méthodes objets de haut niveau
¤ Pluggable sur n’importe quel type de BDD ¤ Utilisé dans le cadre du développement Grails via GORM
18
GORM
¤ Grails Object Relational Mapping ¤ Illusion de base de donnée
orientée objet ¤ Correspondance monde objet /
monde relationnel n Appel de méthodes objets de haut
niveau
19
def book = Book.findByTitle("Groovy in Action") book .addToAuthors(name:"Dierk Koenig") .addToAuthors(name:"Guillaume LaForge") .save()
grails create-domain-class org.bookstore.Book
GORM vs DAL Classique
¤ Avantages
n Réduction de la quantité de code n Binding poussé
n Pas de SQL pour des requêtes simples n On appelle directement les objets que l’on a créé
n Méthodes dynamiques
20
GORM vs DAL Classique 21
¤ Désavantages
n On ne sait pas ce qui se passe derrière n On rajoute une couche à Performances n Connaissances requises pour une utilisation efficace n Sans compréhension du concept et des mécaniques, l’échec est assuré
Composants d’un projet Grails ¤ Config ¤ Domain : Définition du modèle ¤ Controller : Contrôleurs web ¤ i18n : Internationalisation ¤ Service : Couche de service ¤ View : Groovy Server Pages ¤ SRC : Autre sources (Java / Groovy) ¤ Test : Tests unitaires et d’intégration ¤ Web-app : ressources web
22
Config 24
¤ Config : Configuration du projet ¤ DataSource
n Liens base de données n Configuration
¤ BuildConfig ¤ UrlMapping
n Règles de redirections n REGEXP
¤ ApplicationResources n Module gestion de ressource (Grails 2.0)
Ressources 25
¤ Plugin de base inclus depuis la version 2.0 de Grails
¤ Gestion des ressources web n Javascript n CSS
¤ Optimisation n Compression n Concaténation
DataSources 26
¤ Configurations base de données n Différentiation Production / Test /
Production n dbCreate : Paramètre important qui
définit le comportement au lancement du projet
n create n create-drop n update
BuildConfig 27
¤ Configurations des dépendances ¤ Port de déploiement ¤ Configuration des plugins
n runtime n build n compile n test n provided
UrlMapping 28
¤ Configuration des redirections n Expressions régulières n Vers des controllers / actions n Vers des vues
UrlMapping 29
¤ Définitions complexes et contraintes : n $ : permets de pré-nommer des
variables n Expressions régulières pour des
besoins particuliers n Définitions bi-directionnelles
Modèle 31
¤ Attributs de la classe ¤ hasMany / hasOne ¤ constraints ¤ mapping ¤ mappedBy ¤ Constructeurs ¤ Méthodes de classe
Controlleur 32
¤ Lien vers les vues ¤ Traitement léger ¤ beforeInterceptor ¤ allowedMethods ¤ Retour vers les vues
n Render n Redirect n [] n XML / JSON Converters
Controlleur 33
¤ Comportement par défaut n Renvoi à la vue correspondante n Sinon, méthodes à disposition
n Redirect n Render n []
¤ Exemple: n Controllers /
FrontController.groovy n Méthode index
n Views/Front/index.gsp
i18n 34
¤ Internationalisation ¤ Injection via gettext ¤ 17 langues par défaut ¤ ${message (code:’’lb.hello’’)}
¤ <g:message code=’’lb.hello’’/> ¤ <g:message code="my.localized.content" args="$
{ ['Juan', 'lunes'] }" /> n my.localized.content=Hola, Me llamo {0}. Hoy es {1}.
n render : Hola, Me llamo Juan. Hoy es lunes.
i18n 35
¤ Cas complexes n Injection de message dans un message
n message(code: 'default.not.found.message', args: [message(code: 'congres.label', default: 'Congres'), id])
n code: 'default.not.found.message' n args: [message(code: 'congres.label', default: 'Congres'), id]
Service 36
¤ Traitements lourds n Injection dans les controlleurs
¤ Threading possible n Attention au contexte Hibernate
¤ Langages Java / Groovy ¤ Eviter les manipulation de BDD
autant que possible
Service 37
¤ Conservation du contexte de persistance n Possible mais à éviter n Si on ne peux faire autrement
Vues 38
¤ Index n <meta name="layout" content="main"/>
¤ ${ … } ¤ <% … %>
n
¤ <g:xxx /> ¤ Resources accessible (grailsApplication)
Vues - Layout 39
¤ Default title ¤ <g:layoutHead />
¤ <r:layoutResources />
¤ <g:layoutBody />
¤ <r:layoutResources />
Grails 2.0.0 41
¤ Version majeure riche en fonctionnalités n Intégration de base du plugin Resources n Amélioration des test unitaires et d’intégration n HTML5 dans le scaffolding n Nouvelle console
¤ Version à utiliser : 2.2.4
Modélisation 43
¤ Création du modèle n Accès à tous les types de base (Int, String, Boolean) n Création d’une relation 1..n
n static hasMany = [nomDeLaCollection:Object]
n Création d’une relation 1..1 : Comme un attribut quelconque n Utilisation possible de la propriété hasOne
Modélisation 45
¤ Possibilité d’héritage n Eviter si possible à Gourmand en ressources n Récupération des attributs du parent
Modélisation – Relations 46
¤ Très important n Définition du « responsable » d’une
association via la propriété « belongsTo »
n Je crée un objet « Roue » qui belongsTo « Vehicule », si j’efface le véhicule, ma roue sera effacé elle aussi car une relation forte est définie entre les deux objets
Modélisation – Relations 47
¤ Si je définie deux classes Roue et Véhicule: n Roue belongsTo Vehicule
n Dépendance forte n Une roue ne peux pas être créée seule n Nécessité de créer un véhicule et d’y
attacher la roue
Modélisation - Contraintes 48
¤ Propriété constraints n Permets de définir les contraintes sur les propriétés de nos classes
n unique n blank n nullable n size n url n mail n max, maxSize …
n http://grails.org/doc/latest/ref/Constraints/Usage.html
Modélisation - Mapping 49
¤ Propriété mapping n Permets de personnaliser les noms des champs générés par GORM
dans la base de donnée
n Définir si un attribut dois être caché par défaut
n static mapping = { table bool cache usage: 'read-only', include: 'non-lazy' }
Modélisation - Mapping 50
¤ Propriété mapping n Permets de personnaliser les propriété de jointure si on ne veux pas
garder les propriété par défaut
Modélisation - Mapping 51
¤ Propriété mapping n Lazy loading
n Par défaut si un objet possède une référence sur un autre objet, ce dernier ne sera pas chargé en mémoire, si on désire que le comportement de base soit différent, il faut l’expliciter.
n static mapping = { books lazy:false
}
Modélisation - Mapping 52
¤ Propriété mapping n Les comportements comme les transactions et les cascades SQL peuvent être définies
dans ce bloc n static mapping = {
book lazy: false, cascade:"all,delete-orphan“ }
n Si l’on désire que la modification d’un objet parent affecte l’objet fils, on dois définir le fils comme appartenant au parent (relation forte), si on ne désire pas définir d’appartenance, il faut alors expliciter les comportements
n Sinon : Faisable à la main
Modélisation - Mapping 53
¤ Propriété mapping
n De très nombreuses adaptations sont possible, lire la documentation si vous êtes dans un cas particulier
n http://grails.org/doc/latest/guide/GORM.html
Manipulation des objets 54
¤ Requêtes sur une base de donnée via GORM n Récupération par ID : Object.get(id) n Récupération de tous les objets :
n Object.list() n Object.getAll()
n Requête sur propriété : n Object.findByName(‘’lenom’’) n Object.findAllByName(‘’lenom’’)
Manipulation des objets 57
¤ Sauvegarde n objectInstance.save()
n Options : n Flush : quand défini à « true », persiste l’objet immédiatement n Validate : valide la persistance de l’objet n Insert : force hibernate à utiliser un INSERT(true) ou un UPDATE (false n failOnError : si la persistance echoue, une exception sera levée
(souvent utilisé dans le bootstrap) n deepValidate : défini si les objets fils doivent eux aussi être validé
Manipulation des objets 58
¤ Ajout n vehiculeInstance.addToRoues(new Roue(..))
¤ Suppression n objectInstance.delete()
n Options : n Flush : quand défini à « true », persiste l’objet immédiatement
n vehiculeInstance.removeFromRoues(roueInstance)
Plugin : Resource 59
¤ Gestion des ressources n Images n CSS n Javascript
¤ Gestion via des modules n Fichier « ApplicationResources.groovy »
n Dépendances n Héritage
Plugin : Resource 60
¤ Utilité n Cache n Importations optimisées dans les pages n Minimize n Concaténation de fichiers n Création de bundles
Plugin : Resource 61
¤ Utilisation dans les pages n Importation de modules
n <r:require module=‘’moduleName’’/> n <r:require modules=‘’[moduleName1, moduleName2]’’
n Utilisation d’images n <g:img/> à la place de la balise <img/>
Plugin : Spring Security 62
¤ Gestion de la sécurité n Existe depuis longtemps n Utilisé dans de nombreux frameworks n Eprouvé n Intégration facile n Options de base suffisantes n Potentiel de customisation
Plugin : Spring Security 63
¤ Modèle de base n Classes
n User n Role n UserRole
n Controllers n LoginController n LogoutController
Plugin : Spring Security 64
¤ Contrôle fin de la sécurité n Méthodes (actions) n Controller n Projet global
¤ Gestion d’une session n Utilisateur couramment identifié accessible n Exploitable depuis tous les composants
n Controller n Service n Vues
Plugin : Spring Security 66
¤ Respectez les étapes n Importation du plugin n Exécution de la commande de génération
n S2-quickstart fr.mbds.cwitter User Role
n Modification des classes existantes n Ajout des utilisateurs dans le BootStrap
Documentation
¤ La documentation officielle sera votre première source d’information. n http://grails.org/doc/latest/guide/index.html
¤ Plugins n http://grails.org/plugins/
¤ Google ¤ Forums d’entraide
69
Merci à vous !
¤ N’hésitez pas à me contacter pout toute demande d’informations : n Grégory Galli n E-mail : [email protected] n Site Web : www.tokidev.fr
¤ Bonne continuation à tous !
70
Pratique
Réalisation d’une application « Twitter like »
Utilisation de tous les aspects de Grails
71