Le framework Grails offre depuis sa version 0.6 un support des flots Web (voir Grails Web Flow), en s'appuyant sur le projet Spring Web Flow.
L'utilisation d'un flot web s'avère nécessaire si vous définissez pour votre application web, un ensemble d'étapes déterminées et des règles régissant les transitions entre ces étapes.
Chaque exécution d'un flot possède un contexte qui permet de conserver des informations relatives à cette exécution.
Un exemple classique est le passage d'une commande en plusieurs étapes sur un site marchand.
Le framework Grails facilite largement la définition de flots web, car au lieu de définir un flot au moyen d'un document XML, comme c'est le cas avec le framework Spring Web Flow, vous le définissez en utilisant un builder Groovy particulier (pour en savoir plus sur les builders Groovy, suivez ce lien).
Un flot web s'implémente dans une action d'une classe Grails de type Controller et, par convention, le nom de cette action doit se terminer par Flow.
Voyons comment écrire une version web du jeu du nombre mystérieux dans un flow web Grails. Faut-il rappeler le principe de ce jeu, qui consiste à trouver un nombre déterminé aléatoirement par la machine, et que vous devez trouver en un minimum de tentatives ?
Voici un diagramme, assez proche d'un diagramme d'activité UML, décrivant les états et les transitions de notre flot nombreMysterieux :
Retrouver le code source de cet article dans le fichier attaché à celui-ci. Vous y trouverez le fichier JeuxController.groovy contenant le code la classe JeuxController dont l'action nombreMysterieuxFlow impléme le flot web de notre jeu.
Dans un flot web, un état peut être lié à une vue, comme c'est la cas des états presentation, jouer et felicitations. Ces états sont associés, par convention, aux vues GSP portant des noms correspondants.
Ces fichiers .GSP sont placés dans le répertoire views/jeux/nombreMysterieux de l'application Grails ; jeux est le répertoire lié au Controller JeuxController, et nombreMysterieux est réservé au flot web nombreMysterieuxFlow.
L'état presentation conduit simplement à l'affichage de la page presentation.gsp contenant un lien menant à l'état jouer par la transition commencer.
L'état jouer affiche la vue jouer.gsp contenant un formulaire web qui permet à l'utilisateur de soumettre sa proposition de nombre. Puis, c'est dans l'état tester que s'effectue les tests conduisant soit au passage à l'état felicitations, en cas de découverte du nombre mystérieux, soit au passage à l'état erreurSaisie, car une erreur de saisie est toujours possible.
Pour terminer, voici le code de la classe JeuxController :
private static int LIMITE = 100
def defaultAction = "nombreMysterieux"
def nombreMysterieuxFlow = {
presentation {
on("commencer") {
flow.solution = new Random().nextInt(LIMITE) + 1
flow.borneInf = 1
flow.borneSup = LIMITE
flow.tentatives = 0
}.to "jouer"
}
jouer {
on("proposer").to "tester"
}
tester {
action {
// Tester la donnée saisie
// En appelant error() on reste dans l'état
def n = params.nombre.toInteger()
flow.tentatives++
if (n < flow.solution) {
flow.message = "C'est plus grand"
if (n > flow.borneInf) flow.borneInf = n
return error()
}
else if (n > flow.solution) {
flow.message = "C'est plus petit"
if (n < flow.borneSup) flow.borneSup = n
return error()
}
}
on("error").to "jouer"
on("success").to "felicitations"
on(Exception).to "erreurSaisie"
}
felicitations {
}
erreurSaisie {
action {
flow.message = 'erreur!'
}
on("success").to "jouer"
}
}
}
| Fichier attaché | Taille |
|---|---|
| GrailsWebFlow.zip | 2.44 Ko |