Vous êtes sur la page 1sur 105

Framework GRAILS

2015/2016

Introduction
Introduction Programme Planning Rappels

Introduction
3

Grgory

Tokidev

Galli

S.A.S.

Consulting,

Bureau dtude,
dveloppement
informatique.
www.tokidev.fr

Avant de commencer
4

Posez

des questions !

Si

un point ne vous semble pas clair, nhsitez pas me poser


des questions.

Me
Si

contacter en dehors du cours

vous avez besoin daide en dehors des horaires de cours,


contactez moi par e-mail : greg.galli@tokidev.fr
Pour le cours ou vos projets.

Avant de commencer
5

Google

est votre ami !

Si

vous rencontrez un problme, ayez le rflexe de chercher


sur internet la rponse y sera la plupart du temps !

Dbug

Ca marche pas !

Dveloppement

web : Inspecteur (Chrome/Firebug)


Dveloppement Grails : Dbug pas pas comme en Java

Rappel : MVC
6

Modle
Vue
Contrleur

Rappel : Web Services


7

Programme

informatique permettant la communication et


lchange de donnes entre applications.

Deux

principaux types de Web Services :

SOAP
REST

(WSDL / UDDI)

Rappel : Serveur dapplication


8

Machine ou service pour lhbergement dapplications


excuter ct client

Quelques exemples :
JBOSS
Apache Tomcat
Glassfish
Websphere

Prsentation Gnrale

Grails, cest quoi ?


10

en 2005, initi par Graeme Rocher


Framework open source de dveloppement agile
Bas sur le langage Groovy
Groovy on Rails (agile) > Grails
Construit sur un modle MVC

Groovy, cest quoi ?


11

Langage

OO destin la plateforme Java


Alternative inspire de Python, Ruby et Smalltalk
Intgr et compatible avec la JVM
On

peux utiliser des librairies Java


tre utilis directement dans des classes Java

Philosophie : les cinq fondamentaux


12

DRY : Dont Repeat Yourself


Dveloppement rapide

Prototypage

Scaffolding

Gros projets

Architecture oriente modle


Convention plutt que configuration
Exploite la puissance de la JVM : compilation en bytecode Java

Avantages
13

Web

MVC : Facile utiliser


GSP : Langage de template simple et complet
Serveur embarqu
GORM : Modlisation et accs aux donnes
Base de donne simule (dveloppement)
Internationalisation
Tests & Tests unitaires
Documentation trs riche

Crer un projet : 3 tapes


14

Cration

Scaffold

Run

des classes de domaine

Plugins
15

Tomcat
Hibernate
Trs

nombreux
Acclrent grandement le dveloppement
Ne pas en abuser
Twitter Bootstrap

16

Prsentation Composants principaux


Hibernate GORM Structure dun projet

Hibernate
17

Framework

open source de persistance


Utilisable dans tous les environnements (Client lourd / Web)
Remplacement dune DAL classique
Appel

de mthodes objets de haut niveau

Pluggable

sur nimporte quel SGBD


Utilis dans le cadre du dveloppement Grails via GORM

GORM
18

Grails

Object Relational Mapping


Illusion de base de donne
oriente objet
Correspondance monde objet /
monde relationnel
Appel

def book = Book.findByTitle("Groovy in Action")


book
.addToAuthors(name:"Dierk Koenig")
.addToAuthors(name:"Guillaume LaForge")
.save()

de mthodes objets de haut

niveau
grails create-domain-class org.bookstore.Book

GORM vs DAL Classique


19

Avantages

Rduction

de la quantit de code
Binding pouss

Pas de SQL pour des requtes simples


On appelle directement les objets que lon a cr

Mthodes

dynamiques

GORM vs DAL Classique


20

Inconvnients

On

ne sait pas ce qui se passe derrire


On rajoute une couche Performances
Connaissances requises pour une utilisation efficace
Sans comprhension du concept et des mcaniques, lchec est assur

Composants dun projet Grails


21

Config
Domain : Dfinition du modle
Controller : Contrleurs web
i18n : Internationalisation
Service : Couche de service
View : Groovy Server Pages
SRC : Autre sources (Java / Groovy)
Test : Tests unitaires et dintgration
Web-app : ressources web

22

Prsentation Elments principaux


Config

Config
23

Config : Configuration du projet


DataSource

Liens base de donnes


Configuration

BuildConfig
UrlMapping

Rgles de redirections

REGEXP

ApplicationResources

Module gestion de ressource (Grails 2.0)

Ressources
24

