3. Auteur : Benoît Simard – Licence : Creative Commons BY-NC-SA.
Historique
2007 Créé par Guillaume Bort
2008 Framework Open Source
2009 Version 1.0 en octobre
2010 Version 1.0.1 en janvier
2011 Version 1.1 en octobre
4. Auteur : Benoît Simard – Licence : Creative Commons BY-NC-SA.
Un tour d'horizon
Pas de compilation
Respecte le protocole HTTP
RESTFull
Stateless
Système de templating simple
Groovy
Framework MVC
Rapide (exécution & développement)
Extensible par des modules
Pure JAVA !!!
5. Auteur : Benoît Simard – Licence : Creative Commons BY-NC-SA.
La communauté
Twitter
http://twitter.com/playframework
~ 1600 followers
~ 500 tweets
Google group
http://groups.google.com/group/play-framework
~ 15000 messages
~ 1300 membres
~ 40 messages / jour
Github
http://github.com/playframework/play
~ 120 watchers
6. Auteur : Benoît Simard – Licence : Creative Commons BY-NC-SA.
Pourquoi un nouveau
framework web en Java
7. Auteur : Benoît Simard – Licence : Creative Commons BY-NC-SA.
Pourquoi un nouveau
web framework java
Alors qu'il existe déjà
JSF
Struts
Spring MVC
Wicket
...
8. Auteur : Benoît Simard – Licence : Creative Commons BY-NC-SA.
Pourquoi un nouveau
web framework java
« Java web frameworks are
created by java developpers, not
Web developpers »
« Java developpers are building
Java applications, not web
applications »
9. Auteur : Benoît Simard – Licence : Creative Commons BY-NC-SA.
Pourquoi un nouveau
web framework java
Web VS middleware
La complexité en Java est culturelle
Interfaces
Abstraction
RMI
EJB
SOAP
10. Auteur : Benoît Simard – Licence : Creative Commons BY-NC-SA.
Pourquoi un nouveau
web framework java
WEB
=
REST
11. Auteur : Benoît Simard – Licence : Creative Commons BY-NC-SA.
Pourquoi un nouveau
web framework java
« Play ! Framework is the first
reasonable Java web framework I
have personnaly seen»
Bret Taylor
15. Auteur : Benoît Simard – Licence : Creative Commons BY-NC-SA.
Les fonctionnalités
Module de sécurité
CRUD
Validation
Jobs asynchrones
I18n
Tests (unitaire & selenium)
L'envoie de mail
Webservices
RESTFull services
16. Auteur : Benoît Simard – Licence : Creative Commons BY-NC-SA.
Les fonctionnalités
Et avec les modules :
OpenID, CAS
Export en PDF
Export Excel
Rendre les CSS dynamiques
Minifier
Recherche
…
http://www.playframework.org/modules
17. Auteur : Benoît Simard – Licence : Creative Commons BY-NC-SA.
Les fonctionnalités
Play! est compatible avec toutes les librairies
Java.
Play ! Intègre déjà :
Hibernate
Google Gson
Commons (fileupload, httpclient, email, logging …)
EhCache
...
22. Auteur : Benoît Simard – Licence : Creative Commons BY-NC-SA.
Le fichier de configuration
Configuration
De la base de données
Du logger
Du cache
Du serveur SMTP
Des modules
System settings
24. Auteur : Benoît Simard – Licence : Creative Commons BY-NC-SA.
Le fichier de configuration
Mais comment on fait pour tous travailler
avec le même fichier de configuration,
alors que nos environnements ne sont pas
identique ?
play id
25. Auteur : Benoît Simard – Licence : Creative Commons BY-NC-SA.
A la découverte de play ! :
Le Model
26. Auteur : Benoît Simard – Licence : Creative Commons BY-NC-SA.
Le model
Définition en JPA
Beaucoup d'annotation ! Que ce soit pour le
mapping avec la base de données ou pour la
structure / validation des champs
– @Entity
– @OneToMany
– @Column
– … (pour la validation nous verrons plus loin)
Doit étendre de la classe « Model »
28. Auteur : Benoît Simard – Licence : Creative Commons BY-NC-SA.
Le model
Tout est public ! Il n'y a pas de getter/setter
Play : génère les getters/setters au runtime
Vous pouvez surcharger les getters/setters
29. Auteur : Benoît Simard – Licence : Creative Commons BY-NC-SA.
Le model
La classe « Model » est un Helper
30. Auteur : Benoît Simard – Licence : Creative Commons BY-NC-SA.
Le model
Import / Export de la base en YML
Import natif dans play
Export avec le module YML(version 1.0)
– http://github.com/sim51/logisima-play-yml
31. Auteur : Benoît Simard – Licence : Creative Commons BY-NC-SA.
A la découverte de play! :
Les controllers
32. Auteur : Benoît Simard – Licence : Creative Commons BY-NC-SA.
Les controllers
Doit étendre la classe « Controller »
Possède que des méthodes public static void
Une méthode est appelée selon une route
Un controller donne accès à plusieurs méthode de rendu
Json
Xml
Pdf
…
On peut chainer les actions
Redirection
En appelant directement la méthode : Application.index()
34. Auteur : Benoît Simard – Licence : Creative Commons BY-NC-SA.
Les controllers
Les paramètres d'entrées des Controlleurs
Ce sont les variables en GET / POST / DELETE /
PUT
Les GET peuvent être défini dans le fichier de routes
Il n'y pas que des types simples, on peut y mettre
des objets de notre model. Ces objets seront créée
via les paramètres de la request. Exemple :
– resto.name
– resto.url
– ...
35. Auteur : Benoît Simard – Licence : Creative Commons BY-NC-SA.
Les controllers
Les paramètres de sorties des controlleurs
Il suffit d'ajouter les objets à la méthode render
exemple :
– render("Public/resto/show.html", resto, randomID) ;
Ou d'appeler la méthode renderArgs
– renderArgs.put(« resto », resto);
Sinon, il y a les différents scopes
36. Auteur : Benoît Simard – Licence : Creative Commons BY-NC-SA.
Les scopes
Application
Session
Stocké dans un cookie sécurisé et accéssible durant toute la
session de l'utilisateur (4Kb).
Flash
Stocké dans un cookie sécurisé et uniquement accessible par la
prochaine requête (4Kb).
Request
Pour tout le reste, il y a le cache !
37. Auteur : Benoît Simard – Licence : Creative Commons BY-NC-SA.
Les controllers
Les fichiers de rendu
Par défaut Play! cherche le fichier suivant :
– app/views/[Classe Name]/[Methode Name].html
– app/views/Application/index.html
Mais on peut spécifier un fichier
– render("Public/resto/show.html", resto);
38. Auteur : Benoît Simard – Licence : Creative Commons BY-NC-SA.
Les controllers
C'est bien beau de ne plus
avoir la « servlet-api »,
mais comment je fais pour faire
un filtre ?
39. Auteur : Benoît Simard – Licence : Creative Commons BY-NC-SA.
Les controllers
Il existe les intercepteurs !
@Before
– Exécute la méthode annotée avant chaque action du Controller.
On peut exclure certaine action (unless={« login », « logout »}), ou
définir seulement quelques actions (only={« login », « logout »})
@After
– Exécute la méthode annotée s'exécute après chaque action du
Controller.
40. Auteur : Benoît Simard – Licence : Creative Commons BY-NC-SA.
Les controllers
@Finally
– Exécute la méthode annotée après chaque résultat d'action du
Controller.
@With
– Permet de déléguer les intercepteur à une classe.
Les intercepteurs s'appliquent même aux sous-classes !
41. Auteur : Benoît Simard – Licence : Creative Commons BY-NC-SA.
A la découverte de play! :
Les templates
42. Auteur : Benoît Simard – Licence : Creative Commons BY-NC-SA.
Les templates
La Syntax
Expressions : ${ … }
– Permet d'afficher une variable: ${resto.name}
Messages : &{ … }
– I18N. Affiche la valeur correspondant à la clef (définie
dans le fichier conf/messages)
Actions (reverse Route):
– @{ …} : génère l'URI de l'action :
@{Application.index()}
– @@{ …} : génère une URL absolue
Commentaires : *{ … }*
Scripts : %{ … }%
43. Auteur : Benoît Simard – Licence : Creative Commons BY-NC-SA.
Les templates
Les décorateurs
Fichier html de template parent
Un template hérite du décorateur
#{get /}, #{set /}, #{extend /} & #{doLayout /}
44. Auteur : Benoît Simard – Licence : Creative Commons BY-NC-SA.
Les templates
Les Tags : #{tagName /}
Un tag est un fragment de HTML qui peut être
appelé avec des paramètres.
Un tag correspond à un fichier devant absolument se
trouver dans le répertoire « app/views/tags », et le
nom du tag correspond au nom du fichier.
Les paramètres passés au tag sont accessibles
dans le tag via _[le nom de mon paramètre]
45. Auteur : Benoît Simard – Licence : Creative Commons BY-NC-SA.
Les templates
Les Tags : #{tagName /}
Exemple d'appel :
Le fichier article.html :
46. Auteur : Benoît Simard – Licence : Creative Commons BY-NC-SA.
Les templates
Les extensions
Certaines méthodes sont ajoutés au objets dans les templates :
– Date|format() : pour formater une date : ${myDate.format('dd
MMMM yyyy hh:mm:ss')}
– String|escapeHtlm() : pour échapper le code html
– String|nl2br() : remplace les sauts de ligne par des <br/>
– String|raw() : pour ne pas échapper le code html.
– …
Il est à noter que Play ! échappe automatiquement tous les textes.
http://www.playframework.org/documentation/1.1/javaextensions
47. Auteur : Benoît Simard – Licence : Creative Commons BY-NC-SA.
Les templates
Les extensions personnalisées
Il est possible de créer ses propres extensions !
Il suffit de créer une classe
– qui étend de JavaExtensions
– Contenant des méthodes public static
48. Auteur : Benoît Simard – Licence : Creative Commons BY-NC-SA.
A la découverte de play! :
Les jobs
49. Auteur : Benoît Simard – Licence : Creative Commons BY-NC-SA.
Les Jobs
Doit étendre la classe « Job »
@Every(«1d»)
@On(«0 0 12 * * *)
– CRON expression
@OnApplicationStart
52. Auteur : Benoît Simard – Licence : Creative Commons BY-NC-SA.
La validation
3 façons de valider une requête :
Directement dans le controller en appelant la
méthode « validation ».
En ajoutant les annotations dans la déclaration des
paramètres de la méthode.
Dans le POJO en ajoutant les annotations, et en
ajoutant @valid dans la déclaration du pojo comme
paramètre de la méthode.
57. Auteur : Benoît Simard – Licence : Creative Commons BY-NC-SA.
La validation
Les validateurs :
Email : vérifie que le champ est une adresse mail
– validation.email(mail)
– @Email String mail
Equals : vérifie que le champ est égale à un autre (ex : password
confirmation)
– validation.equals(password, passwordConfirmation)
– @Equals(« passwordConfirmation ») String password
Future : vérifie que la date est dans le future (en fonction de la date du jour
ou de la date de référence passée en paramètre)
– validation.future(maDate) | validation.future(maDate, « 1971-12-31 »)
– @InFuture String maDate / @InFuture(« 1971-12-31 ») String maDate
58. Auteur : Benoît Simard – Licence : Creative Commons BY-NC-SA.
La validation
Les validateurs :
IsTrue : vérifie que le champs est à « true » (String ,Boolean ou
Number)
– validation.isTrue(agree)
– @IsTrue String agree
Match : Le champ valide la regex
– validation.match(abbreviation, "[A-Z]{3}")
– @Match("[A-Z]{3}") String abbreviation
Max : Vérifie que le champ n'est pas plus grand que la valeur
spécifiée (Number et String)
– validation.max(wordCount, 7500)
– @Max(7500) String wordCount
59. Auteur : Benoît Simard – Licence : Creative Commons BY-NC-SA.
La validation
Les validateurs :
MaxSize : taille maximum du String
– validation.maxSize(url, 2083) ;
– @MaxSize(2083) String value
Min : Vérifie que le champ est plus grand que la valeur spécifiée
(Number et String)
– validation.min(age, 18) ;
– @Min(18) Long age
MinSize : taille minimum du String
– validation.minSize(value, 42) ;
– @MinSize(42) String value
60. Auteur : Benoît Simard – Licence : Creative Commons BY-NC-SA.
La validation
Les validateurs :
Past : vérifie que la date est dans le passé (en fonction de la date du jour ou de la
date de référence passée en paramètre)
– validation.past(actualDepartureDate) ; / validation.past(expectedDepartureDate,
expectedArrivalDate);
– @Past String actualDepartureDate / @Past("1980-01-01") String birthDate
Range : min & max
– validation.range(wordCount, 17500, 40000) ;
– @Range(min = 17500, max = 40000) String wordCount
Required : le champ est obligatorie
– validation.required(value) ;
– @Required String value
Url : vérifie que le champ est une url valide
– @URL String address