avril
2008
Dans ce billet, je montrias déjà comment intégrer Scala dans un projet Web eclipse, et comment créer sa première Servlet en Scala.
Dans ce billet, je vais montrer comment faire du Wicket avec Scala, ce qui inclut:
=> Création d’un projet web dynamique dans eclipse
=> Ajout du support Scala (vu dans un billet précédent)
=> Créer une application Wicket avec Scala
=> Créer une page Wicket avec Scala
=> Et comme bonus, comment profiter de la puissance du langage Scala pour alléger l’écriture des pages Wicket.
Je commence par l’application Wicket. en Java, ça aurait donné ça:
Je vais la traduire vers Scala, ce qui donne:
Pas très différent en structure, mais différents dans les constructions utilisées.
Je passes maintenant à la création d’une page. Ce serait une page simple qui ne fait qu’afficher la date courante.
Version Java:
Traduction en Scala:
La même structure, juste que c’est plus malléable en Scala: pas de points virgules, pas de parenthèses, pas de points, etc.
De là, on peut déjà lancer l’application Web et vérifier que ça marche très bien (avec les version Scala).
Seulement, garder la chose ainsi (traduction directe du code Java vers Scala) ne servirait pas à grand chose …
Essayons alors de profiter de la puissance de Scala !
Je vais commencer par cette histoire de modèles de Wicket, qui oblige à passer par des classes internes et/ou anonymes, ce qui est super moche il faut avouer.
Pour m’en débarasser, la solution directe est de passer par les closures, ou les fonctions dans la terminologie Scala.
Je vais donc définir une classe SModel (pour Scala Model) qui hérite de Model et qui prend une fonction sans paramètres et retournant un Object comme argument à son constructeur, et qui redéfinit la méthode getObject du Model pour qu’elle retourne le résultat d’invoquation de la fonction.
Ceci donne:
C’est déjà plus beau et plus leger que l’ancienne version, mais ça peut encore être amélioré !
En effet, le SModel comme vous le remarquez est juste une enveloppe, et ce qui est utile est en fait la fonction qu’on lui passe … alors, débarassons nous de l’enveloppe !
Pour ce faire, je passe par les fonctions implicites de Scala, qui permettent de convertir d’un type à un autre, implicitement, sans avoir à le spécifier explicitement.
Il suffit de définir une fonction implicite qui convertit une fonction vers un SModel pour que le tour soit joué.
Voici ce que ça donne:
Là, il suffit juste de passer la fonction au lieu d’un model … impressionnant si vous voulez mon avis
Pour finir, je tiens à signaler que je me suis grandement inspiré des reflexions de Nathan Hamblen sur Scala et Wicket.