Plugin

de base inclus depuis la


version 2.0 de Grails
Gestion des ressources web
Javascript
CSS

Optimisation
Compression
Concatnation

Assets
25

Plugin de base inclus depuis la


version 2.4 de Grails
Gestion des ressources web

Javascript
CSS
+Mdias

Optimisation
Compression
Concatnation

DataSources
26

Configurations

base de donnes

Diffrentiation

Production / Test /

Production
dbCreate : Paramtre important qui
dfinit le comportement au
lancement du projet

create
create-drop
update

BuildConfig
27

Configurations des dpendances


Port de dploiement
Configuration des plugins

runtime
build
compile
test
P
provided

VM Fork

UrlMapping
28

Configuration
Expressions

des redirections

rgulires
Vers des controllers / actions
Vers des vues

UrlMapping
29

Dfinitions

complexes et
contraintes :
$

: permets de pr-nommer des


variables
Expressions rgulires pour des
besoins particuliers
Dfinitions bi-directionnelles

30

Prsentation Elments principaux


Model View Controller Services Gettext

Modle
31

Attributs

de la classe
hasMany / hasOne
constraints
mapping
mappedBy
Constructeurs
Mthodes de classe

Controlleur
32

Lien vers les vues


Traitement lger
beforeInterceptor
allowedMethods
Retour vers les vues

Render
Redirect
[]
XML / JSON Converters

Controlleur
33

Comportement
Renvoi

par dfaut

la vue correspondante
Sinon, mthodes disposition

Redirect
Render
[]

Exemple:
Controllers

/
FrontController.groovy

Mthode index

Views/Front/index.gsp

i18n
34

Internationalisation
Injection

via gettext
17 langues par dfaut

${message (code:lb.hello)}
<g:message code=lb.hello/>
<g:message code="my.localized.content"
args="${ ['Juan', 'lunes'] }" />

my.localized.content=Hola, Me llamo {0}. Hoy es {1}.

render : Hola, Me llamo Juan. Hoy es lunes.

i18n
35

Cas

complexes

Injection

de message dans un message

message(code: 'default.not.found.message', args: [message(code: 'congres.labe


default: 'Congres'), id])
code: 'default.not.found.message'
args: [message(code: 'congres.label', default: 'Congres'), id]

Service
36

Code mtier et traitements lourds

Injection dans les controlleurs

Threading possible

Attention au contexte de
persistance

Langages Java / Groovy


Environnement transactionnel par
dfaut

Vues
37

Index

<meta name="layout" content="main"/>

${ }

<% %>

<g:xxx />
Resources accessible (grailsApplication)

Vues - Layout
38

Default title

<g:layoutHead />

<r:layoutResources />

<g:layoutBody />

<r:layoutResources />

Web app
39

Web-app

/css
/images
/js
/meta-inf
/web-inf

Grails 2.0.0
40

Version

majeure riche en fonctionnalits

Intgration

de base du plugin Resources


Amlioration des test unitaires et dintgration
HTML5 dans le scaffolding
Nouvelle console

Grails 2.2.0
41

Forked

Tomcat Execution
Projections SQL dans les requtes via Critres (createCriteria)

Grails 2.3.0
42

Forked VM Execution
REST support improvement

REST Mapping
Scaffolding for REST Controllers

Scaffolding plugin
Async support
Controller Global Exception Handling
Namespaces for Controller

Gestion de plusieurs Contrleurs de mme nom

Grails 2.4.0
43

Groovy

2.3
Spring 4
Hibernate 4.3
Assets
Amlioration des Transactions
Amlioration des Tests unitaires
Amlioration des Subqueries

Grails 2.4.0
44

Subqueries

45

Un peu de pratique !
Prparation de lenvironnement de travail

Modlisation
46

Cration

du modle

Accs

tous les types de base (Int, String, Boolean)


Cration dune relation 1..n

static hasMany = [nomDeLaCollection:Object]

Cration

dune relation 1..1 : Comme un attribut quelconque

Utilisation possible de la proprit hasOne

Modlisation
47

Cration du modle
Dfinition des attributs
Relations
Contraintes

Modlisation
48

Possibilit

dhritage

si possible Gourmand en ressources


Rcupration des attributs du parent
Eviter

Modlisation Relations
49

One

to one

Unidirectionnelle

Bidirectionnelle

Comportement de cascade

Modlisation Relations
50

One

to one Bidirectionnelle

new

Face(nose:new Nose()).save()

Sauvegarde Face et Nose


