38
Conception d'Applications Interactives : Applications Web et JEE Séance #5 Scala / Play! Framework

Enib cours c.a.i. web - séance #5 : scala play! framework

Embed Size (px)

Citation preview

Page 1: Enib   cours c.a.i. web - séance #5 : scala play! framework

Conception d'Applications Interactives :

Applications Web et JEESéance #5

Scala / Play! Framework

Page 2: Enib   cours c.a.i. web - séance #5 : scala play! framework

Langages alternatives pour la JVM

Page 3: Enib   cours c.a.i. web - séance #5 : scala play! framework

Langages alternatives pour la JVM

Java ≠ JVM● Java : Langage qui compile vers du bytecode● JVM : Machine virtuelle qui exécute du bytecode

Page 4: Enib   cours c.a.i. web - séance #5 : scala play! framework

La JVM en tant que plate-forme

● Build once, run everywhere○ Des implémentations de JVM pour la plupart du

hardware et OS○ Bytecode format pivot indépendant de la plate-forme

● Tendance à s'affranchir de l'OS○ Côté client : navigateur comme plate-forme○ Côté serveur : JVM comme plate-forme

Page 5: Enib   cours c.a.i. web - séance #5 : scala play! framework

Pourquoi des nouveaux langages

If all you have is a hammer, everything looks like a nail

Java est un très bon langage généraliste, mais pas la solution ultime● Scripting ?● Programmation fonctionnelle ?● Simplification et réduction du boilerplate ?

Page 6: Enib   cours c.a.i. web - séance #5 : scala play! framework

Pourquoi des nouveaux langages sur la JVM

● Le target est le bytecode○ Pas besoin d'implémenter la compilation vers le

format natif de chaque OS

● Profiter de l'écosystème Java○ Bibliothèques, serveurs, outils...○ Courbe d'adoption moins ardue

● Support pour langages à typage dynamique○ JSR 292, invokedynamic ○ Intégrée à la JVM depuis Java 1.7

Page 7: Enib   cours c.a.i. web - séance #5 : scala play! framework

Quels sont ces langages ?

● Des langages nouveaux :○ Clojure, Groovy, Scala, Ceylon, Kotlin...

● Des implémentations d'autres langages○ JRuby (Ruby), Jython (Python), Rhino (JS), Elastic

COBOL (Cobol), JGNAT (Ada), Luaj (Lua)...

Page 8: Enib   cours c.a.i. web - séance #5 : scala play! framework

Jython

Interprète Python écrit en Java, créé en 1997

● Compilation de code Python en bytecode● Héritage de classes Java par des classes Python● Scripting de code Python dans un programme Java ● Utilisation d'objets Java dans du code Python

Très utilisé pour prototypage, scripting et exploration des classes Java

http://www.jython.org/

Page 9: Enib   cours c.a.i. web - séance #5 : scala play! framework

JRuby

Interprète Ruby écrit en Java, créé en 2001

● Equivalente de Jython pout Ruby● Capable de faire tourner Rails● Plus rapide que l'implémentation de

référence○ Option JIT

http://www.jruby.org/

Page 10: Enib   cours c.a.i. web - séance #5 : scala play! framework

Groovy

Langage de POO destiné à la plate-forme Java● Inspiré de Python, Ruby et Smalltalk● Syntaxe très proche de Java● Compilé

○ soit à la volée dynamiquement○ soit classiquement vers bytecode

● Typages statique et dynamique● Support natif pour listes, maps, et expressions

régulières ● Fermetures ou clôtures (closures)● Surcharge des opérateurs

http://groovy.codehaus.org/

Page 11: Enib   cours c.a.i. web - séance #5 : scala play! framework

Ceylon

Nouveau langage pour la JVM par RedHat● "Java tel qu'ils serait si il avait été développé

aujourd'hui"● Typage statique

○ Types union et intersection● Syntaxe régulière

○ Sucre syntactique ajouté● Modulaire

○ Dépôt Ceylon Herd

http://www.ceylon-lang.org/

Page 12: Enib   cours c.a.i. web - séance #5 : scala play! framework

Scala

Langage de programmation multi-paradigme○ Programmations orientée objet et fonctionnelle

● Typage statique, syntaxe concise● Compilé vers bytecode● Intéropérabilité avec le code Java

http://www.scala-lang.org/

Page 13: Enib   cours c.a.i. web - séance #5 : scala play! framework

Le développeur multi-lingue

● Environnement JVM en mouvement continu○ Nouveaux langages○ Nouveaux frameworks○ Nouveaux outils

