COURS GRAILS Novembre 2013
2 Introduction Introduction Programme Planning Rappels
Introduction 3 Grégory Galli Tokidev S.A.S. n Consulting, Bureau d étude, développement informatique. n www.tokidev.fr
Avant de commencer 4 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 : greg.galli@tokidev.fr n Pour le cours ou vos projets.
Avant de commencer 5 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
Planning 6 Lundi 18 Novembre n Cours : 8h30 11h30 n TD : 13h 16h Mercredi 20 Novembre n Cours : 8h30 11h30 n TD : 13h 16h Mardi 19 Novembre n Cours : 8h30 11h30 n TD : 13h 16h
Rappel : MVC 7 Modèle Vue Contrôleur
Rappel : Web Services 8 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
Rappel : Serveur d application 9 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
10 Présentation Générale
Grails, c est quoi? 11 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
Groovy, c est quoi? 12 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
Philosophie : les cinq fondamentaux 13 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
Avantages 14 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
Créer un projet : 3 étapes 15 Création des classes de domaine Scaffold Run
Plugins 16 Tomcat Hibernate Très nombreux Accélèrent grandement le développement Ne pas en abuser Twitter Bootstrap
17 Présentation Composants principaux Hibernate GORM Structure d un projet
Hibernate 18 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
GORM 19 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 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 20 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
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 22 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
23 Présentation Eléments principaux Config
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
30 Présentation Eléments principaux Model View Controller Services Gettext
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.labe 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 />
Web app 40 Web-app /css /images /js /meta-inf /web-inf
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
42 Un peu de pratique! Préparation de l environnement de travail
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 44 Création du modèle n Définition des attributs n Relations n Contraintes
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 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 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 )
55 Manipulation des objets
56 Manipulation des objets
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 65 TagLibs n <sec:ifloggedin> n <sec:ifnotloggedin>
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
Plugin : Spring Security 67 BootStrap
Plugin : Spring Security 68 BootStrap
Documentation 69 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
Merci à vous! 70 N hésitez pas à me contacter pout toute demande d informations : n Grégory Galli n E-mail : greg.galli@tokidev.fr n Site Web : www.tokidev.fr Bonne continuation à tous!
Pratique 71 Réalisation d une application «Twitter like» Utilisation de tous les aspects de Grails
72 TP à réaliser