Cre lassociation

def

faceInstance = new Face()


faceInstance.nose = new Nose()
faceInstance.save()

Equivalent

Modlisation Relations
51

One

to one Bidirectionnelle

Clef

trangre dplace dans la table


cible
Fonctionne uniquement dans les relations
bidirectionnelles

Modlisation Relations
52

Subtilits cas complexes

Impossibilit pour Grails de deviner que parent et


supervisor reprsentent deux relations distinctes

personInstance1.parent = personneInstance2

personneInstance1.parent personneInstance2
personneInstance2.supervisor personneInstance1

Modlisation Relations
53

Subtilits
Solution

cas complexes

Modlisation Relations
54

One

to many

books

sera un Set
Unidirectionnel par dfaut, comme en one to one
Comportement de cascade par dfaut :
Cascade

les saves et updates

Modlisation Relations
55

One

to many - belongsTo

Cascade

les deletes
Relation bidirectionnelle

Modlisation Relations
56

Subtilits

Mlange

Cas complexes

des relations
Expliciter via la proprit mappedBy
Expliciter le modle

Modlisation Relations
57

Subtilits

Cas complexes

Modlisation Relations
58

Many

to many

Obligation

de dfinir un responsable de la relation

Afin

de profiter de la cascade des sauvegardes et updates, il faut


initier les requtes depuis le responsable de la relation

Pas

de scaffolding

Modlisation Relations
59

Many

to many

Option

Option

Modlisation Relations
60

Trs

important

Dfinition

du responsable dune
association via la proprit
belongsTo
Je cre un objet Roue qui belongsTo
Vehicule , si jefface le vhicule, ma
roue sera efface elle aussi car une
relation forte est dfinie entre les deux
objets

Modlisation Relations
61

Si

je dfinie deux classes Roue et


Vhicule:
Roue

belongsTo Vehicule

Dpendance forte
Une roue ne peux pas tre cre seule
Ncessit de crer un vhicule et dy
attacher la roue

Modlisation Relations
62

Ajout

dune Roue

new Roue() KO
vehiculeInstance.addToRoues(new Roue()) OK

Retrait

dune roue

roueInstance.delete() KO
vehiculeInstance.removeFromRoues(roueInstance) - OK

Modlisation Relations
63

Relation

one to many est un Set par

dfaut
Non

ordonn

Surcharge possible du type en List


Collection

ordonne
Gestion automatique des index
Colonne supplmentaire dans la table

Modlisation Relations
64

Quelques
Un

Set a une contrainte dunicit

Une

proprits

Couteux en mmoire lorsque les collections


deviennent trop grandes
Gestion la main

List a une contrainte dunicit


Cre un index pour grer lordre des objets
Si vous manipulez la main, prudence car une
incohrence dans les index fera planter vos
requtes

Modlisation - Contraintes
65

Proprit constraints

Permets de dfinir les contraintes sur les proprits de nos classes

unique
blank
nullable
size
url
mail
max, maxSize

http://grails.org/doc/latest/ref/Constraints/Usage.html

Modlisation - Mapping
66

Proprit

mapping

Permets

de personnaliser les noms des champs gnrs par GORM


dans la base de donne

Dfinir si un attribut dois tre cach par


dfaut

static mapping =
{
table bool
cache usage: 'read-only',
include: 'non-lazy'
}

Modlisation - Mapping
67

Proprit
Permets

mapping

de personnaliser les proprit de jointure si on ne veux pas


garder les proprit par dfaut

Modlisation - Mapping
68

Proprit
Lazy

mapping

loading

Par dfaut si un objet possde une rfrence sur un autre objet, ce dernier
ne sera pas charg en mmoire, si on dsire que le comportement de
base soit diffrent, il faut lexpliciter.
static mapping = {
books lazy:false
}

Modlisation - Mapping
69

Proprit mapping

Les comportements comme les transactions et les cascades SQL peuvent tre dfinies
dans ce bloc

static mapping = {
book lazy: false, cascade:"all,delete-orphan
}

Si lon dsire que la modification dun objet parent


affecte lobjet fils, on dois dfinir le fils comme
appartenant au parent (relation forte), si on ne dsire
pas dfinir dappartenance, il faut alors expliciter les
comportements
Sinon : Faisable la main

Modlisation - Mapping
70

Proprit
De

mapping

trs nombreuses adaptations sont possible, lire la documentation


si vous tes dans un cas particulier
http://grails.org/doc/latest/guide/GORM.html

Manipulation des objets


71

Requtes