● Ne pas se tenir à jour, ne pas apprendre = stagner, régresser.○ Un nouveau langage par an○ Un nouveau framework tous les 3 mois

Page 14: Enib   cours c.a.i. web - séance #5 : scala play! framework

Introduction à Scala

Page 15: Enib   cours c.a.i. web - séance #5 : scala play! framework

Scala

Langage de programmation multi-paradigme○ Programmations orientée objet et fonctionnelle

● Typage statique, syntaxe concise● Compilé vers bytecode● Intéropérabilité avec le code Java

http://www.scala-lang.org/

Page 16: Enib   cours c.a.i. web - séance #5 : scala play! framework

La console REPL

REPL : Read Event Print Loop

● Console intéractive pour l'interprétation de Scala

horacio@horacio-laptop:$ scalaWelcome to Scala version 2.10.0-RC3 (Java HotSpot(TM) Server VM, Java 1.6.0_31).Type in expressions to have them evaluated.Type :help for more information.

scala> val revolution : Int = 1789revolution: Int = 1789

scala>

Page 17: Enib   cours c.a.i. web - séance #5 : scala play! framework

val et var

● var : variables (mutables)● val : valeurs (constantes, inmutables)

scala> val revolution : Int = 1789revolution: Int = 1789

scala> revolution = 1917<console>:8: error: reassignment to val revolution = 1917 ^scala> var variable : String = "Ma variable"variable: String = Ma variable

scala> variable = "Notre variable"variable: String = Notre variable

scala>

Page 18: Enib   cours c.a.i. web - séance #5 : scala play! framework

Classes

● Pas besoin de déclarer les attributs privés et les getters et setters○ Le constructeur suffit

● Constructeur avec des valeurs par défautscala> case class Employee( name:String="guest", age:Int=30, company:String = "DevCode" )defined class Employee

scala> val guest = Employee()guest: Employee = Employee(guest,30,DevCode)

scala> val guestAge = guest.ageguestAge: Int = 30

scala>

Page 19: Enib   cours c.a.i. web - séance #5 : scala play! framework

Classes

● Définition explicite des paramètres lors des appels aux méthodes

● Méthode copy pour créer des copies des objets

scala> case class Employee( name:String="guest", age:Int=30, company:String = "DevCode" )defined class Employee

scala> val luke = Employee("Luke", company="LucasArt")luke: Employee = Employee(Luke,30,LucasArt)

scala> val yoda = luke.copy("Yoda", age=800)yoda: Employee = Employee(Yoda,800,LucasArt)

scala>

Page 20: Enib   cours c.a.i. web - séance #5 : scala play! framework

Collections

scala> val numbers = List(1,2,3)numbers: List[Int] = List(1, 2, 3)

scala> for (n <- numbers) println("Number "+n)Number 1Number 2Number 3

scala>

● Les listes et les maps sont des types natifs○ Immuables par défaut

● Simplification des génériques Java○ Inférence des types

Page 21: Enib   cours c.a.i. web - séance #5 : scala play! framework

● Le for est "très Java"○ Façon Scala : Utiliser des fonctions

Collections

scala> val numbers = List(1,2,3)numbers: List[Int] = List(1, 2, 3)

scala> numbers.foreach { n:Int => // Enter to continue on the next line | println("Number "+n) | }Number 1Number 2Number 3

scala>

functionName { input => body

}

Page 22: Enib   cours c.a.i. web - séance #5 : scala play! framework

● D'autres exemples des fonctions sur des listes

Collections

scala> val reversedList = numbers.reversereversedList: List[Int] = List(3, 2, 1)

scala> val numbersLessThan3 = numbers.filter { n => n < 3 }numbersLessThan3: List[Int] = List(1, 2)

scala> val oddNumbers = numbers.filterNot { n => n % 2 == 0 }oddNumbers: List[Int] = List(1, 3)

scala> val higherNumbers = numbers.map { n => n + 10 }higherNumbers: List[Int] = List(11, 12, 13)

scala> val sumOfNumbers = numbers.foldLeft(0) { (total,element) => | total + element | }sumOfNumbers: Int = 6

scala> val sumOfNumbers = numbers.sumsumOfNumbers: Int = 6

scala> val higherNumbers = numbers.map(_+10)higherNumbers: List[Int] = List(11, 12, 13)

scala>

Page 23: Enib   cours c.a.i. web - séance #5 : scala play! framework

Comment apprendre Scala ?

Je ne vais pas passer une heure à vos passer des slides● Méthode peu éfficace

Tentons quelque chose de nouveau● Approche pratique

Essayons les Scala Koans !

Scala Koans ? Kesaco ?

Page 24: Enib   cours c.a.i. web - séance #5 : scala play! framework

Koans

Une nouvelle façon d'apprendre un langage● Des petits cas pratiques

○ Sous la forme de suites de tests unitaires● Chaque cas orienté pour un concept

○ Et un ensemble de tests qui ne passent pas● Objectif : réparer les tests pour qu'ils

passent○ Et apprendre le langage en passant

Méthode d'apprentissage différente et éfficace !

Page 25: Enib   cours c.a.i. web - séance #5 : scala play! framework

Scala Koans : Learn Scala with the Koans

http://www.scalakoans.org/

Page 26: Enib   cours c.a.i. web - séance #5 : scala play! framework

Scala Koans

1. Telecharger le .zip sur http://www.scalakoans.org/ 2. Extraire tout et exécuter le fichier ./sbt 3. Compiler les tests avec :

> test:compile

4. Exécuter tous les koans avec :> ~test-only org.functionalkoans.forscala.Koans

ouExécuter un koan en concret :> ~test-only org.functionalkoans.forscala.AboutAsserts

5. Ouvrir le fichier source du koan, l'éditer et voir si ça passe

Page 27: Enib   cours c.a.i. web - séance #5 : scala play! framework

C'est l'heure des Scala Koans !

Page 28: Enib   cours c.a.i. web - séance #5 : scala play! framework

Play! Framework

Play 2.0, a Web framework for a new era

Page 29: Enib   cours c.a.i. web - séance #5 : scala play! framework

Le projet Play!

Play! est un framework pour ● faire du développement web● avec une haute productivité● avec l'état de l'art des technologies web● sur la JVM

Page 30: Enib   cours c.a.i. web - séance #5 : scala play! framework

Play! : productivité et plaisir

● Conçu par des développeurs web pour des développeurs web

● Gestion simple, flexible et puissante du protocole HTTP○ Framework web -> HTTP au centre○ Stateless, request-response

● Facilité de démarrage○ Courbe d'apprentissage douce

● Rapidité et simplicité : change le code et recharge la page !

● Framework complet, full-stack

Page 31: Enib   cours c.a.i. web - séance #5 : scala play! framework

Play! : pas un jouet

● Modèle de programmation HTTP asynchrone● Architecture scalable de haute performance● Modèle reactive, non bloquant● Typage fort

Page 32: Enib   cours c.a.i. web - séance #5 : scala play! framework

Suivons le web !When a web framework starts an architecture fight

with the web, the framework loses.

● PHP et Ruby on Rails l'ont bien compris ○ Si on fait du web, on s'adapte au web !

● Exemples : session, bouton back...

● Play! a une architecture stateless basé sur HTTP

Page 33: Enib   cours c.a.i. web - séance #5 : scala play! framework

Modifiez, rechargez, c'est fait !

● Devoir redémarrer le serveur après une modif ?● Redéployer car on a changé un fichier ?

● A nouveau, regardons PHP ou Ruby on Rails○ Si on fait du web, on s'adapte au web !

● Avec Play! il suffit de recharger la page et la modif est prise en compte○ Ca, c'est de la productivité !

Page 34: Enib   cours c.a.i. web - séance #5 : scala play! framework

Play! ne se bat pas contre le web● Des URL à ralonge avec des paramètres techniques ?

C'est pas du web, ça !

● Play! utilise HTTP comme protocole, avec sa semantique○ il ne cherche pas à faire son meta-protocole au dessus

Page 35: Enib   cours c.a.i. web - séance #5 : scala play! framework

Le web a évolué

● On est au bord d'une nouvelle évolution :○ Les requêtes asynchrones en temps réel○ Des énormes flux de données○ Les BDD non relationnelles

● Les frameworks classiques ont du mal à s'adapter

Page 36: Enib   cours c.a.i. web - séance #5 : scala play! framework

Les limites des frameworks classiques

● Chaque utilisateur connecté consomme des ressources○ Mémoire, threads...

● Modèles basés sur l'attente active○ Synchronisme entre requête et réponse○ On bloque un thread côté serveur

● Les I/O sont bloquantes

Page 37: Enib   cours c.a.i. web - séance #5 : scala play! framework

Play! utilise un modèle réactif

● Inversion de contrôle○ On agit que lorsqu'on a quelque chose à faire

● Sans perte de contrôle○ Mais on est capable de garder le contrôle

● Iteratee/Enumerator IO

Page 38: Enib   cours c.a.i. web - séance #5 : scala play! framework

Play! Framework

Voici une petite démo