sur une base de donne via GORM

Rcupration

par ID : Object.get(id)
Rcupration de tous les objets :

Object.list()
Object.getAll()

Requte

sur proprit :

Object.findByName(lenom)
Object.findAllByName(lenom)

Manipulation des objets


72

Manipulation des objets


73

Manipulation des objets


74

Sauvegarde
objectInstance.save()

Options :
Flush : quand dfini true , persiste lobjet immdiatement
Validate : valide la persistance de lobjet
Insert : force hibernate utiliser un INSERT(true) ou un UPDATE (false
failOnError : si la persistance echoue, une exception sera leve
(souvent utilis dans le bootstrap)
deepValidate : dfini si les objets fils doivent eux aussi tre valid

Manipulation des objets


75

Ajout
vehiculeInstance.addToRoues(new

Roue(..))

Suppression
objectInstance.delete()

Options :
Flush : quand dfini true , persiste lobjet immdiatement

vehiculeInstance.removeFromRoues(roueInstance)

Where Queries
76

Plus

flexible que les Dynamic Finders


Moins verbeux que les Critres
Toujours en deux temps
On

construit la requte
On excute la requte

Where Queries - Operateurs


77

Where Queries

Critres

==

eq

Egalit stricte

!=

ne

Diffrence

>

gt

Suprieur

<

lt

Infrieur

>=

ge

Suprieur ou gal

<=

le

Infrieur ou gal

In

inList

Est contenu dans la liste fournie

==~

like

Like SQL case sensitif

=~

ilike

Like SQL non case sensitif

Where Queries - Simple


78

Where Queries - Complexe


79

Utilisation des oprateurs de comparaison classique


Utilisation possible de regex avec les oprateurs ==~ et =~

Where Queries - Complexe


80

Utilisation

possible pour chercher sur un Range

Where Queries - Composition


81

Enchainement

illimit de requtes

Where Queries - Association


82

Requtes

possibles sur les associations

Where Queries Association groupes


83

Where Queries Association groupes


84

Where Queries Sous requtes


85

Utilisation

possible des sous requtes dans les where queries

Oprateur
Avg

Moyenne

Sum

Somme

Max

Valeur max

Min

Valeur min

Count

Compte des valeurs

Where Queries Sous requtes


86

Utilisation

possible des sous requtes dans les where queries

Where Queries Autres fonctions


87

De

nombreuses autres fonctions sont disponible

Fonction
Second

Cible la seconde dune proprit Date

Minute

Cible la minute dune proprit Date

Hour

Cible lheure dune proprit Date

Day

Cible le jour dune proprit Date

Month

Cible le mois dune proprit Date

Year

Cible lanne dune proprit Date

Where Queries Autres fonctions


88

De

nombreuses autres fonctions sont disponible

Fonction
Lower

Convertis une String en minuscules

Upper

Convertis une String en majuscules

Length

Renvoi la longueur dune String

Trim

Renvoi une version Trim dune String

Where Queries Autres fonctions


89

De

nombreuses autres fonctions sont disponible

Critres
90

Mode

de requte permettant de construire des requtes


complexes
Permets une trs grande libert au prix dune syntaxe plus
verbeuse
Si une requte ne peux tre formule via les Critres il
faudra la faire via HQL ou directement en SQL

Critres
91

Conclusion
92

93

Cration dun projet


Plateforme de Tagging

Cration du modle (POI)


94

Attributs

de base
Golocalisation
Dates
Flags
Relations

Cration du modle (POI)


95

Contraintes

Mapping

classiques

Cration du modle (Groupe)


96

Cration du modle (Commentaire)


97

Cration du modle (FileContainer)


98

Donnes dinitialisation
99

Via

le fichier Boostrap.groovy

Dans

On

grails-app/conf

cre les entits matres en premier


Puis les entits qui dpendent de celles-ci

Donnes dinitialisation (Bootstrap)


100

Donnes dinitialisation (UserService)


101

Donnes dinitialisation (Bootstrap - suite)


102

Scaffolding
103

Controller
Views

Tests

Documentation
104

La

documentation officielle sera votre premire source


dinformation.
http://grails.org/doc/latest/guide/index.html

Plugins
http://grails.org/plugins/

Google
Forums

dentraide

Merci vous !
105

Nhsitez

pas me contacter pout toute demande


dinformations :
Grgory

Galli
E-mail : greg.galli@tokidev.fr
Site Web : www.tokidev.fr
Bonne

continuation tous !

Vous aimerez peut-être aussi