<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;DkcMQn08fyp7ImA9WhRaEEg.&quot;"><id>tag:blogger.com,1999:blog-1231386620637429487</id><updated>2012-02-12T14:41:23.377+01:00</updated><category term="AOP" /><category term="Mockito" /><category term="JPA" /><category term="GWT" /><category term="planetplay" /><category term="Lucene" /><category term="JUG" /><category term="Objectify" /><category term="QueryDSL" /><category term="UiBinder" /><category term="GWT Designer" /><category term="Musique" /><category term="Hibernate" /><category term="Kotlin" /><category term="ROO" /><category term="JAX-RS" /><category term="APP Engine" /><category term="ebook" /><category term="Hibernate Search" /><category term="Swing" /><category term="Scalate" /><category term="EJB" /><category term="Scala" /><category term="Jetty" /><category term="Wicket" /><category term="Grails" /><category term="CDI" /><category term="DDD" /><category term="Camel" /><category term="Spring" /><category term="Stateful" /><category term="Stateless" /><category term="JSON" /><category term="Android" /><category term="Jersey" /><category term="Cloud" /><category term="Play" /><category term="HTML5" /><category term="Heroku" /><category term="NeoDatis" /><category term="Mobile" /><category term="JVM" /><category term="jQuery" /><category term="IDEA" /><category term="Java EE" /><category term="WebSocket" /><category term="REST" /><category term="Livres" /><category term="Apprendre_Play" /><category term="Java FX" /><category term="NetBeans" /><category term="NoSQL" /><category term="Groovy" /><category term="Portlet" /><category term="iPhone" /><category term="Maven" /><category term="HS" /><category term="Eclipse" /><category term="Agilité" /><category term="Jetbrains" /><category term="Scalatra" /><category term="Glassfish" /><title type="text">CoffeeBean</title><subtitle type="html">Blog traitant des technologies Java</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://coffeebean.loicdescotte.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://coffeebean.loicdescotte.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Loïc Descotte</name><uri>http://www.blogger.com/profile/04087832203101001752</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_RfOlS-mqesc/Sri7_Inis3I/AAAAAAAABjo/64rI4AFXLRs/S220/n576917464_5655.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>103</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/blogspot/IUKF" /><feedburner:info uri="blogspot/iukf" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;D0YDSXk9cSp7ImA9WhRUF0s.&quot;"><id>tag:blogger.com,1999:blog-1231386620637429487.post-3299545204359391967</id><published>2012-01-28T15:42:00.001+01:00</published><updated>2012-01-28T16:39:38.769+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-28T16:39:38.769+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Play" /><category scheme="http://www.blogger.com/atom/ns#" term="JUG" /><title>Présentation Play au Togo JUG : les slides</title><content type="html">&lt;a href="http://k33g.github.com/"&gt;Philippe&lt;/a&gt; et moi avons eu le plaisir de faire une présentation sur Play Framework (en versions 1.x et 2.0) pour le Togo JUG ce matin.&lt;br /&gt;
&lt;br /&gt;
Les slides (présentation du framework, tutoriels...) sont disponibles ici : &lt;a href="http://3monkeys.github.com/prez.play/"&gt;http://3monkeys.github.com/prez.play/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note : pour les visionner il vaut mieux utiliser un navigateur sous WebKit, par exemple Chrome ou Safari.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1231386620637429487-3299545204359391967?l=coffeebean.loicdescotte.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/IUKF/~4/Q3X14F2UKGg" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://coffeebean.loicdescotte.com/2012/01/presentation-play-au-togo-jug-les.html#comment-form" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/3299545204359391967?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/3299545204359391967?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/IUKF/~3/Q3X14F2UKGg/presentation-play-au-togo-jug-les.html" title="Présentation Play au Togo JUG : les slides" /><author><name>Loïc Descotte</name><uri>http://www.blogger.com/profile/04087832203101001752</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_RfOlS-mqesc/Sri7_Inis3I/AAAAAAAABjo/64rI4AFXLRs/S220/n576917464_5655.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://coffeebean.loicdescotte.com/2012/01/presentation-play-au-togo-jug-les.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkcMQn0zeSp7ImA9WhRaEEg.&quot;"><id>tag:blogger.com,1999:blog-1231386620637429487.post-3254262590656367937</id><published>2011-12-25T11:50:00.001+01:00</published><updated>2012-02-12T14:41:23.381+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-12T14:41:23.381+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Scala" /><category scheme="http://www.blogger.com/atom/ns#" term="Scalatra" /><category scheme="http://www.blogger.com/atom/ns#" term="Scalate" /><title>Premiers pas avec Scalatra</title><content type="html">Scalatra est un framework Web ultra léger pour le langage Scala inspiré par Sinatra, un framework très populaire dans le monde Ruby.
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-vzAxLoQMZ18/Tvb0E0y7VKI/AAAAAAAADBA/I9RiutAx7ss/s1600/scalatra_logo.png" imageanchor="1"&gt;&lt;img border="0" height="92" src="http://3.bp.blogspot.com/-vzAxLoQMZ18/Tvb0E0y7VKI/AAAAAAAADBA/I9RiutAx7ss/s400/scalatra_logo.png" width="132" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
Scalatra privilégie une approche très simple basée sur les principes REST. Pour effectuer une action, on part d'une méthode HTTP et d'une route (URL d'accès à la fonction), auxquelles on ajoute le traitement désiré :

&lt;br /&gt;
&lt;pre class="java" name="code"&gt;get("/hello") {
    "hello!"
}
&lt;/pre&gt;

&lt;br /&gt;
Avec cette approche et la manipulation XML proposée en Scala, on peut déclarer et renvoyer du contenu comme ceci :
&lt;br /&gt;
&lt;pre class="java" name="code"&gt;get("/hello") {
  &amp;lt;html&amp;gt;
      &amp;lt;body&amp;gt;
        &amp;lt;h1&amp;gt;Hello!&amp;lt;/h1&amp;gt;
     &amp;lt;/body&amp;gt;
   &amp;lt;/html&amp;gt;
}
&lt;/pre&gt;
On peut facilement ajouter des paramètres dans l'URL : 
&lt;br /&gt;
&lt;pre class="java" name="code"&gt;get("/hello/:name") { 
    &amp;lt;html&amp;gt;
      &amp;lt;body&amp;gt;
        &amp;lt;h1&amp;gt;Hello {params("name")} !&amp;lt;/h1&amp;gt;
      &amp;lt;/body&amp;gt;
    &amp;lt;/html&amp;gt;
  }
&lt;/pre&gt;
Renvoyer du contenu XML (ou JSON ou ce qu'on veut) pour exposer un service REST :

&lt;br /&gt;
&lt;pre class="java" name="code"&gt;get("/persons"){
 contentType="application/xml"
 &amp;lt;xml&amp;gt;
     &amp;lt;persons&amp;gt;{
         Database.entries.map { 
                    entry =&amp;gt;  &amp;lt;person&amp;gt;{entry}&amp;lt;/person&amp;gt; 
                }
     }&amp;lt;/persons&amp;gt;
 &amp;lt;/xml&amp;gt; 
 }
&lt;/pre&gt;
Faire un POST pour enregistrer de nouvelles données :
&lt;br /&gt;
&lt;pre class="java" name="code"&gt;post("/person"){
 val name = params("name")
 Database.addEntry(name)
 redirect("/persons")
  }
&lt;/pre&gt;
Remarque : Pour tester la méthode ci-dessus, on peut par exemple utiliser curl en ligne de commande :

&lt;br /&gt;
&lt;pre class="java" name="code"&gt;curl for test: curl --data "name=jim" http://localhost:8080/person
&lt;/pre&gt;
&lt;br /&gt;
On peut aussi rediriger l'action vers un template :
&lt;br /&gt;
&lt;pre class="java" name="code"&gt; get("/hello2/:name") {
      templateEngine.layout("hello-scalate.scaml", Map("name" -&amp;gt; params("name")))
  }
&lt;/pre&gt;
Scalatra est livré par défaut avec le moteur de template Scalate, qui est compatible avec plusieurs formats de templates.

Voici un exemple avec le format scaml : 

&lt;br /&gt;
&lt;pre class="xml" name="code"&gt;//redefinition du titre dans le layout par défaut
- attributes("title") 
//paramètre de requête
-@ val name: String

%h1 Welcome!
%p Hello, how are you #{name} ?
&lt;/pre&gt;
Enfin, on peut définir les actions à effecter en cas d'erreur : 

&lt;br /&gt;
&lt;pre class="java" name="code"&gt;notFound {
    
      
        &lt;h1&gt;
Nothing found here&lt;/h1&gt;
&lt;img src="/images/404.jpg" /&gt;
      
    
  }
&lt;/pre&gt;
Le framework fonctionne avec l'outil de build SBT. Un support des WebSockets est proposé à travers la librairie Socket.IO.
En utilisant Jetty, le conteneur par défaut de Scalatra, on peut recharger le code à chaud (plus ou moins rapidement).

Pour cela on le démarre avec la commande suivante : 
&lt;br /&gt;
&lt;pre class="java" name="code"&gt; sbt
 &amp;gt; container:start
   &amp;gt; ~ aux-compile
&lt;/pre&gt;
Dans cet exemple, j'ai simulé à la base de données avec un "object" Scala. Un object est l'équivalent d'un singleton : c'est une classe qui possède une instance unique.

&lt;br /&gt;
&lt;pre class="java" name="code"&gt;object Database{
 //shared entries (simulate database)
 var entries = List("bob", "joe", "john") 
 def addEntry(name: String){
     entries = entries:+name
 }
}
&lt;/pre&gt;
On pourra facilement remplacer cette implémentation par une vraie base de données. Si vous n'avez pas besoin d'une base SQL (ce qui est en fait souvent le cas), vous pouvez regarder des choses plus simples comme la base de données objet &lt;a href="http://neodatis.wikidot.com/"&gt;NeoDatis&lt;/a&gt; qui supporte officiellement Scala. Pour des besoins de scalabilité plus importants, vous pouvez aussi jeter un oeil du côté de MongoDB et de Casbah (son toolkit Scala).
Avec ce genre d'outils vous conserverez une architecture simple, pas besoin de s'embêter avec des frameworks à la Spring, le langage apporte tout ce qu'il faut pour &lt;a href="http://jboner.github.com/2008/10/06/real-world-scala-dependency-injection-di.html"&gt;gérer l'injection de dépendance nativement&lt;/a&gt;.

Pour conclure, Scalatra nous prouve que contrairement aux idées reçues, on peut faire des choses extrêmement simples et efficaces en Scala avec des API bien pensées.
Si vous cherchez quelque chose s'en rapprochant et utilisant le langage Java, vous pouvez regarder du côté de &lt;a href="http://www.sparkjava.com/"&gt;Spark&lt;/a&gt;.&lt;br /&gt;
Et puis j'allais oublier, joyeux Noël à tous!&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.scalatra.org/"&gt;Site officiel de Scalatra&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1231386620637429487-3254262590656367937?l=coffeebean.loicdescotte.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/IUKF/~4/30yx2QgSebk" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://coffeebean.loicdescotte.com/2011/12/premiers-pas-avec-scalatra.html#comment-form" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/3254262590656367937?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/3254262590656367937?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/IUKF/~3/30yx2QgSebk/premiers-pas-avec-scalatra.html" title="Premiers pas avec Scalatra" /><author><name>Loïc Descotte</name><uri>http://www.blogger.com/profile/04087832203101001752</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_RfOlS-mqesc/Sri7_Inis3I/AAAAAAAABjo/64rI4AFXLRs/S220/n576917464_5655.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-vzAxLoQMZ18/Tvb0E0y7VKI/AAAAAAAADBA/I9RiutAx7ss/s72-c/scalatra_logo.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://coffeebean.loicdescotte.com/2011/12/premiers-pas-avec-scalatra.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUGRH88fSp7ImA9WhRSFE4.&quot;"><id>tag:blogger.com,1999:blog-1231386620637429487.post-1439490157246490642</id><published>2011-11-16T11:04:00.001+01:00</published><updated>2011-11-16T11:10:25.175+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-16T11:10:25.175+01:00</app:edited><title>Stateful VS Stateless : une mise en bouche du débat</title><content type="html">Philippe Charrière, Antoine Sabot-Durant et moi avons eu l’honneur d'être interviewés par les JDuchess pour présenter le sujet de la prochaine conférence du Lyon JUG : &lt;b&gt;Architecture stateful vs stateless &lt;/b&gt;(que nous animerons mardi prochain)&lt;br /&gt;
&lt;br /&gt;

Cette première partie du débat est &lt;a href="http://jduchess.org/duchess-france/blog/architecture-stateful-vs-stateless/"&gt;à lire ici&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1231386620637429487-1439490157246490642?l=coffeebean.loicdescotte.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/IUKF/~4/y4bqMRUVmVo" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://coffeebean.loicdescotte.com/2011/11/stateful-vs-stateless-une-mise-en.html#comment-form" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/1439490157246490642?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/1439490157246490642?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/IUKF/~3/y4bqMRUVmVo/stateful-vs-stateless-une-mise-en.html" title="Stateful VS Stateless : une mise en bouche du débat" /><author><name>Loïc Descotte</name><uri>http://www.blogger.com/profile/04087832203101001752</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_RfOlS-mqesc/Sri7_Inis3I/AAAAAAAABjo/64rI4AFXLRs/S220/n576917464_5655.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://coffeebean.loicdescotte.com/2011/11/stateful-vs-stateless-une-mise-en.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0EARnszfSp7ImA9WhRSEU8.&quot;"><id>tag:blogger.com,1999:blog-1231386620637429487.post-4614479794822910225</id><published>2011-11-12T19:03:00.001+01:00</published><updated>2011-11-12T19:14:07.585+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-12T19:14:07.585+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Play" /><category scheme="http://www.blogger.com/atom/ns#" term="EJB" /><category scheme="http://www.blogger.com/atom/ns#" term="Stateless" /><category scheme="http://www.blogger.com/atom/ns#" term="JUG" /><category scheme="http://www.blogger.com/atom/ns#" term="Stateful" /><category scheme="http://www.blogger.com/atom/ns#" term="CDI" /><title>Présentation Stateful VS Stateless au Lyon JUG le 22 Novembre</title><content type="html">Le mardi 22 Novembre j'aurai l'honneur d'animer une session sur le thème des architectures stateless avec &lt;a href="http://www.k33g.org/"&gt;Philippe Charrière&lt;/a&gt;. Nous présenterons ce concept à travers une démo basée sur Play Framework.&lt;br /&gt;
&lt;br /&gt;
Nous confronterons notre vision à celle d'&lt;a href="http://www.linkedin.com/profile/view?id=987946&amp;amp;authType=name&amp;amp;authToken=tEXR&amp;amp;locale=en_US&amp;amp;pvs=pp&amp;amp;trk=ppro_viewmore"&gt;Antoine Sabot-Durant&lt;/a&gt; qui présentera l'alternative stateful avec Java EE (CDI, EJB 3...).&lt;br /&gt;
&lt;br /&gt;
Pour vous inscrire à cette présentation, c'est ici : &lt;a href="http://www.lyonjug.org/evenements/architecture-stateful-vs-stateless"&gt;http://www.lyonjug.org/evenements/architecture-stateful-vs-stateless&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1231386620637429487-4614479794822910225?l=coffeebean.loicdescotte.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/IUKF/~4/kgbMq5AvAOA" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://coffeebean.loicdescotte.com/2011/11/presentation-stateful-vs-stateless-au.html#comment-form" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/4614479794822910225?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/4614479794822910225?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/IUKF/~3/kgbMq5AvAOA/presentation-stateful-vs-stateless-au.html" title="Présentation Stateful VS Stateless au Lyon JUG le 22 Novembre" /><author><name>Loïc Descotte</name><uri>http://www.blogger.com/profile/04087832203101001752</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_RfOlS-mqesc/Sri7_Inis3I/AAAAAAAABjo/64rI4AFXLRs/S220/n576917464_5655.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://coffeebean.loicdescotte.com/2011/11/presentation-stateful-vs-stateless-au.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0UGR3Y9eyp7ImA9WhdUGEQ.&quot;"><id>tag:blogger.com,1999:blog-1231386620637429487.post-8889797478385023514</id><published>2011-10-06T12:00:00.001+02:00</published><updated>2011-10-06T12:00:26.863+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-06T12:00:26.863+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Play" /><title>Un nouveau site pour Play.Rules!</title><content type="html">Mon coéquipier Philippe (aussi connu sous le pseudo &lt;a href="http://www.twitter.com/k33g_org"&gt;@k33g_org&lt;/a&gt;) vient de mettre en ligne un superbe site Web pour notre ebook Play.Rules!&lt;br /&gt;
&lt;br /&gt;
Ce site permet de consulter en ligne les différents chapitres.&lt;br /&gt;
Il nous servira aussi à publier les news concernant le livre et son avancement.&lt;br /&gt;
&lt;br /&gt;
Voici donc une URL à bookmarker ;) &lt;a href="http://3monkeys.github.com/play.rules/"&gt;http://3monkeys.github.com/play.rules/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est des nouveaux chapitres, on est pas mal occupés en ce moment mais du contenu supplémentaire ne devrait pas tarder à se montrer!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1231386620637429487-8889797478385023514?l=coffeebean.loicdescotte.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/IUKF/~4/3DAgRQfDBag" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://coffeebean.loicdescotte.com/2011/10/un-nouveau-site-pour-playrules.html#comment-form" title="2 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/8889797478385023514?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/8889797478385023514?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/IUKF/~3/3DAgRQfDBag/un-nouveau-site-pour-playrules.html" title="Un nouveau site pour Play.Rules!" /><author><name>Loïc Descotte</name><uri>http://www.blogger.com/profile/04087832203101001752</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_RfOlS-mqesc/Sri7_Inis3I/AAAAAAAABjo/64rI4AFXLRs/S220/n576917464_5655.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://coffeebean.loicdescotte.com/2011/10/un-nouveau-site-pour-playrules.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0MFRnk6cSp7ImA9WhdVGUs.&quot;"><id>tag:blogger.com,1999:blog-1231386620637429487.post-3540463336227996474</id><published>2011-09-25T18:33:00.000+02:00</published><updated>2011-09-25T18:50:17.719+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-25T18:50:17.719+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Play" /><category scheme="http://www.blogger.com/atom/ns#" term="Livres" /><title>Play Framework Cookbook</title><content type="html">J'ai eu la chance de recevoir un exemplaire gratuit du livre Play

Framework Cookbook de la part de Packt en échange d'une critique sur

ce blog. Je vais donc essayer de vous donner mon avis tout en restant le plus objectif possible.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://www.packtpub.com/sites/default/files/imagecache/productview/5528OS_Play%20Framework%20Cookbook_Frontcover.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://www.packtpub.com/sites/default/files/imagecache/productview/5528OS_Play%20Framework%20Cookbook_Frontcover.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Après un premier chapitre qui présente toutes les opérations courantes d’un projet Play (création de vues, modèles, routes, gestion de la session utilisateur...), le livre se focalise sur un ensemble d’astuces répondant à des cas concrets. On trouve par exemple des chapitres traitant de (au hasard et dans le désordre) :&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;la configuration des routes par annotations&amp;nbsp;&lt;/li&gt;
&lt;li&gt;le caching&amp;nbsp;&lt;/li&gt;
&lt;li&gt;la génération de fichiers PDF ou de graphiques avec Google Chart API&amp;nbsp;&lt;/li&gt;
&lt;li&gt;l’injection de beans Spring ou Guice&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
Le livre explique en détail les principes de la création de modules Play et donne des exemples d’utilisation de modules existants, comme la connexion à une base NoSQL à l’aide du module MongoDB.&lt;br /&gt;
Si on devait résumer le style d’écriture, ce serait “beaucoup de code et peu de blala”.&lt;br /&gt;
Pour chaque partie on retrouve les mêmes sections : &lt;i&gt;getting ready, how to do it, how it works, there is more.

&lt;/i&gt;&lt;br /&gt;
Cette structure permet de comprendre en détail le fonctionnement des différentes briques du framework. La dernière de ces 3 parties a un rôle d’ouverture, on y trouve des conseils pour améliorer notre code ou pour booster les perfs ainsi que des solutions alternatives en s’appuyant par exemple sur des librairies externes.&lt;br /&gt;
&lt;br /&gt;
Le livre ne s’arrête pas au développement d’une application Play. Il présente un certain nombre d’astuces pour la mise en production (comme la mise en place d’un load balancer), l’intégration continue (avec jenkins), la gestion des logs ou encore le paramétrage d’un repository de modules privé.&lt;br /&gt;
Vous l'aurez compris, il couvre donc un scope d’astuces assez large. 

Ce livre ne demande pas forcément une lecture linéaire : on peut facilement sauter des chapitres pour aller directement chercher l’exemple qui répondra à notre problème du moment.&lt;br /&gt;
&lt;br /&gt;
Si on devait trouver quelques petits manques ou défauts, aucune plateforme de cloud n’est présentée. Le livre a été écrit trop tôt pour parler du PaaS Heroku, cependant les modules CloudBees et Google APP Engine existent depuis un certain temps et auraient pu être abordés.

Pas de Scala non plus, mais il est vrai cela demanderait presque un deuxième livre, l’API Play Scala étant vraiment différente de la version Java (ceci devrait changer avec Play 2.0).&lt;br /&gt;
Enfin, le livre s'adresse plutôt aux personnes qui connaissent les bases de Play et qui veulent des recettes pour répondre a des problèmes précis. Cette démarche va assez loin puisque le livre comprend  même une partie dédiée à l’optimisation de byte code. En ce sens, le tutoriel YABE de la documentation officielle ou le livre Play.Rules (pub perso ;) seront sûrement  des pistes à privilégier pour les novices.&lt;br /&gt;
Cet ouvrage sera par contre une mine d’or pour les développeurs qui se lancent dans un projet “real life” et qui cherchent un vrai cookbook avec des techniques applicables au quotidien.

Et comme je suis sympa je vous offre &lt;a href="http://www.packtpub.com/sites/default/files/5528OS-Chapter-2-Using-Controllers.pdf?utm_source=packtpub&amp;amp;utm_medium=free&amp;amp;utm_campaign=pdf"&gt;un chapitre gratuit&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1231386620637429487-3540463336227996474?l=coffeebean.loicdescotte.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/IUKF/~4/fZjPYYXKRvE" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://coffeebean.loicdescotte.com/2011/09/play-framework-cookbook.html#comment-form" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/3540463336227996474?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/3540463336227996474?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/IUKF/~3/fZjPYYXKRvE/play-framework-cookbook.html" title="Play Framework Cookbook" /><author><name>Loïc Descotte</name><uri>http://www.blogger.com/profile/04087832203101001752</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_RfOlS-mqesc/Sri7_Inis3I/AAAAAAAABjo/64rI4AFXLRs/S220/n576917464_5655.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://coffeebean.loicdescotte.com/2011/09/play-framework-cookbook.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck8AQ30_eCp7ImA9WhdWF04.&quot;"><id>tag:blogger.com,1999:blog-1231386620637429487.post-6545668427855466200</id><published>2011-08-29T19:06:00.000+02:00</published><updated>2011-09-11T10:47:22.340+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-11T10:47:22.340+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Play" /><category scheme="http://www.blogger.com/atom/ns#" term="Cloud" /><category scheme="http://www.blogger.com/atom/ns#" term="Heroku" /><title>Heroku offre un PaaS pour Play Framework</title><content type="html">Bonne nouvelle les amis, la plateforme de Cloud Heroku, particulièrement célèbre dans le monde Ruby, &lt;a href="http://blog.heroku.com/archives/2011/8/29/play/"&gt;vient d'annoncer&lt;/a&gt; un support natif des application Play Framework!&lt;br /&gt;
&lt;br /&gt;
Nous avons donc à notre disposition un PaaS pour notre (ou du moins mon) framework préféré, permettant de déployer une application en production en une ligne commande (via Git).&lt;br /&gt;
De plus, en dessous d'un certaine nombre d'un certain nombre de connexions le service est gratuit.&lt;br /&gt;
Et si votre application rencontre le succès que vous espériez, vous pourrez alors passer sur du payant avec une configuration un peu plus costaud et bénéficier de toute la scalabilité offerte par la plateforme.&lt;br /&gt;
&lt;br /&gt;
Tout ça pour vous dire que je pensais justement faire un chapitre dans l'eBook &lt;a href="https://github.com/3monkeys/play.rules"&gt;play!rules&lt;/a&gt; sur le déploiement d'une application dans le Cloud... Heroku étant la première plateforme à supporter Play nativement, &amp;nbsp;je vais naturellement m'orienter vers cette solution. &amp;nbsp;So stay tuned, le chapitre devrait arriver très rapidement.&lt;br /&gt;
&lt;br /&gt;
Ps : merci à Nicolas du &lt;a href="http://www.touilleur-express.fr/"&gt;Touilleur Express&lt;/a&gt; qui a tweeté cette information hyper vite comme toujours!&lt;br /&gt;
&lt;br /&gt;
MAJ : Le (très court) chapitre sur Heroku est maintenant disponible &lt;a href="https://github.com/3monkeys/play.rules/blob/master/livre/part01-je-suis-pret/ch06-deploiement-dans-le-cloud.md"&gt;ici&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1231386620637429487-6545668427855466200?l=coffeebean.loicdescotte.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/IUKF/~4/cE12qLSIRB0" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://coffeebean.loicdescotte.com/2011/08/play-framework-heroku-bientot-dans.html#comment-form" title="2 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/6545668427855466200?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/6545668427855466200?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/IUKF/~3/cE12qLSIRB0/play-framework-heroku-bientot-dans.html" title="Heroku offre un PaaS pour Play Framework" /><author><name>Loïc Descotte</name><uri>http://www.blogger.com/profile/04087832203101001752</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_RfOlS-mqesc/Sri7_Inis3I/AAAAAAAABjo/64rI4AFXLRs/S220/n576917464_5655.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://coffeebean.loicdescotte.com/2011/08/play-framework-heroku-bientot-dans.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUQEQ348fSp7ImA9WhRUGEg.&quot;"><id>tag:blogger.com,1999:blog-1231386620637429487.post-1242925440717957397</id><published>2011-07-20T12:12:00.009+02:00</published><updated>2012-01-29T17:08:22.075+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-29T17:08:22.075+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Scala" /><category scheme="http://www.blogger.com/atom/ns#" term="Jetbrains" /><category scheme="http://www.blogger.com/atom/ns#" term="Kotlin" /><category scheme="http://www.blogger.com/atom/ns#" term="IDEA" /><category scheme="http://www.blogger.com/atom/ns#" term="Groovy" /><category scheme="http://www.blogger.com/atom/ns#" term="JVM" /><title>Kotlin: un nouveau langage pour la JVM</title><content type="html">JetBrains (l'éditeur de l'excellent IDE IntelliJ IDEA) vient d'annoncer qu'ils lançaient leur propre langage pour la JVM : Kotlin.&lt;br /&gt;
Cette annonce arrive quelques mois après celle de Red Hat qui a presénté le langage Ceylon au mois d'Avril.&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
Alors à quoi ressemble ce nouveau langage? Pour faire court, prenez Scala, rendez le un peu plus abordable et facile d'accès, ajoutez y un peu de Groovy et quelques nouvelles features. &lt;br /&gt;
&lt;br /&gt;
Vous comprendrez mieux avec quelques exemples de code .&lt;br /&gt;
&lt;br /&gt;
On peut facilement écrire ce genre de code grâce aux expressions lambda :&lt;br /&gt;
&lt;pre class="java" name="code"&gt;names filter {it.startsWith("A")} map {it.toUpperCase()} foreach {print(it)}
&lt;/pre&gt;
&lt;br /&gt;
Ce code écrit en majuscule dans la console tous les nom commençant par A.&lt;br /&gt;
C'est le genre de choses toutes simples qui peuvent être vraiment lourdes à écrire en Java...&lt;br /&gt;
&lt;br /&gt;
On peut également faire du pattern matching à la Scala :&lt;br /&gt;
&lt;pre class="java" name="code"&gt;fun cases(obj : Any) {
  when(obj) {
    1          =&amp;gt; print("One")
    "Hello"    =&amp;gt; print("Greeting")
    is Long    =&amp;gt; print("Long")
    !is String =&amp;gt; print("Not a string")
    else       =&amp;gt; print("Unknown") 
  }
}
&lt;/pre&gt;
&lt;br /&gt;
Kotlin est un langage à typage statique. Mais il propose un mécanisme d'inférence de type pour alléger la syntaxe : &lt;br /&gt;
&lt;pre class="java" name="code"&gt;var a : Int = 1
var b = 1 // Type inféré
&lt;/pre&gt;
&lt;br /&gt;
On peut même automatiser les cast dans certains cas :&lt;br /&gt;
&lt;pre class="java" name="code"&gt;if (obj is String) 
    return obj.length // pas de cast explicite 
&lt;/pre&gt;
&lt;br /&gt;
Le langage fournit un système de properties très bien pensé (pour éviter d'écrire les getters et setters à la main), qui rappelle un peu celui de C#.  &lt;br /&gt;
&lt;br /&gt;
La gestion des null est aussi très efficace et devrait résoudre pas mal de problèmes liés au null pointers. Un champ ne peut être null que si on l'autorise :&lt;br /&gt;
&lt;pre class="java" name="code"&gt;var a : String = "abc"
a = null // erreur de compilation

var b : String? = "abc"
b = null // ok
&lt;/pre&gt;
&lt;br /&gt;
Pour y accéder, on fait comme en Groovy :&lt;br /&gt;
&lt;pre class="java" name="code"&gt;b?.length() 
&lt;/pre&gt;
&lt;br /&gt;
Ceci renverra length() si b est non null, rien sinon. On pourra donc éviter quelques fastidieux if(b!=null) dans notre code.&lt;br /&gt;
&lt;br /&gt;
Pour réduire le risque d'erreurs, l'utilisation du "?" est obligatoire pour accéder aux objets "nullables" :&lt;br /&gt;
&lt;pre class="java" name="code"&gt;b.length() //erreur de compilation
&lt;/pre&gt;
&lt;br /&gt;
Enfin, le langage offre la même sécurité que Scala au niveau de l'immutabilité, avec l'usage du mot clé "val" (au lieu de "var") pour déclarer une propriété immuable. Ceci aura aussi une incidence sur la génération automatique des accesseurs : seul un getter est généré pour une propriété de type val. &lt;br /&gt;
&lt;br /&gt;
Si cette mise en bouche vous a ouvert l'appétit, je vous conseille de regarder &lt;a href="http://confluence.jetbrains.net/display/Kotlin/Examples"&gt;ces exemples plus détaillés&lt;/a&gt; sur le site du langage.&lt;br /&gt;
&lt;br /&gt;
En tout cas personnellement je trouve ça très prometteur. Le support natif dans IntelliJ IDEA sera un gros plus des son lancement. J'espère sincèrement que ce langage aura sa chance dans la jungle des langages pour la JVM!
&lt;br /&gt;
&lt;br /&gt;
MAJ : Vous pouvez dès à présent &lt;a href="https://plus.google.com/117447657524839844765/posts/TKtXXRYcu2Z"&gt;jouer avec la Web demo&lt;/a&gt; de Kotlin&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1231386620637429487-1242925440717957397?l=coffeebean.loicdescotte.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/IUKF/~4/2WxItKRknsk" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://coffeebean.loicdescotte.com/2011/07/kotlin-un-nouveau-langage-pour-la-jvm.html#comment-form" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/1242925440717957397?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/1242925440717957397?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/IUKF/~3/2WxItKRknsk/kotlin-un-nouveau-langage-pour-la-jvm.html" title="Kotlin: un nouveau langage pour la JVM" /><author><name>Loïc Descotte</name><uri>http://www.blogger.com/profile/04087832203101001752</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_RfOlS-mqesc/Sri7_Inis3I/AAAAAAAABjo/64rI4AFXLRs/S220/n576917464_5655.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://coffeebean.loicdescotte.com/2011/07/kotlin-un-nouveau-langage-pour-la-jvm.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEcER3o_cCp7ImA9WhdWEk4.&quot;"><id>tag:blogger.com,1999:blog-1231386620637429487.post-7116988539350904392</id><published>2011-06-24T22:34:00.000+02:00</published><updated>2011-09-05T17:20:06.448+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-05T17:20:06.448+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Scala" /><category scheme="http://www.blogger.com/atom/ns#" term="Play" /><category scheme="http://www.blogger.com/atom/ns#" term="Apprendre_Play" /><title>Play!Rules: un chapitre sur Play et Scala</title><content type="html">Un nouveau chapitre est disponible dans l'ebook gratuit&amp;nbsp;(et open source)&amp;nbsp;Play!Rules, il explique comment développer avec Play Framework et le langage Scala .&lt;br /&gt;
&lt;br /&gt;
Pour en savoir plus, &lt;a href="https://github.com/3monkeys/play.rules/blob/master/livre/part02-a-la-decouverte%20des%20modules/ch02-play-et-scala.md"&gt;ça se passe ici&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1231386620637429487-7116988539350904392?l=coffeebean.loicdescotte.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/IUKF/~4/EfnrI4khSb8" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://coffeebean.loicdescotte.com/2011/06/playrules-un-chapitre-sur-play-et-scala.html#comment-form" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/7116988539350904392?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/7116988539350904392?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/IUKF/~3/EfnrI4khSb8/playrules-un-chapitre-sur-play-et-scala.html" title="Play!Rules: un chapitre sur Play et Scala" /><author><name>Loïc Descotte</name><uri>http://www.blogger.com/profile/04087832203101001752</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_RfOlS-mqesc/Sri7_Inis3I/AAAAAAAABjo/64rI4AFXLRs/S220/n576917464_5655.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://coffeebean.loicdescotte.com/2011/06/playrules-un-chapitre-sur-play-et-scala.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUMAQX04eip7ImA9WhRQF0Q.&quot;"><id>tag:blogger.com,1999:blog-1231386620637429487.post-8300956857116083102</id><published>2011-05-28T10:50:00.021+02:00</published><updated>2011-12-13T17:24:00.332+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-13T17:24:00.332+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="DDD" /><category scheme="http://www.blogger.com/atom/ns#" term="QueryDSL" /><category scheme="http://www.blogger.com/atom/ns#" term="Spring" /><title>Spring Data JPA et Querydsl</title><content type="html">SpringSource a récemment lancé le projet Spring-Data, un ensemble de sous projets ayant pour but de nous aider à manipuler plus facilement nos données.&lt;br /&gt;
&lt;br /&gt;
Nous allons nous attarder sur Spring-Data-JPA, qui fournit un ensemble d'automatisations pour JPA.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;b&gt;Repositories&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Les repositories sont des interfaces pour lesquelles nous n'avons pas à fournir d'implémentation. Ces interfaces seront implémentées par le framework lui même au démarrage du contexte Spring.&lt;br /&gt;
&lt;br /&gt;
On considère la classe Person :&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="java" name="code"&gt;@Entity
public class Person {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String firstName;
    private String lastName;
    private Integer age;
    private String city;
 //getters &amp;amp; setters 
}
&lt;/pre&gt;
&lt;br /&gt;
Si on écrit par exemple : &lt;br /&gt;
&lt;br /&gt;
&lt;pre class="java" name="code"&gt;public interface PersonRepository extends JpaRepository&amp;lt;Person, Long&amp;gt; {
    List&amp;lt;Person&amp;gt; findByCity(String city);    
}
&lt;/pre&gt;
&lt;br /&gt;
Spring implémentera une requête en se basant sur le nom de la méthode, pour rechercher des personnes par la ville où elles habitent.&lt;br /&gt;
&lt;br /&gt;
Pour utiliser plusieurs paramètres on utilise le mot clé "And" :&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="java" name="code"&gt;List&amp;lt;Person&amp;gt; findByFirstNameAndLastName(String firstName, String lastName);
&lt;/pre&gt;
&lt;br /&gt;
On peut utiliser tout un tas d'autres mots clés dans le nom des méthodes pour construire nos requêtes :&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;And&lt;/li&gt;
&lt;li&gt;Or&lt;/li&gt;
&lt;li&gt;GreaterThan&lt;/li&gt;
&lt;li&gt;LessThan&lt;/li&gt;
&lt;li&gt;Like&lt;/li&gt;
&lt;li&gt;IsNull&lt;/li&gt;
&lt;li&gt;OrderBy&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;
Par exemple :&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="java" name="code"&gt;List&amp;lt;Person&amp;gt; findByAgeOrderByLastnameDesc(Integer age);
&lt;/pre&gt;
&lt;br /&gt;
Les repositories permettent aussi de persister les entités dans la base :&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="java" name="code"&gt;personRepository.save(person);
&lt;/pre&gt;
&lt;br /&gt;
Ces fonctionnalités sont directement reprises depuis Hades, les 2 frameworks partageant le même spec leader.&lt;br /&gt;
&lt;br /&gt;
Si on veut écrire directement une requête JPQL, on peut utiliser l'annotation @Query :&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="java" name="code"&gt;@Query("ma super requête ici")
List&amp;lt;Person&amp;gt; findWithMyCustomQuery(Customer customer);
&lt;/pre&gt;
&lt;br /&gt;
La requête sera exécutée lorsque qu'on appellera la méthode findWithMyCustomQuery.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Named queries&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Pour utiliser une NamedQuery, il suffit que le nom de la méthode du repository suive le même nom que la NamedQuery. Dans ce cas de figure, le framework n'essaiera pas de générer une requête en suivant le nom de la méthode.&lt;br /&gt;
Par exemple la méthode findByNameWithMyFilters sera mappée sur la requête nommée "Person.findByNameWithMyFilters". &lt;br /&gt;
&lt;br /&gt;
Entité : 

&lt;br /&gt;
&lt;pre class="java" name="code"&gt;@Entity
@NamedQuery(name = "Person.findByNameWithMyFilters", 
  query = "select p from Person p where filter1 = ? and filter2 = ?")
public class Person {...}
&lt;/pre&gt;
&lt;br /&gt;
Repository : 

&lt;br /&gt;
&lt;pre class="java" name="code"&gt;Person findByNameWithMyFilters(String filter1, String filter2);
&lt;/pre&gt;
&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
Ces repositories nous facilitent bien la vie en générant pour nous les requêtes pour un grand nombre de cas courants. Un détail qui a son importance : toutes les méthodes des repositories sont transactionnelles par défaut.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;b&gt;Querydsl&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Querydsl est une librairie qui apporte des API pour requêter des entités de manière "typesafe" et avec une syntaxe épurée. Spring-Data supporte cette librairie pour simplifier l'écriture de prédicats en Java.&lt;br /&gt;
&lt;br /&gt;
Voici quelques exemples de requêtes, avec l'utilisation des mots clés eq (equals), like et gt (greater than) :&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="java" name="code"&gt;private static QPerson person = QPerson.person;

public static BooleanExpression fromCity(String city) {
 return person.city.like(city);
}

public static BooleanExpression byName(String firstName, String lastName) {
 return person.firstName.eq(firstName).and(person.lastName.eq(lastName));
}

public static BooleanExpression adults() {
 return person.age.gt(18);
}
&lt;/pre&gt;
&lt;br /&gt;
J'aime beaucoup cette syntaxe, elle est vraiment fluide, facile à écrire et lisible. Il est bien sur possible de gérer des cas plus complexes, je vous laisse consulter &lt;a href="http://blog.mysema.com/2010/07/querying-hibernate-with-querydsl.html"&gt;la doc de Querydsl&lt;/a&gt; pour en savoir plus.&lt;br /&gt;
&lt;br /&gt;
Pour&amp;nbsp;exécuter une requête utilisant un de ces prédicats, il suffit d'écrire :&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="java" name="code"&gt;personRepository.findAll(Person.fromCity("maVille"))
&lt;/pre&gt;
&lt;br /&gt;
ou&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="java" name="code"&gt;personRepository.findAll(Person.adults())
&lt;/pre&gt;
&lt;br /&gt;
Pour que tout cela fonctionne, notre repository doit implémenter QuerydslPredicateExecutor&lt;person&gt;. On doit également définir ce plugin dans le build maven, qui se chargera des générer les classes Q* pour chacune des entités du projet :&lt;br /&gt;
&lt;br /&gt;
&lt;/person&gt;&lt;br /&gt;
&lt;pre class="xml" name="code"&gt;&amp;lt;plugin&amp;gt;
        &amp;lt;groupId&amp;gt;com.mysema.maven&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;maven-apt-plugin&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;
      &amp;lt;executions&amp;gt;
          &amp;lt;execution&amp;gt;
              &amp;lt;phase&amp;gt;generate-sources&amp;lt;/phase&amp;gt;
              &amp;lt;goals&amp;gt;
                  &amp;lt;goal&amp;gt;process&amp;lt;/goal&amp;gt;
              &amp;lt;/goals&amp;gt;
              &amp;lt;configuration&amp;gt;
                  &amp;lt;outputDirectory&amp;gt;target/generated-sources&amp;lt;/outputDirectory&amp;gt;
                  &amp;lt;processor&amp;gt;com.mysema.query.apt.jpa.JPAAnnotationProcessor&amp;lt;/processor&amp;gt;
              &amp;lt;/configuration&amp;gt;
          &amp;lt;/execution&amp;gt;
      &amp;lt;/executions&amp;gt;
  &amp;lt;/plugin&amp;gt;
&lt;/pre&gt;
&lt;br /&gt;
N.B : Il est possible d'écrire nos prédicats avec l'api criteria de JPA 2 au lieu de Querydsl si on le souhaite, en utilisant la classe org.springframework.data.jpa.domain.Specification à la place de nos BooleanExpression.&lt;br /&gt;
&lt;br /&gt;
Voyons comment utiliser nos repositories et nos prédicats :&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="java" name="code"&gt;@Test
  public void testPersistence() {

      Person p = new Person();
      p.setFirstName("loic");
      p.setLastName("descotte");
      p.setCity("Grenoble");
      p.setAge(29);

      Person p2 = new Person();
      p2.setFirstName("john");
      p2.setLastName("doe");
      p2.setAge(17);
      p2.setCity("NYC");

      //save
      personRepository.save(p);
      personRepository.save(p2);

      persons = personRepository.findAll();
      assertEquals(persons.size(),2);

      persons = (List) personRepository.findAll(Person.fromCity("%Gre%"));
      assertEquals(persons.size(),1);
      assertEquals(persons.get(0).getFirstName(),"loic");

      persons = (List) personRepository.findByFirstNameAndLastName("loic", "descotte");
      assertEquals(persons.size(),1);
      assertEquals(persons.get(0).getCity(),"Grenoble");

      persons = (List) personRepository.findAll(Person.adults());
      assertEquals(persons.size(),1);
      assertEquals(persons.get(0).getFirstName(),"loic");
  }

&lt;/pre&gt;
&lt;br /&gt;
Dans cet exemple le code client est une classe de test, mais on peut très bien appeler notre repository depuis un service REST, depuis la couche graphique, etc. (voir le code source de l'exemple en téléchargement à la fin de cet article).&lt;br /&gt;
&lt;br /&gt;
On voit dans ces exemples qu'on a complètement modifié notre façon d'architecturer notre application Spring: on peut si on le souhaite se passer des couche "services" ou "business" qui contiennent habituellement la logique de notre application.  &lt;br /&gt;
En effet Spring-Data et ses repositories ont un bon gout de DDD (Domain Driven Design). Ceux qui ont essayé Play connaissent déjà cette approche.&lt;br /&gt;
Le code métier de notre application peut être recentré sur le modèle (objets du domaine métier). A nous la vrai conception objet, fini les modèles anémiques sans intelligence dont les seules méthodes sont des getters et des setters. &lt;br /&gt;
Comme vous le voyez dans cet exemple, on a même la possibilité de placer nos prédicats d'accès à la base de données dans la classe Personne. &lt;br /&gt;
&lt;br /&gt;
Pour conclure ce nouveau framework est vraiment prometteur et apporte pas mal de nouveautés et de facilités aux applications codées en environnement Spring. &lt;br /&gt;
Le seul bémol que j'ai vu étant (comme souvent avec Spring et Maven) le temps nécessaire pour mettre au point la configuration XML et trouver les bonnes dépendances (sans compter les conflits avec Jersey, etc.)&lt;br /&gt;
Mais comme je suis sympa vous pouvez tout recopier dans le code source des exemples de l'article : &lt;a href="http://dl.dropbox.com/u/7549438/blog/Directory.zip"&gt;code source de l'exemple&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Je vous conseille de jeter également un oeil aux autres projets de &lt;a href="http://www.springsource.org/spring-data"&gt;Spring-Data&lt;/a&gt;, tout aussi intéressants et qui adressent le monde NoSQL (bases orientées graphes, documents, clé/valeur...).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1231386620637429487-8300956857116083102?l=coffeebean.loicdescotte.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/IUKF/~4/NGgVdn5UDCc" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://coffeebean.loicdescotte.com/2011/05/spring-data-jpa-et-querydsl.html#comment-form" title="12 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/8300956857116083102?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/8300956857116083102?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/IUKF/~3/NGgVdn5UDCc/spring-data-jpa-et-querydsl.html" title="Spring Data JPA et Querydsl" /><author><name>Loïc Descotte</name><uri>http://www.blogger.com/profile/04087832203101001752</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_RfOlS-mqesc/Sri7_Inis3I/AAAAAAAABjo/64rI4AFXLRs/S220/n576917464_5655.jpg" /></author><thr:total>12</thr:total><feedburner:origLink>http://coffeebean.loicdescotte.com/2011/05/spring-data-jpa-et-querydsl.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04HRXY6fyp7ImA9WhdWEk4.&quot;"><id>tag:blogger.com,1999:blog-1231386620637429487.post-4057024695464829565</id><published>2011-05-22T16:33:00.002+02:00</published><updated>2011-09-05T17:18:54.817+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-05T17:18:54.817+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Play" /><category scheme="http://www.blogger.com/atom/ns#" term="Apprendre_Play" /><category scheme="http://www.blogger.com/atom/ns#" term="HTML5" /><category scheme="http://www.blogger.com/atom/ns#" term="WebSocket" /><title>WebSocket et Play Framework</title><content type="html">Vous avez surement entendu parler de WebSocket, un (futur) standard HTML 5 qui permet de faire du push de données du serveur vers le navigateur.&lt;br /&gt;
L'utilisation des WebSockets est très simple avec Play et très utile dans le cas de traitements asynchrones.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez lire ce nouveau chapitre dédié à WebSocket sur l'ebook play.rules :&amp;nbsp;&lt;a href="https://github.com/3monkeys/play.rules/blob/master/livre/part01-je-suis-pret/ch05-jobs-et-traitements-asynchrones.md"&gt;https://github.com/3monkeys/play.rules/blob/master/livre/part01-je-suis-pret/ch05-jobs-et-traitements-asynchrones.md&lt;/a&gt;&amp;nbsp;(deuxième partie du fichier).&lt;br /&gt;
&lt;br /&gt;
Comme d'habitude n'hésitez pas à envoyer vos remarques si des éléments ne sont pas clairs ou si vous trouvez des fautes :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1231386620637429487-4057024695464829565?l=coffeebean.loicdescotte.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/IUKF/~4/lGiw-lfmMX8" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://coffeebean.loicdescotte.com/2011/05/websocket-et-play-framework.html#comment-form" title="5 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/4057024695464829565?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/4057024695464829565?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/IUKF/~3/lGiw-lfmMX8/websocket-et-play-framework.html" title="WebSocket et Play Framework" /><author><name>Loïc Descotte</name><uri>http://www.blogger.com/profile/04087832203101001752</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_RfOlS-mqesc/Sri7_Inis3I/AAAAAAAABjo/64rI4AFXLRs/S220/n576917464_5655.jpg" /></author><thr:total>5</thr:total><feedburner:origLink>http://coffeebean.loicdescotte.com/2011/05/websocket-et-play-framework.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04DR3o7eCp7ImA9WhdWEk4.&quot;"><id>tag:blogger.com,1999:blog-1231386620637429487.post-8974841571866611416</id><published>2011-04-12T19:25:00.001+02:00</published><updated>2011-09-05T17:19:36.400+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-05T17:19:36.400+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Scala" /><category scheme="http://www.blogger.com/atom/ns#" term="Play" /><category scheme="http://www.blogger.com/atom/ns#" term="Apprendre_Play" /><title>Du Play et du Scala!</title><content type="html">Je suis entrain de réécrire entièrement en Scala mon application de démo pour Play framework!&lt;br /&gt;
Le code de l'application est disponible ici :&amp;nbsp;&lt;a href="https://github.com/loicdescotte/vote4music-scala"&gt;https://github.com/loicdescotte/vote4music-scala&lt;/a&gt;&lt;br /&gt;
Une occasion de comparer les langages, puisque la version Java est disponible là :&amp;nbsp;&lt;a href="https://github.com/loicdescotte/vote4music"&gt;https://github.com/loicdescotte/vote4music&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Personnellement&amp;nbsp;je trouve l'API Scala de Play plutôt bien pensée, elle colle même peut être encore plus à l'esprit Play que la version Java. On gagne en concision et surtout en expressivité du code grâce à l'approche fonctionnelle.&lt;br /&gt;
&lt;br /&gt;
Le code de l'application n'est pas encore parfait, il reste quelques bugs et quelques&amp;nbsp;&lt;i&gt;TODO &lt;/i&gt;(les API Json et XML ne sont par exemple pas encore fonctionnelles). Mais la plupart des fonctionnalités sont là.&lt;br /&gt;
&lt;br /&gt;
Cette version Scala fera d'ailleurs l'objet d'un chapitre dans le livre &lt;a href="https://github.com/3monkeys/play.rules"&gt;Play.rules&lt;/a&gt;&amp;nbsp;dont je vous ai parlé dans le post précédent.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1231386620637429487-8974841571866611416?l=coffeebean.loicdescotte.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/IUKF/~4/4sJjji7lDcM" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://coffeebean.loicdescotte.com/2011/04/du-play-et-du-scala.html#comment-form" title="6 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/8974841571866611416?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/8974841571866611416?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/IUKF/~3/4sJjji7lDcM/du-play-et-du-scala.html" title="Du Play et du Scala!" /><author><name>Loïc Descotte</name><uri>http://www.blogger.com/profile/04087832203101001752</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_RfOlS-mqesc/Sri7_Inis3I/AAAAAAAABjo/64rI4AFXLRs/S220/n576917464_5655.jpg" /></author><thr:total>6</thr:total><feedburner:origLink>http://coffeebean.loicdescotte.com/2011/04/du-play-et-du-scala.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0EAQ3oycCp7ImA9WhdWEk4.&quot;"><id>tag:blogger.com,1999:blog-1231386620637429487.post-877466269928904449</id><published>2011-04-10T12:48:00.003+02:00</published><updated>2011-09-05T17:14:02.498+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-05T17:14:02.498+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Play" /><category scheme="http://www.blogger.com/atom/ns#" term="Apprendre_Play" /><title>Pourquoi Play + Ebook gratuit et open source!</title><content type="html">Sur ce blog il m'est souvent arrivé de vous parler de Play Framework.&lt;br /&gt;
Aujourd'hui&amp;nbsp;revenons un peu au début de l'histoire, je vais vous présenter les raisons pour lesquelles j'aime autant Play.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://github.com/3monkeys/play.rules/blob/master/livre/02-Pourquoi-play.md"&gt;J'ai décris toutes ces raisons ici&lt;/a&gt;&amp;nbsp;(suivez le lien)&lt;br /&gt;
&lt;br /&gt;
En fait ceci n'est que le premier chapitre d'un Ebook gratuit, open source et collaboratif sur lequel je travaille avec mes 2 amis &lt;a href="http://www.twitter.com/k33g_org"&gt;@k33g_org&lt;/a&gt; et &lt;a href="http://www.twitter.com/mklabs"&gt;@mklabs&lt;/a&gt;! Notre but est de fournir un livre convivial,&amp;nbsp;facile&amp;nbsp;à lire et avec un ton un peu différent de ce qu'on trouve dans la littérature habituelle. L'aspect open source&amp;nbsp;donnera,&amp;nbsp;je l'espère, l'envie à des personnes de nous aider pour les relectures ou de&amp;nbsp;contribuer&amp;nbsp;à des chapitres!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;
On en est qu'a tout début, il reste encore beaucoup à écrire. Mais on avance à bon rythme et petit à petit le livre devrait se remplir! Vous pouvez&amp;nbsp;déjà&amp;nbsp;le consulter&amp;nbsp;librement sur GitHub :&amp;nbsp;&lt;a href="https://github.com/3monkeys/play.rules"&gt;https://github.com/3monkeys/play.rules&lt;/a&gt;&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1231386620637429487-877466269928904449?l=coffeebean.loicdescotte.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/IUKF/~4/PdYab8JoLjI" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://coffeebean.loicdescotte.com/2011/04/pourquoi-play-ebook-gratuit-et-open.html#comment-form" title="7 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/877466269928904449?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/877466269928904449?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/IUKF/~3/PdYab8JoLjI/pourquoi-play-ebook-gratuit-et-open.html" title="Pourquoi Play + Ebook gratuit et open source!" /><author><name>Loïc Descotte</name><uri>http://www.blogger.com/profile/04087832203101001752</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_RfOlS-mqesc/Sri7_Inis3I/AAAAAAAABjo/64rI4AFXLRs/S220/n576917464_5655.jpg" /></author><thr:total>7</thr:total><feedburner:origLink>http://coffeebean.loicdescotte.com/2011/04/pourquoi-play-ebook-gratuit-et-open.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0UDQHY8eyp7ImA9WhZSEEg.&quot;"><id>tag:blogger.com,1999:blog-1231386620637429487.post-2549911136066772536</id><published>2011-03-25T14:21:00.000+01:00</published><updated>2011-03-25T14:21:11.873+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-25T14:21:11.873+01:00</app:edited><title>Présentation du langage Scala par Aleksandar Prokopec de l'EPFL</title><content type="html">Lundi dernier nous avons eu le plaisir d'accueillir à l'Alpes JUG&amp;nbsp;Aleksandar Prokopec, un des contributeurs de Scala, le langage orienté objet et fonctionnel pour la JVM dont tout le monde parle en ce moment.&lt;br /&gt;
&lt;br /&gt;
Les slides et le compte rendu de la présentation sont disponible &lt;a href="http://www.alpesjug.fr/?p=774"&gt;ici&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1231386620637429487-2549911136066772536?l=coffeebean.loicdescotte.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/IUKF/~4/WxzHZu-FDfM" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://coffeebean.loicdescotte.com/2011/03/presentation-du-langage-scala-par.html#comment-form" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/2549911136066772536?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/2549911136066772536?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/IUKF/~3/WxzHZu-FDfM/presentation-du-langage-scala-par.html" title="Présentation du langage Scala par Aleksandar Prokopec de l'EPFL" /><author><name>Loïc Descotte</name><uri>http://www.blogger.com/profile/04087832203101001752</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_RfOlS-mqesc/Sri7_Inis3I/AAAAAAAABjo/64rI4AFXLRs/S220/n576917464_5655.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://coffeebean.loicdescotte.com/2011/03/presentation-du-langage-scala-par.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0AMSH04eCp7ImA9WhZTEkw.&quot;"><id>tag:blogger.com,1999:blog-1231386620637429487.post-229771189936638630</id><published>2011-03-15T21:07:00.002+01:00</published><updated>2011-03-15T21:09:49.330+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-15T21:09:49.330+01:00</app:edited><title>Mix-IT : le rendez vous Java et agilité en Rhône Alpes</title><content type="html">Mix-IT est un événement organisé par le Lyon JUG et le CARA (Club Agile Rhône Alpes).&lt;br /&gt;
Durant toute la journée du &lt;b&gt;5 avril&lt;/b&gt; &amp;nbsp;nous aurons l’occasion de suivre des conférences autour de 5 thèmes : Techy, Agility, Mixy , Trendy et Gamy.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Avec des célébrités du paysage IT français comme Nicolas Martignole (rédacteur du blog&amp;nbsp;&lt;a href="http://www.touilleur-express.fr/"&gt;Le Touilleur Express&lt;/a&gt;), Mathilde Lemee (&lt;a href="http://www.java-freelance.fr/"&gt;java-freelance&lt;/a&gt;) et bien d’autres, choisir les sessions de conférences ne sera pas une tâche aisée.&lt;br /&gt;
&lt;br /&gt;
En plus le prix est vraiment abordable pour ce genre de conférence : 20 € pour la journée complète, repas inclus. Un événement à ne pas rater pour tous les geeks de la région Rhône Alpes, et même les autres !&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="MsoNormal"&gt;&lt;a href="http://www.mix-it.fr/sessions"&gt;Le programme complet&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;a href="http://www.mix-it.fr/"&gt;Le site officiel&lt;/a&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1231386620637429487-229771189936638630?l=coffeebean.loicdescotte.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/IUKF/~4/1WLxvHO92Rg" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://coffeebean.loicdescotte.com/2011/03/mix-it-le-rendez-vous-java-et-agilite.html#comment-form" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/229771189936638630?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/229771189936638630?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/IUKF/~3/1WLxvHO92Rg/mix-it-le-rendez-vous-java-et-agilite.html" title="Mix-IT : le rendez vous Java et agilité en Rhône Alpes" /><author><name>Loïc Descotte</name><uri>http://www.blogger.com/profile/04087832203101001752</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_RfOlS-mqesc/Sri7_Inis3I/AAAAAAAABjo/64rI4AFXLRs/S220/n576917464_5655.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://coffeebean.loicdescotte.com/2011/03/mix-it-le-rendez-vous-java-et-agilite.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0EGQHgycSp7ImA9WhdWEk4.&quot;"><id>tag:blogger.com,1999:blog-1231386620637429487.post-1755929125196877508</id><published>2011-02-26T12:03:00.006+01:00</published><updated>2011-09-05T17:13:41.699+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-05T17:13:41.699+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Play" /><category scheme="http://www.blogger.com/atom/ns#" term="Apprendre_Play" /><title>Validation HTML5 et Play!</title><content type="html">La spécification HTML 5 prévoit la possibilité de &lt;a href="http://dev.w3.org/html5/spec/Overview.html#client-side-form-validation"&gt;valider les données d'un formulaire HTML&lt;/a&gt; côté client, directement dans le navigateur avant d'envoyer les données vers un serveur.&lt;br /&gt;
Il&amp;nbsp;existe&amp;nbsp;un &lt;a href="https://github.com/oasits/play-html5-validation"&gt;module&lt;/a&gt; pour Play! qui permet de faire un mapping entre les annotations de validation du modèle (qui servent normalement à valider les données côté serveur) et le rendu&amp;nbsp;HTML, pour intégrer cette fonctionnalité.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Pour activer ce module, après l'avoir téléchargé il suffit d'ajouter cette ligne dans le fichier application.conf :&lt;br /&gt;
&lt;pre class="xml" name="code"&gt;module.html5validation=modules/html5validation
&lt;/pre&gt;
&lt;br /&gt;
Sur une entité du modèle, on ajoute une annotation de validation pour indiquer qu'un des champs est obligatoire : &lt;br /&gt;
&lt;br /&gt;
&lt;pre class="java" name="code"&gt;@Entity
public class Album extends Model {

    @Required
    public String name;
}
&lt;/pre&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://lh5.googleusercontent.com/-Yf0EN6dUMG0/TWjc9dozyfI/AAAAAAAACiM/Eq6uAydNVUM/s1600/Capture+d%25E2%2580%2599e%25CC%2581cran+2011-02-26+a%25CC%2580+11.43.40.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;/a&gt;&lt;/div&gt;
Dans le formulaire HTML, on peut utiliser un nouveau tag, #{input} : &lt;br /&gt;
&lt;pre class="xml" name="code"&gt;#{input for:'album.name', type:'text', id:'name' /}
&lt;/pre&gt;
&lt;br /&gt;
Ce tag sera traduit en une balise input classique, avec un attribut indiquant que le champ est obligatoire : &lt;br /&gt;
&lt;br /&gt;
&lt;pre class="xml" name="code"&gt;&amp;lt;input type="text" name="album.name" value="album?.name" id="name" required="required"/&amp;gt;
&lt;/pre&gt;
&lt;br /&gt;
Le rendu est le suivant si on valide le formulaire sans remplir le champ obligatoire : &lt;br /&gt;
&lt;img border="0" height="106" src="https://lh5.googleusercontent.com/-Yf0EN6dUMG0/TWjc9dozyfI/AAAAAAAACiM/Eq6uAydNVUM/s320/Capture+d%25E2%2580%2599e%25CC%2581cran+2011-02-26+a%25CC%2580+11.43.40.png" width="320" /&gt;&lt;br /&gt;
&lt;br /&gt;
Le tag input supporte un grand nombre d'options et plusieurs types d'annotations de validation, comme @Match pour valider une expression régulière ou @Email. Toutes ces options sont décrites dans &lt;a href="http://www.playframework.org/modules/html5validation-1.0/home"&gt;cette documentation&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si votre navigateur ne supporte pas la validation HTML5, aucun soucis car la validation côté serveur sera exécutée dans tous les cas. J'ai testé avec Chrome 10 et Firefox 4 beta 12 et cela fonctionne parfaitement sur ces navigateurs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1231386620637429487-1755929125196877508?l=coffeebean.loicdescotte.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/IUKF/~4/c1WvZviHYgw" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://coffeebean.loicdescotte.com/2011/02/validation-html5-et-play.html#comment-form" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/1755929125196877508?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/1755929125196877508?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/IUKF/~3/c1WvZviHYgw/validation-html5-et-play.html" title="Validation HTML5 et Play!" /><author><name>Loïc Descotte</name><uri>http://www.blogger.com/profile/04087832203101001752</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_RfOlS-mqesc/Sri7_Inis3I/AAAAAAAABjo/64rI4AFXLRs/S220/n576917464_5655.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://lh5.googleusercontent.com/-Yf0EN6dUMG0/TWjc9dozyfI/AAAAAAAACiM/Eq6uAydNVUM/s72-c/Capture+d%25E2%2580%2599e%25CC%2581cran+2011-02-26+a%25CC%2580+11.43.40.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://coffeebean.loicdescotte.com/2011/02/validation-html5-et-play.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUAR3o8fyp7ImA9Wx9bFkk.&quot;"><id>tag:blogger.com,1999:blog-1231386620637429487.post-1356339180124673090</id><published>2011-02-17T13:44:00.013+01:00</published><updated>2011-02-25T15:14:06.477+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-25T15:14:06.477+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="UiBinder" /><category scheme="http://www.blogger.com/atom/ns#" term="GWT" /><category scheme="http://www.blogger.com/atom/ns#" term="APP Engine" /><category scheme="http://www.blogger.com/atom/ns#" term="GWT Designer" /><title>Première appli GWT avec UiBinder et GWT Designer</title><content type="html">Dans ce tutoriel nous allons voir comment développer facilement une petite application de gestion de taches à l’aide de GWT, UiBinder et GWT Designer.&lt;br /&gt;
&lt;br /&gt;
GWT Designer est un outil de création d’interfaces graphiques qui fonctionne en drag and drop, à la manière du designer SWING Matisse de Netbeans.&lt;br /&gt;
&lt;br /&gt;
UI Binder est une nouvelle façon de décrire les interfaces graphiques GWT. Avec ce framework on déclare les IHM en XML et non en &amp;nbsp;Java comme on le faisait dans les versions anterieures de GWT. Le code est ainsi plus concis et beaucoup plus lisible. &lt;br /&gt;
Dans ses dernières versions, GWT Designer est compatible avec UiBinder.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Installation de l’outillage&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
Google fournit un &lt;a href="http://code.google.com/eclipse/"&gt;plugin Eclipse&lt;/a&gt; plutôt bien fait qui apporte le support de GWT et de Google APP engine. Depuis la version 2.2 qui vient de sortir cette semaine, le plugin contient également GWT Designer.&lt;br /&gt;
&lt;br /&gt;
Pour installer ce plugin sous Eclipse Helios (3.6), ajoutez ce repository : http://dl.google.com/eclipse/plugin/3.6&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Création du projet &lt;/b&gt;&lt;br /&gt;
Après avoir installé le plugin, créez un nouveau projet en cliquant sur le bouton&lt;br /&gt;
&lt;img border="0" src="http://3.bp.blogspot.com/-HFW5V4vzr7E/TVzkDlJZhWI/AAAAAAAAChw/KOJPi0clLNc/s1600/1.png" /&gt;&lt;br /&gt;
&lt;br /&gt;
Une première page d’exemple sera générée. Vous constaterez au passage que le générateur de projets n’utilise pas encore UI Binder et que le code java ressemble grossièrement à du SWING.&lt;br /&gt;
Nous allons voir comment faire quelque chose de plus élégant avec cette version de GWT.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Création d’une IHM&lt;/b&gt;&lt;br /&gt;
Dans le menu du projet, cliquez sur &lt;b&gt;New-&amp;gt; UiBinder &lt;/b&gt;&lt;br /&gt;
Puis créez une classe nommée TodoList.&lt;br /&gt;
&lt;br /&gt;
GWT nous génère alors une classe Java qui permettra de traiter les&amp;nbsp;évènements&amp;nbsp;et un fichier XML pour décrire l'interface graphique.&amp;nbsp;Une fois compilé, tout ce code sera transformé en HTML et en JavaScript pour être&amp;nbsp;exécuté&amp;nbsp;sur un navigateur.&lt;br /&gt;
&lt;br /&gt;
Nous allons dessiner notre panel comme ceci :&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-OjXLTcvyHSs/TVzj6mZO2RI/AAAAAAAACho/BGxLksJ15a0/s1600/2.png" imageanchor="1"&gt;&lt;img border="0" height="238" src="http://3.bp.blogspot.com/-OjXLTcvyHSs/TVzj6mZO2RI/AAAAAAAACho/BGxLksJ15a0/s400/2.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
On a maintenant un petit formulaire (2 champs texte et “datebox”) pour ajouter des taches et un tableau pour les afficher.&lt;br /&gt;
&lt;br /&gt;
Le code généré côté XML est le suivant :&lt;br /&gt;
&lt;pre class="xml" name="code"&gt;&amp;lt;g:HTMLPanel&amp;gt;
 &amp;lt;g:FlowPanel&amp;gt;
   &amp;lt;g:Label text="Add a new task" width="100%" height="100%" styleName="{style.big}"/&amp;gt;
   &amp;lt;g:Label text="Name"/&amp;gt;
   &amp;lt;g:TextBox ui:field="nameField"/&amp;gt;
   &amp;lt;g:Label text="Description"/&amp;gt;
   &amp;lt;g:TextBox ui:field="descriptionField"/&amp;gt;
   &amp;lt;g:Label text="Due Date"/&amp;gt;
   &amp;lt;p2:DateBox ui:field="dateField"/&amp;gt;
  &amp;lt;/g:FlowPanel&amp;gt;
  
  
  &amp;lt;g:SimplePanel&amp;gt;
  &amp;lt;g:Button ui:field="button"&amp;gt;Save&amp;lt;/g:Button&amp;gt;
  &amp;lt;/g:SimplePanel&amp;gt;
  
  &amp;lt;div id="todolist"&amp;gt;
  &amp;lt;g:FlowPanel&amp;gt;
   &amp;lt;g:Label text="What you have to do" width="100%" height="100%" styleName="{style.big}"/&amp;gt;
   &amp;lt;p1:CellTable ui:field="todoTable"/&amp;gt;
  &amp;lt;/g:FlowPanel&amp;gt;
  &amp;lt;/div&amp;gt;
  
 &amp;lt;/g:HTMLPanel&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
C’est un mélange de HTML et de balises spécifiques à GWT.&lt;br /&gt;
&lt;br /&gt;
Revenons à notre designer. Si on selectionne un champ, on peut renseigner la variable “UiField” dans la zone “Properties”.  Lorsqu’on renseigne cette variable, un champ est créé dans la classe Java correspondant à notre composant graphique. On peut ensuite manipuler ce champ depuis le code, par exemple pour changer la valeur d’un label lors d’un évenement de clic.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Interception d’un évenement&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
Lors d’un clic sur le bouton Save, on peut déclencer l’enregistrement d’une tache :&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="java" name="code"&gt;@UiHandler("button")
 void onButtonClick(ClickEvent event) {
  //evenement ici 
 }
&lt;/pre&gt;&lt;br /&gt;
Il est possible de&amp;nbsp;générer&amp;nbsp;ce bout de code depuis GWT Designer en effectuant un&amp;nbsp;clic&amp;nbsp;droit sur le bouton Save puis en sélectionnant &lt;b&gt;Add event handler -&amp;gt; onClick&lt;/b&gt;&lt;br /&gt;
Nous verrons dans la suite de l'article le détail de cette méthode.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Création d’un service asynchrone&lt;/b&gt;&lt;br /&gt;
Nous allons créer un service côté serveur qui sera appelé de manière asynchrone par le client GWT.&lt;br /&gt;
Dans le menu du projet, cliquez sur &lt;b&gt;New-&amp;gt; GWT RemoteService &lt;/b&gt;&lt;br /&gt;
Créez ensuite une classe nommée TodoService.&lt;br /&gt;
&lt;br /&gt;
Le plugin va générer une interface TodoService et une classe TodoServiceImpl.&lt;br /&gt;
&lt;br /&gt;
Rajoutons ces méthodes dans l’interface :&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="java" name="code"&gt;List&amp;lt;Todo&amp;gt; getTodos();
 List&amp;lt;Todo&amp;gt; addTodo(Todo todo);
&lt;/pre&gt;&lt;br /&gt;
Nous avons donc une méthode pour récupérer les taches existantes et une autre pour en créer de nouvelles.&lt;br /&gt;
Le plugin propose de générer une interface  jumelle de TodoService, TodoServiceAsync qui prend en compte l’aspect asynchrone des appels. C’est cette interface que nous appellerons depuis la gestion d'évènements des widgets GWT.&lt;br /&gt;
&lt;br /&gt;
Nous pouvons à présent coder la partie implémentation du service : &lt;br /&gt;
On y ajoute le code suivant :&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="java" name="code"&gt;//This is a mock for the Database
private List&amp;lt;Todo&amp;gt; todos = Arrays.asList(new Todo("truc1", "un truc", new Date()),new Todo("truc2", "un autre truc", new Date()));
 
 @Override
 public List&amp;lt;Todo&amp;gt; getTodos() {
  return todos;
 }

 @Override
 public List&amp;lt;Todo&amp;gt; addTodo(Todo todo) {
  todos = new ArrayList&amp;lt;Todo&amp;gt;(todos);
  todos.add(todo);
  Collections.sort(todos);
  return todos;
 }
&lt;/pre&gt;La liste “todos” permet simplement de simuler une base de données pour simplifier cet exemple.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Paramétrage du tableau de données&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
Retournons maintenant côté client, pour paramétrer la manière dont le tableau va afficher les données en appelant le service.&lt;br /&gt;
On ajoute ce code dans le constructeur de la classe TodoList :&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="java" name="code"&gt;provider = new AsyncDataProvider&amp;lt;Todo&amp;gt;() {

   @Override
   protected void onRangeChanged(HasData&amp;lt;Todo&amp;gt; display) {
    todoService.getTodos(new AsyncCallback&amp;lt;List&amp;lt;Todo&amp;gt;&amp;gt;() {

     @Override
     public void onFailure(Throwable caught) {
      caught.printStackTrace();
     }

     @Override
     public void onSuccess(List&amp;lt;Todo&amp;gt; result) {
      updateRowData(0, result);
      
     }
    });
    
   }
  };
  provider.addDataDisplay(todoTable);
  
  TextColumn&amp;lt;Todo&amp;gt; todoNameColumn = new TextColumn&amp;lt;Todo&amp;gt;() {

   @Override
   public String getValue(Todo todo) {
    return todo.getName();
   }
  };
  
  TextColumn&amp;lt;Todo&amp;gt; todoDescriptionColumn = new TextColumn&amp;lt;Todo&amp;gt;() {

   @Override
   public String getValue(Todo todo) {
    return todo.getDescription();
   }
  };
  
  TextColumn&amp;lt;Todo&amp;gt; todoDateColumn = new TextColumn&amp;lt;Todo&amp;gt;() {

   @Override
   public String getValue(Todo todo) {
    DateTimeFormat fmt = DateTimeFormat.getFormat("dd/MM/yyyy");
    return fmt.format(todo.getDate());
   }
   
  };
  
  todoTable.addColumn(todoNameColumn, "Name");
  todoTable.addColumn(todoDescriptionColumn, "Description");
  todoTable.addColumn(todoDateColumn, "Due date");
&lt;/pre&gt;&lt;br /&gt;
On a ajouté 3 colonnes qui correspondent aux informations que l'on peut rentrer dans le formulaire.&lt;br /&gt;
&lt;br /&gt;
L'objet provider permet de charger la liste des taches en appelant notre service asynchrone. &lt;br /&gt;
En cas de succès on charge tous les objets à partir du rang 0 (on ne gère pas la pagination dans cet exemple).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Appeler le service depuis un clic bouton&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
Nous pouvons maintenant compléter l'évènement que nous avons associé à notre bouton :&lt;br /&gt;
&lt;pre class="java" name="code"&gt;@UiHandler("button")
 void onButtonClick(ClickEvent event) {
  if (!nameField.getText().equals("")){
  Todo todo = new Todo(nameField.getText(), descriptionField.getText(),dateField.getValue());
  todoService.addTodo(todo, new AsyncCallback&amp;lt;List&amp;lt;Todo&amp;gt;&amp;gt;() {
   
   @Override
   public void onSuccess(List&amp;lt;Todo&amp;gt; result) {
    provider.updateRowData(0, result);
   }
   
   @Override
   public void onFailure(Throwable caught) {
    caught.printStackTrace();
   }
  });
  }
 }
&lt;/pre&gt;Un clic sur le bouton appelle le service pour ajouter une tache et recharge le tableau à partir du résultat obtenu, en appelant la méthode updateRowData. &lt;br /&gt;
&lt;br /&gt;
Pour terminer, nous allons modifier la page principale de l'application GWT pour y ajouter la liste de taches:&lt;br /&gt;
&lt;pre class="java" name="code"&gt;/**
  * This is the entry point method.
  */
 public void onModuleLoad() {

  RootPanel.get().add(new TodoList());
  
 }
&lt;/pre&gt;&lt;br /&gt;
Et voilà, notre mini appli est fonctionnelle! En conclusion on peut dire qu'avec cet outillage on obtient quelque chose de comparable à l'environnement de développement Flex, mais avec pour cible des applications HTML 5 au lieu de reposer sur la plateforme Flash. Et tout ça en gardant les outils de développement que l'on a dans le monde Java. A ce propos je vous conseille de tester les capacités de debug de GWT, c'est assez bluffant : le framework permet d'intercepter dans le code Java les&amp;nbsp;évènements&amp;nbsp;qui sont en fait exécutés côté client en JavaScript! On peut alors analyser les variables comme si on était entrain de debugger du pur Java. C'est aussi là qu'on voit la puissance de GWT.&lt;br /&gt;
&lt;br /&gt;
Pour télécharger le code source &lt;a href="http://dl.dropbox.com/u/7549438/blog/TodoApp.7z"&gt;cliquez ici&lt;/a&gt;&lt;br /&gt;
Pour savoir comment déployer cette application dans le cloud sur Google App Engine vous pouvez regarder &lt;a href="http://coffeebean.loicdescotte.com/2010/10/exposer-un-service-restjson-sur-le.html"&gt;ce post&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1231386620637429487-1356339180124673090?l=coffeebean.loicdescotte.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/IUKF/~4/AD1cc6zhA4c" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://coffeebean.loicdescotte.com/2011/02/premiere-appli-gwt-avec-uibinder-et-gwt.html#comment-form" title="4 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/1356339180124673090?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/1356339180124673090?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/IUKF/~3/AD1cc6zhA4c/premiere-appli-gwt-avec-uibinder-et-gwt.html" title="Première appli GWT avec UiBinder et GWT Designer" /><author><name>Loïc Descotte</name><uri>http://www.blogger.com/profile/04087832203101001752</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_RfOlS-mqesc/Sri7_Inis3I/AAAAAAAABjo/64rI4AFXLRs/S220/n576917464_5655.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-HFW5V4vzr7E/TVzkDlJZhWI/AAAAAAAAChw/KOJPi0clLNc/s72-c/1.png" height="72" width="72" /><thr:total>4</thr:total><feedburner:origLink>http://coffeebean.loicdescotte.com/2011/02/premiere-appli-gwt-avec-uibinder-et-gwt.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0MEQ3g_cSp7ImA9WhRTFUs.&quot;"><id>tag:blogger.com,1999:blog-1231386620637429487.post-610936470767937499</id><published>2011-01-19T18:20:00.007+01:00</published><updated>2011-11-06T08:43:22.649+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-06T08:43:22.649+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Play" /><category scheme="http://www.blogger.com/atom/ns#" term="JSON" /><category scheme="http://www.blogger.com/atom/ns#" term="REST" /><category scheme="http://www.blogger.com/atom/ns#" term="planetplay" /><title>How to export objects as JSON with Play framework</title><content type="html">With Play, it is extremely easy to create a REST service that exposes some model objects in JSON format.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
If we write this line in the routes file :&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="xml" name="code"&gt;GET /albums.json            Application.listAlbumsInJson
&lt;/pre&gt;&lt;br /&gt;
And this method in the controller : &lt;br /&gt;
&lt;br /&gt;
&lt;pre class="java" name="code"&gt;public static void listAlbumsInJson(){
        List&amp;lt;Album&amp;gt; albums = Album.findAll();
        renderJSON(albums);
    }
&lt;/pre&gt;&lt;br /&gt;
Calling http://myapp/albums.json URL will return the album list in JSON format. It could not be simpler!&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Another trick&lt;/b&gt; (I discovered on &lt;a href="http://www.zengularity.com/"&gt;zengularity.com&lt;/a&gt; website) : to determine the data format directly from the URL, it is possible to use this syntax in the routes file :&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="xml" name="code"&gt;GET /albums.{&amp;lt;json|xml&amp;gt;format} Application.listAlbums
&lt;/pre&gt;&lt;br /&gt;
If we call /albums.xml , Play will call listAlbums() with the 'format' parameter set to 'xml', and calling /albums.json will set the same parameter to 'json'. &lt;br /&gt;
&lt;br /&gt;
We can use it in the controller : &lt;br /&gt;
&lt;br /&gt;
&lt;pre class="java" name="code"&gt;public static void listAlbums() {
               List&amp;lt;Album&amp;gt; albums = Album.all().fetch();
         if(request.format.equals("json"))
            renderJSON(albums);
         else render(albums);
    }
&lt;/pre&gt;&lt;br /&gt;
If you reach /albums.xml, Play will look for an XML template file named listAlbums.xml (an other file extension would work too).&lt;br /&gt;
&lt;br /&gt;
For more information about writing REST (and XML) API with Play, you can read &lt;a href="http://coffeebean.loicdescotte.com/2010/05/how-to-write-restxml-api-with-play.html"&gt;this post&lt;/a&gt;.&lt;br /&gt;
I also updated my &lt;a href="http://code.google.com/p/vote4music/"&gt; Play sample application&lt;/a&gt; by adding some JSON services.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1231386620637429487-610936470767937499?l=coffeebean.loicdescotte.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/IUKF/~4/QQd0ztmqDnA" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://coffeebean.loicdescotte.com/2011/01/how-to-export-objects-to-json-with-play.html#comment-form" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/610936470767937499?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/610936470767937499?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/IUKF/~3/QQd0ztmqDnA/how-to-export-objects-to-json-with-play.html" title="How to export objects as JSON with Play framework" /><author><name>Loïc Descotte</name><uri>http://www.blogger.com/profile/04087832203101001752</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_RfOlS-mqesc/Sri7_Inis3I/AAAAAAAABjo/64rI4AFXLRs/S220/n576917464_5655.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://coffeebean.loicdescotte.com/2011/01/how-to-export-objects-to-json-with-play.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0MHRX85eyp7ImA9WhRTFUs.&quot;"><id>tag:blogger.com,1999:blog-1231386620637429487.post-1119099128390178647</id><published>2011-01-19T11:19:00.010+01:00</published><updated>2011-11-06T08:43:54.123+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-06T08:43:54.123+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Play" /><category scheme="http://www.blogger.com/atom/ns#" term="JSON" /><category scheme="http://www.blogger.com/atom/ns#" term="REST" /><title>Play framework : exporter ses objets en JSON</title><content type="html">Avec Play il est extrêmement facile de créer un service REST qui expose les objets du modèle au format JSON.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Si on écrit cette ligne dans le fichier routes :&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="xml" name="code"&gt;GET /albums.json            Application.listAlbumsInJson
&lt;/pre&gt;&lt;br /&gt;
Et cette méthode dans le contrôleur :&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="java" name="code"&gt;public static void listAlbumsInJson(){
        List&amp;lt;Album&amp;gt; albums = Album.findAll();
        renderJSON(albums);
    }
&lt;/pre&gt;&lt;br /&gt;
L'appel de l'URL http://monappli/albums.json renverra directement notre liste d'objets albums au format JSON. Difficile de faire plus simple!&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Autre astuce&lt;/b&gt; (que j'ai découvert grâce site &lt;a href="http://www.zengularity.com/"&gt;zengularity.com&lt;/a&gt;) : pour déterminer directement le format de données à partir de l'URL, il est possible d'utiliser cette syntaxe dans le fichier routes :&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="xml" name="code"&gt;GET /albums.{&amp;lt;json|xml&amp;gt;format} Application.listAlbums
&lt;/pre&gt;&lt;br /&gt;
En appelant /albums.xml , Play appelera la méthode listAlbums() avec le paramètre 'format' initialisé à 'xml', et en appelant /albums.json ce même paramètre aura la valeur 'json'. &lt;br /&gt;
&lt;br /&gt;
On peut ensuite s'en servir dans le contrôleur : &lt;br /&gt;
&lt;br /&gt;
&lt;pre class="java" name="code"&gt;public static void listAlbums() {
               List&amp;lt;Album&amp;gt; albums = Album.all().fetch();
         if(request.format.equals("json"))
            renderJSON(albums);
         else render(albums);
    }
&lt;/pre&gt;&lt;br /&gt;
Si vous tapez l'URL /albums.xml, Play cherchera un fichier de template XML nommé listAlbums.xml (une autre extension fonctionnerait aussi) pour effectuer le rendu.&lt;br /&gt;
&lt;br /&gt;
Pour en savoir plus sur l'écriture de services REST avec Play (notamment sur les templates XML) vous pouvez consulter &lt;a href="http://coffeebean.loicdescotte.com/2010/05/exposer-sur-api-restxml-avec-play.html"&gt;cet article&lt;/a&gt;.&lt;br /&gt;
J'ai également mis à jour mon&lt;a href="http://code.google.com/p/vote4music/"&gt; application d'exemple&lt;/a&gt; pour Play framework pour exposer des services en JSON en plus du XML.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1231386620637429487-1119099128390178647?l=coffeebean.loicdescotte.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/IUKF/~4/msuU-kqFJoE" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://coffeebean.loicdescotte.com/2011/01/play-framework-exporter-ses-objets-en.html#comment-form" title="1 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/1119099128390178647?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/1119099128390178647?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/IUKF/~3/msuU-kqFJoE/play-framework-exporter-ses-objets-en.html" title="Play framework : exporter ses objets en JSON" /><author><name>Loïc Descotte</name><uri>http://www.blogger.com/profile/04087832203101001752</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_RfOlS-mqesc/Sri7_Inis3I/AAAAAAAABjo/64rI4AFXLRs/S220/n576917464_5655.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://coffeebean.loicdescotte.com/2011/01/play-framework-exporter-ses-objets-en.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEAMRnk5cCp7ImA9Wx9XF04.&quot;"><id>tag:blogger.com,1999:blog-1231386620637429487.post-9062749483372668162</id><published>2011-01-10T19:15:00.009+01:00</published><updated>2011-01-11T10:06:27.728+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-11T10:06:27.728+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Musique" /><category scheme="http://www.blogger.com/atom/ns#" term="HS" /><title>[Hors série Musique] Rétrospective 2010</title><content type="html">Pour une fois je ne vais pas vous parler de Java ni même d'informatique, mais de musique (mon autre passion). Je vais essayer de revenir sur les albums qui m'ont le plus marqué durant l'année 2010. Il y aura du Rock, du Jazz, du Metal... Pas uniquement des albums sortis l'année dernière, mais aussi ceux que j'ai découvert ou re-découvert durant cette période et qui ont occupé le poste de ma voiture.&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;b&gt;Porcupine Tree - Atlanta (Rock progressif - 2010)&lt;/b&gt;&lt;br /&gt;
&lt;a href="http://3.bp.blogspot.com/_RfOlS-mqesc/TSrphAY6b9I/AAAAAAAACg8/7imJJFTP_Hc/s1600/Porcupine-Tree-Atlanta.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://3.bp.blogspot.com/_RfOlS-mqesc/TSrphAY6b9I/AAAAAAAACg8/7imJJFTP_Hc/s200/Porcupine-Tree-Atlanta.jpg" width="195" /&gt;&lt;/a&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Cet album live uniquement disponible en téléchargement a été lancé pour soutenir&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&amp;nbsp;une oeuvre&amp;nbsp;caritative. Enregistré durant la tournée de l'album &amp;nbsp;&lt;/span&gt;&lt;b&gt;Fear Of A Blank Planet&lt;/b&gt; (mon préféré), on y retrouve un certains nombre de classiques d'époques&amp;nbsp;antérieures&amp;nbsp;comme &lt;b&gt;Dark Matter&lt;/b&gt; ou &lt;b&gt;A Smart Kid.&lt;/b&gt;&amp;nbsp;Mais la setlist est surtout orientée vers les derniers titres du groupe comme &lt;b&gt;Anesthetize &lt;/b&gt;ou &lt;b&gt;Let's sleep together,&lt;/b&gt; qui surpasse la version studio en y apportant une énergie supplémentaire. Le son et le jeu du groupe sont excellents. Gavin Harisson qui a reçu plusieurs "awards" pour ses performances à la batterie est impressionnant et apporte un groove indéniable aux prestations du groupe.&amp;nbsp;Un futur classique pour les amateurs de rock progressif!&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.burningshed.com/store/porcupinetree/product/51/2213/"&gt;Télécharger l'album&lt;/a&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;The Ocean - Anthropocentric (Post Metal - 2010)&lt;/b&gt;&lt;br /&gt;
&lt;a href="http://3.bp.blogspot.com/_RfOlS-mqesc/TSr8KM2JTnI/AAAAAAAAChM/dekc2_SHW7s/s1600/theocean_anthropocentric_cd_lg.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://3.bp.blogspot.com/_RfOlS-mqesc/TSr8KM2JTnI/AAAAAAAAChM/dekc2_SHW7s/s200/theocean_anthropocentric_cd_lg.jpg" width="200" /&gt;&lt;/a&gt;The Ocean nous a gratifié de deux albums en 2010. En fait il s'agit plutôt d'un concept album en 2 parties.&lt;br /&gt;
La première partie &lt;b&gt;Heliocentric &lt;/b&gt;est beaucoup plus calme que ce que le groupe a l'habitude de nous proposer. Les ballades y sont nombreuses, les&amp;nbsp;violoncelles&amp;nbsp;et les pianos très présents. Un bon album mais qui a laissé le public un peu sur sa faim à cause de son côté parfois "mielleux".&amp;nbsp;Heureusement&amp;nbsp;la&amp;nbsp;deuxième&amp;nbsp;partie&amp;nbsp;&lt;b&gt;Anthropocentric &lt;/b&gt;a mis tout le monde d'accord avec une orientation bien plus sombre et agressive. Il faut dire que c'est dans ce registre que le groupe excelle vraiment. Le morceau titre annonce tout de suite la couleur avec une ambiance lourde et des passages plus calmes qui&amp;nbsp;rappellent&amp;nbsp;&lt;b&gt;Opeth&lt;/b&gt;. La trilogie&amp;nbsp;&lt;b&gt;The Grand Inquisitor &lt;/b&gt;est tout simplement excellente. L'album cache même quelques trésors de musique&amp;nbsp;atmosphérique&amp;nbsp;et&amp;nbsp;planante&amp;nbsp;comme le morceau instrumental&amp;nbsp;&lt;b&gt;Wille Zum Untergang.&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
&lt;a href="http://www.myspace.com/theoceancollective"&gt;Ecouter sur myspace&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Opeth -&amp;nbsp;In Live Concert at the Royal Albert Hall (Metal progressif - 2010)&lt;/b&gt;&lt;br /&gt;
&lt;a href="http://1.bp.blogspot.com/_RfOlS-mqesc/TSrpgi4iLDI/AAAAAAAACg4/wUz6W9M_c6g/s1600/Opeth-Live.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://1.bp.blogspot.com/_RfOlS-mqesc/TSrpgi4iLDI/AAAAAAAACg4/wUz6W9M_c6g/s200/Opeth-Live.jpg" width="151" /&gt;&lt;/a&gt;&lt;br /&gt;
Reprenant une&amp;nbsp;célèbre&amp;nbsp;pochette de Deep Purple, cet album live a été enregistré pour l'anniversaire du groupe (20 ans déjà!). Il reprend l'intégralité de l'album &lt;b&gt;BlackWater Park &lt;/b&gt;qui fêtait quand-à lui ses 10 ans. La deuxième partie de ce live retrace l'histoire du groupe et reprend un morceau de chacun de leurs albums, du plus ancien au plus récent.&lt;br /&gt;
&lt;br /&gt;
Le son de ce live est excellent. Puissant et chaud. La sélection des titres est très bonne aussi, même si avec ce genre de formule on ne peut pas avoir toutes les chansons qu'on voudrait (un seul morceau pour l'album Deliverence c'est trop peu!!). Mais on a quand même 3 CD (et un DVD selon l'édition) donc on en a pour notre argent. Indispensable pour tout fan d'Opeth ou de Metal en général.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;a href="http://open.spotify.com/album/3lYZwB8YHVLhTlpIbGVn5p"&gt;Ecouter sur Spotify&lt;/a&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;Anathema - Where the Light is&lt;/b&gt;&amp;nbsp;&lt;b&gt;(Rock progressif/atmosphérique&amp;nbsp;- 2010)&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/_RfOlS-mqesc/TSrpeTBhYrI/AAAAAAAACgk/hsN8ziC48jI/s1600/Anathema-We-re-Here-Because-We-re-Here.jpg" imageanchor="1" style="clear: left; display: inline !important; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/_RfOlS-mqesc/TSrpeTBhYrI/AAAAAAAACgk/hsN8ziC48jI/s200/Anathema-We-re-Here-Because-We-re-Here.jpg" width="200" /&gt;&lt;/a&gt;Cet album d'Anathema était attendu depuis longtemps puisque leur dernier opus datait de 2003. En sept ans le style du groupe a évolué vers quelque chose de plus léger, plus planant. En effet les anglais qui nous avaient habitué à un rock sombre voire déprimant (mais néanmoins magnifique) semblent avoir repris gout à la vie. Ont-ils pour autant perdu leur identité? Pas du tout, ils nous livrent même un de leurs meilleurs albums. La patte de Steven Wilson (le leader de Porcupine Tree), qui a produit l'album, se fait sentir et ce n'est pas non plus pour me déplaire. En conclusion, un bel album à écouter pour se détendre, bien assis dans son canapé en rentrant du boulot.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;a href="http://www.deezer.com/fr/music/anathema#music/anathema/we-re-here-because-we-re-here-541849"&gt;Ecouter sur Deezer&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;Avenged Sevenfold - Nightmare&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_RfOlS-mqesc/TSrpfNx8_VI/AAAAAAAACgo/uXkkhpEtdH8/s1600/avenged-sevenfold-nightmare1.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://3.bp.blogspot.com/_RfOlS-mqesc/TSrpfNx8_VI/AAAAAAAACgo/uXkkhpEtdH8/s200/avenged-sevenfold-nightmare1.jpg" style="cursor: move;" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Je ne connaissais pas du tout ce groupe avant d'apprendre que &lt;b&gt;Mike Portnoy&lt;/b&gt;, ex-Dream Theater, avait enregistré leur dernier album pour remplacer leur défunt batteur . Visiblement ce groupe est soit adoré, soit&amp;nbsp;détesté&amp;nbsp;pour le côté "mainstream" de leur musique, et aussi&amp;nbsp;parce-qu'ils ont eu un certains succès&amp;nbsp;auprès&amp;nbsp;des&amp;nbsp;adolescents&amp;nbsp;au début de leur carrière.&lt;/div&gt;&lt;div&gt;Ce groupe qui fait maintenant du Heavy Metal a commencé par un style plus proche du Hardcore. Leur musique, bien que résolument Heavy dans cet album, a encore quelques sonorités qui peuvent rappeler cette époque. Moi qui déteste le punk et le "teenage rock" au plus haut point, je dois dire cet aspect ne m'a finalement pas dérangé. Le groupe joue avec une énergie débordante, l'influence des grands du Heavy Metal, et tout particulièrement de Metallica, se fait sentir tout au long du disque. Techniquement les musiciens sont au top, un travail énorme est fait sur l'harmonisation des guitares.&lt;br /&gt;
Pour agrémenter le tout, la voix du chanteur est excellente, entre celle d'Axl Rose et celle de James Hetfield. Ajoutez à tout ça des riffs super puissants (à la Metallica encore&amp;nbsp;une&amp;nbsp;fois), des solos de virtuose et des refrains vraiment accrocheurs, presque FM (d'où des critiques par certains metaleux pur souche) et vous obtiendrez des morceaux qui vous resteront dans la tête un bon moment!&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;a href="http://open.spotify.com/album/7vfuTRXIAYJz5Uc8SddnTr"&gt;Ecouter sur Spotify&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Demians - Mute (Rock progressif - 2010)&lt;/b&gt;&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;a href="http://3.bp.blogspot.com/_RfOlS-mqesc/TSrpf7EVftI/AAAAAAAACgw/0yJO3OE9q6Y/s1600/DEMIANS-MUTE.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://3.bp.blogspot.com/_RfOlS-mqesc/TSrpf7EVftI/AAAAAAAACgw/0yJO3OE9q6Y/s200/DEMIANS-MUTE.jpg" style="cursor: move;" width="200" /&gt;&lt;/a&gt;Le premier français de cette rétrospective. Nicolas Chapel, chanteur et multi instrumentiste a réalisé cet album entièrement seul. Il y joue guitares, basse, batterie, claviers. Il tient également le micro et a enregistré et mixé le tout.&amp;nbsp;Impressionnant!&amp;nbsp;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;L'album contient des titres bien Rock, presque Metal comme &lt;b&gt;Swing of the airwaves, &lt;/b&gt;d'autres&lt;b&gt;&amp;nbsp;&lt;/b&gt;plus planants comme Porcelain. Les influences sont nombreuses, du rock progressif (certains passages&amp;nbsp;rappellent&amp;nbsp;&lt;b&gt;Oceansize)&lt;/b&gt;&amp;nbsp;à la musique orientale.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Une belle découverte!&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;a href="http://open.spotify.com/album/3XVl8mUrwKm1h2pvncTYYa"&gt;Ecouter sur Spotify&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;John Mayer Where the light (Blues/Pop - 2008)&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;a href="http://3.bp.blogspot.com/_RfOlS-mqesc/TSrpgV1GyaI/AAAAAAAACg0/1QliXNU5zDg/s1600/MayerLightIsCDCover.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="185" src="http://3.bp.blogspot.com/_RfOlS-mqesc/TSrpgV1GyaI/AAAAAAAACg0/1QliXNU5zDg/s200/MayerLightIsCDCover.jpg" style="cursor: move;" width="200" /&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Les albums studio de John Mayer, assez pop, ne m'avaient pas vraiment convaicu. Mais lorsque je suis tombé sur cet album live, j'ai vraiment été bluffé. Dans cet album, et je suppose dans tous ses concerts, c'est vraiment le Blues qui domine. John Mayer est vraiment un excellent guitariste, avec un jeu qui rappele&amp;nbsp;&amp;nbsp;Stevie Ray Vaughan&amp;nbsp;et Jimmy Hendrix. On retrouve d'ailleurs deux reprises de Hendrix et une autre de Ray Charles&lt;/span&gt;. Le côté Pop est toujours présent, il permet&amp;nbsp;d’amener&amp;nbsp;des refrains catchy entre 2 solos de guitare pour offrir un blues moderne et peut&amp;nbsp;être&amp;nbsp;plus accessible.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;a href="http://open.spotify.com/album/4Dgxy95K9BWkDUvQPTaYBb"&gt;Ecouter sur Spotify&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: -webkit-auto;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;b&gt;King Crimson - Red (Rock progressif - 1974)&lt;/b&gt;&lt;br /&gt;
&lt;a href="http://1.bp.blogspot.com/_RfOlS-mqesc/TSrpx13EQ4I/AAAAAAAAChI/Vx0hwEFpbfk/s1600/File_King_Crimson_Red.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="199" src="http://1.bp.blogspot.com/_RfOlS-mqesc/TSrpx13EQ4I/AAAAAAAAChI/Vx0hwEFpbfk/s200/File_King_Crimson_Red.jpg" width="200" /&gt;&lt;/a&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
La première moitié des années 70 a été d'une incroyable richesse. Cet album est sorti entre The Dark Side Of The Moon et Wish You Were Here de Pink Floyd, deux autres albums majeurs du rock progressif.&lt;br /&gt;
RED est un des disque les plus aboutis musicalement que j'ai pu entendre. Un subtil mélange de rock progressif et de jazz.&lt;br /&gt;
Des morceaux comme Fallen Angel ou Starless sont vraiment bluffant, le mélange des guitare, violons et saxophones fonctionne parfaitement et les morceaux sont d'une intensité rare.&lt;br /&gt;
Dur à décrire, à écouter absoluement!&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;Clifford Brown - The definitive (Jazz - 2002) &amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;a href="http://2.bp.blogspot.com/_RfOlS-mqesc/TSrpflzy8xI/AAAAAAAACgs/QocaIarekQU/s1600/clifford.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/_RfOlS-mqesc/TSrpflzy8xI/AAAAAAAACgs/QocaIarekQU/s200/clifford.jpg" width="196" /&gt;&lt;/a&gt;Cet album contient les plus vieux morceaux de cette&amp;nbsp;sélection. Clifford Brown,&amp;nbsp;trompettiste&amp;nbsp;décédé tragiquement à 26 ans dans un accident de voiture en 1956, a tout de même eu le temps d'enregistrer un nombre&amp;nbsp;impressionnant&amp;nbsp;de titres. Cette compilation en est un excellent témoignage.&lt;br /&gt;
On trouve quelques guest stars, dont un duo avec Sarah Vaughan des plus&amp;nbsp;sympathiques. &lt;br /&gt;
Malgré&amp;nbsp;l'âge de ces enregistrements, le son est très net et très chaud. &lt;br /&gt;
Si vous aimez Miles Davis, je ne peux que vous conseiller d'écouter cet autre grand&amp;nbsp;trompettiste.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://open.spotify.com/album/5oNoujZAGVi1Ks6uPrYTGC"&gt;Ecouter sur Spotify&lt;/a&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;Ultra Vomit - Objectif Thunes (Metal parodique)&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; font-weight: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: center;"&gt;&lt;b&gt;&lt;a href="http://2.bp.blogspot.com/_RfOlS-mqesc/TSrphwLAPaI/AAAAAAAAChE/2iT49yZknWY/s1600/Ultra-Vomit-objectif-thunes.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/_RfOlS-mqesc/TSrphwLAPaI/AAAAAAAAChE/2iT49yZknWY/s200/Ultra-Vomit-objectif-thunes.jpg" width="200" /&gt;&lt;/a&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Certains les&amp;nbsp;appellent&amp;nbsp;"les inconnus du Metal" en référence au&amp;nbsp;célèbre&amp;nbsp;trio d'humoristes. La musique d'Ultra Vomit est à prendre uniquement au second degrès. Parodies et humour décalé sur une musique entrainante et interprétée par d'excellents musiciens. Je les ai vu en concert à Grenoble en Décembre et l'ambiance était vraiment au rendez vous. Vous pouvez voir un autre concert en vidéo &lt;a href="http://www.goeland-tv.com/lives/ultra-vomit/ultra-vomit-en-concert-au-soundbox"&gt;ici&lt;/a&gt;.&lt;/div&gt;&lt;br /&gt;
Si vous n'aimez pas trop le Metal vous pouvez regarder du côté d'&lt;a href="http://www.myspace.com/andreasetnicolas"&gt;Andreas et Nicolas&lt;/a&gt;, un autre projet du chanteur d'Ultra Vomit, beaucoup plus "chanson française" mais toujours aussi drôle.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&lt;br /&gt;
&lt;div style="font-weight: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;&lt;b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="display: inline !important; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;a href="http://open.spotify.com/album/22iA5jPBM3myt1AamhdW72"&gt;Ecouter sur Spotify&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;i&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Et vous quels ont été vos albums favoris en 2010?&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1231386620637429487-9062749483372668162?l=coffeebean.loicdescotte.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/IUKF/~4/dRaTj5NESCM" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://coffeebean.loicdescotte.com/2011/01/hors-serie-musique-retrospective-2010.html#comment-form" title="14 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/9062749483372668162?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/9062749483372668162?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/IUKF/~3/dRaTj5NESCM/hors-serie-musique-retrospective-2010.html" title="[Hors série Musique] Rétrospective 2010" /><author><name>Loïc Descotte</name><uri>http://www.blogger.com/profile/04087832203101001752</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_RfOlS-mqesc/Sri7_Inis3I/AAAAAAAABjo/64rI4AFXLRs/S220/n576917464_5655.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_RfOlS-mqesc/TSrphAY6b9I/AAAAAAAACg8/7imJJFTP_Hc/s72-c/Porcupine-Tree-Atlanta.jpg" height="72" width="72" /><thr:total>14</thr:total><feedburner:origLink>http://coffeebean.loicdescotte.com/2011/01/hors-serie-musique-retrospective-2010.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A04HRX88eyp7ImA9Wx9QFk8.&quot;"><id>tag:blogger.com,1999:blog-1231386620637429487.post-1572522018820009185</id><published>2010-12-29T14:38:00.001+01:00</published><updated>2010-12-29T14:38:54.173+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-29T14:38:54.173+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Play" /><category scheme="http://www.blogger.com/atom/ns#" term="ebook" /><title>Un livre sur Play Framework</title><content type="html">Introducing Play! Framework, le premier livre sur Play vient de sortir en eBook dans sa version Beta. A cette occasion il est proposé à seulement 5£ (5,84 €) pour les 50 premiers acheteurs.&lt;br /&gt;
&lt;br /&gt;
Je viens d'en faire l'acquisition, c'est un livre en anglais qui va droit au but en&amp;nbsp;présentant&amp;nbsp;les concepts de Play en environ 200 pages. Les bases du framework (MVC, architecture stateless, services RESTful, utilisation d'AJAX...) &amp;nbsp;sont expliqués à l'aide d'exemples de code, ainsi que des notions plus avancées comme la sécurité, l'utilisation des WebSockets ou le développement de modules d'extension.&lt;br /&gt;
&lt;br /&gt;
Les derniers chapitres vous permettront de concrétiser toutes les connaissances&amp;nbsp;acquises durant la lecture&amp;nbsp;en développant 2 applications d'exemple : un racourciceur d'URL et un service de rappels&amp;nbsp;d'événements.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.the-play-book.co.uk/"&gt;Acheter le livre&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1231386620637429487-1572522018820009185?l=coffeebean.loicdescotte.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/IUKF/~4/tqQIoR96d0c" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://coffeebean.loicdescotte.com/2010/12/un-livre-sur-play-framework.html#comment-form" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/1572522018820009185?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/1572522018820009185?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/IUKF/~3/tqQIoR96d0c/un-livre-sur-play-framework.html" title="Un livre sur Play Framework" /><author><name>Loïc Descotte</name><uri>http://www.blogger.com/profile/04087832203101001752</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_RfOlS-mqesc/Sri7_Inis3I/AAAAAAAABjo/64rI4AFXLRs/S220/n576917464_5655.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://coffeebean.loicdescotte.com/2010/12/un-livre-sur-play-framework.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0ECR3w_fip7ImA9Wx9aEk4.&quot;"><id>tag:blogger.com,1999:blog-1231386620637429487.post-9136826454492218910</id><published>2010-12-15T19:34:00.007+01:00</published><updated>2011-03-04T10:41:06.246+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-04T10:41:06.246+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Play" /><category scheme="http://www.blogger.com/atom/ns#" term="planetplay" /><title>vote4music update (Play framework demo app)</title><content type="html">I've just updated my Play framework demo application.&lt;br /&gt;
&lt;br /&gt;
The new things are :&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;A new vote system (simpler javascript code)&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Album covers pictures management&lt;/li&gt;
&lt;li&gt;Some tests fixed and improved&lt;/li&gt;
&lt;li&gt;New JQuery effects&lt;/li&gt;
&lt;li&gt;Bugs fixed&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;More information and source code download &lt;a href="http://github.com/loicdescotte/vote4music"&gt;here&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;And don't be afraid to use Google code issue tracker if you find a bug :)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1231386620637429487-9136826454492218910?l=coffeebean.loicdescotte.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/IUKF/~4/apg2WcH2xX4" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://coffeebean.loicdescotte.com/2010/12/vote4music-update-play-framework-demo.html#comment-form" title="6 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/9136826454492218910?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/9136826454492218910?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/IUKF/~3/apg2WcH2xX4/vote4music-update-play-framework-demo.html" title="vote4music update (Play framework demo app)" /><author><name>Loïc Descotte</name><uri>http://www.blogger.com/profile/04087832203101001752</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_RfOlS-mqesc/Sri7_Inis3I/AAAAAAAABjo/64rI4AFXLRs/S220/n576917464_5655.jpg" /></author><thr:total>6</thr:total><feedburner:origLink>http://coffeebean.loicdescotte.com/2010/12/vote4music-update-play-framework-demo.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk8ARX05eCp7ImA9Wx9SE0o.&quot;"><id>tag:blogger.com,1999:blog-1231386620637429487.post-5773358057648607729</id><published>2010-11-20T15:42:00.021+01:00</published><updated>2010-12-03T12:14:04.320+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-03T12:14:04.320+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="iPhone" /><category scheme="http://www.blogger.com/atom/ns#" term="Mobile" /><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><category scheme="http://www.blogger.com/atom/ns#" term="jQuery" /><title>Un petit client JQuery mobile</title><content type="html">Ce billet fait suite à &lt;a href="http://coffeebean.loicdescotte.com/2010/10/exposer-un-service-restjson-sur-le.html"&gt;celui ci&lt;/a&gt; où nous avons appris à exposer un service REST/JSON côté serveur (sur le cloud) avec Google APP Engine. &lt;br /&gt;
&lt;br /&gt;
Voyons aujourd'hui comment consommer un tel service et afficher les résultats sur un téléphone en quelques lignes de javascript à l'aide de JQuery.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Le code suivant permet de récupérer un contenu JSON et d'itérer sur les entrées qu'il contient :&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="java" name="code"&gt;var entries = "http://api.monservice/entries.json";
$.each(data, function(i, entry){          
//traitement de l'élement entry d'indice i
&lt;/pre&gt;&lt;br /&gt;
Pour prendre un exemple un peu plus concret, nous allons utiliser l'API Twitter pour afficher une liste de tweets. Les messages seront insérés à l'interieur de l'élément &lt;i&gt;posts&lt;/i&gt;.&lt;br /&gt;
Après récupération de ces messages nous pouvons ajouter les traitements javascript que l'on veut. Dans notre cas nous allons filter les tweets qui font partie d'une conversation, en ignorant ceux qui commencent par '@': &lt;br /&gt;
&lt;br /&gt;
&lt;pre class="java" name="code"&gt;&amp;lt;head&amp;gt;
// include jquery...
&amp;lt;script type="text/javascript"&amp;gt;
function list(url){ $.getJSON( url, function( data ){        
     $('#posts').empty();       
     $.each(data, function(i, post){
                var author = post.user.screen_name;            
      var tweet = post.text;
            var reply = "@"
           // filtrage des tweets commençant par '@'
                if (tweet.substr(0, reply.length) != reply) {
                $('#posts').append(
                '&amp;lt;li&amp;gt;'
                  author
                  ' : '
                   tweet
                 '&amp;lt;/li&amp;gt;'
            );
         }
        });
    });
 }

$(document).ready(function(){ 
    var tweets = "http://api.twitter.com/1/statuses/user_timeline/loic_d.json&amp;amp;count=20&amp;amp;callback=?";
    list(tweets);
  
});
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt; 
&amp;lt;h1&amp;gt;Loic's Tweets&amp;lt;/h1&amp;gt;
    &amp;lt;ul id=&amp;quot;posts&amp;quot;&amp;gt;    
       &amp;lt;li&amp;gt;Getting tweets&amp;lt;/li&amp;gt;
    &amp;lt;/ul&amp;gt;        
&amp;lt;/body&amp;gt;
&lt;/pre&gt;N.B : L'option callback=? permet de demander à JQuery d'utiliser &lt;a href="http://blogs.codes-sources.com/cyril/archive/2007/08/22/jsonp-comment-faire-des-requete-json-cross-domain.aspx"&gt;JSONP&lt;/a&gt; pour éviter les problème de cross domain lors du rafraichissement de la page.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Mise en page pour les supports mobiles&lt;/b&gt;&lt;br /&gt;
JQuery mobile permet d'avoir une mise en page adaptée aux écrans de nos téléphones et tablettes.&lt;br /&gt;
Le code suivant génère 2 pages distinctes (tweets et about) à l'affichage avec un effet de "slide". De plus, nous pouvons déclarer notre liste ul comme une 'listview' :&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="xml" name="code"&gt;&amp;lt;body&amp;gt;
&amp;lt;!-- Première page --&amp;gt;
&amp;lt;div data-role="page" id="tweets"&amp;gt; 
&amp;lt;div data-role="header"&amp;gt;Twitter mobile client&amp;lt;/div&amp;gt; 
&amp;lt;div data-role="content"&amp;gt;
&amp;lt;div&amp;gt;
&amp;lt;h1&amp;gt;Loic's Tweets&amp;lt;/h1&amp;gt;
&amp;lt;ul id=&amp;quot;posts&amp;quot; data-role=&amp;quot;listview&amp;quot;&amp;gt;    
&amp;lt;li&amp;gt;Getting tweets&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt; 
&amp;lt;div data-role="footer"&amp;gt;Coffee Bean&amp;lt;/div&amp;gt; 
&amp;lt;p&amp;gt;&amp;lt;a href="#about"&amp;gt;About&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt; 
&amp;lt;/div&amp;gt; 

&amp;lt;!-- Seconde page --&amp;gt;
&amp;lt;div data-role="page" id="about"&amp;gt;
&amp;lt;div data-role="header"&amp;gt;
&amp;lt;h1&amp;gt;About&amp;lt;h1&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div data-role="content"&amp;gt; 
&amp;lt;p&amp;gt;Coffee Bean&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;With Java sauce&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;http://coffeebean.loicdescotte.com&amp;lt;/p&amp;gt;  
&amp;lt;p&amp;gt;&amp;lt;a href="#tweets"&amp;gt;Back to tweets&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt; 
&amp;lt;/div&amp;gt;
&amp;lt;div data-role="footer"&amp;gt;
&amp;lt;h4&amp;gt;Coffee Bean&amp;lt;/h4&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;/body&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
Et voilà, avec ces quelques lignes on obtient une petite page qui pourra tourner sur n'importe quel type de materiel et d'OS!&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://dl.dropbox.com/u/7549438/blog/mobile.html"&gt;Télécharger le fichier HTML complet. &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1231386620637429487-5773358057648607729?l=coffeebean.loicdescotte.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/IUKF/~4/zorLHHDtLQk" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://coffeebean.loicdescotte.com/2010/11/un-petit-client-jquery-mobile.html#comment-form" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/5773358057648607729?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/5773358057648607729?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/IUKF/~3/zorLHHDtLQk/un-petit-client-jquery-mobile.html" title="Un petit client JQuery mobile" /><author><name>Loïc Descotte</name><uri>http://www.blogger.com/profile/04087832203101001752</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_RfOlS-mqesc/Sri7_Inis3I/AAAAAAAABjo/64rI4AFXLRs/S220/n576917464_5655.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://coffeebean.loicdescotte.com/2010/11/un-petit-client-jquery-mobile.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcBSXs-fCp7ImA9WhZSFE0.&quot;"><id>tag:blogger.com,1999:blog-1231386620637429487.post-5686338590597773439</id><published>2010-11-04T14:15:00.007+01:00</published><updated>2011-03-29T14:50:58.554+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-29T14:50:58.554+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Scala" /><title>Pourquoi Scala? (Introduction)</title><content type="html">Vous entendez parler tous les jours de Scala, tous vos collègues vous disent que le langage Java est devenu sénile (surtout depuis que les modifications les plus intéressantes ont été reportées au jdk8) ? Vous ne savez pas à quoi peut bien servir ce fichu Scala et vous en avez marre de vous sentir idiot lors des discussions devant la machine à café? Cette petite introduction au langage est faite pour vous!&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
Scala est un langage de programmation statiquement typé, orienté objet et fonctionnel. Comme en Java on utilise le paradigme objet pour modéliser une application et les entités dont elle est composée, mais on a également la&amp;nbsp;possibilité d'implémenter les méthodes de nos classes en utilisant une approche&amp;nbsp;fonctionnelle.&lt;br /&gt;
Il est important de savoir que le code écrit en Scala est compilé en bytecode Java afin d'être exécuté sur une JVM. Ceci est une bonne nouvelle pour nous développeurs Java, puisqu'on ne repart pas de zéro sur une nouvelle plateforme : on pourra profiter de toute la richesse des bibliothèques Java, elles seront directement utilisables dans nos projets Scala.&lt;br /&gt;
&lt;br /&gt;
Pour trois petits problèmes simples de programmation, nous allons voir une solution classique en Java et comment Scala pourrait nous simplifier la tache.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Problème 1&lt;/b&gt;&lt;br /&gt;
J'ai un simple objet avec des attributs x et y. J'ai besoin d'avoir une encapsulation des champs car je veux exposer ma classe à travers une API, sans avoir à casser la compatibilité le jour où je voudrai renvoyer x+1 au lieu de x. Je veux aussi un constructeur utilisant ces champs.&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;Solution Java&lt;/u&gt;&lt;br /&gt;
J'encapsule mes champs avec des getters et setters, je crée un constructeur.&lt;br /&gt;
&lt;pre class="java" name="code"&gt;public class Rectange{

private int largeur;
private int longeur;

public Rectangle(int largeur, int longueur){
this.largeur=largeur;
this.longeur=longeur;
}

public int getLargeur(){
return largeur;
}

public void setLargeur(int largeur){
this.largeur=largeur;
}

public int getLongeur(){
return longeur;
}

public void setLongeur(int longeur){
this.longeur=longeur;
}

}
&lt;/pre&gt;&lt;br /&gt;
On constate qu'on a écrit beaucoup de code pour pas grand chose.... Les comportements de ces getters/setters et du&amp;nbsp;constructeur&amp;nbsp;pourraient être induits à partir d'un fonctionnement par défaut.&lt;br /&gt;
&lt;br /&gt;
C'est cette approche qui est privilégiée dans la &lt;u&gt;solution Scala :&lt;/u&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="java" name="code"&gt;class Rectangle(var largeur: Int, var longueur: Int)
&lt;/pre&gt;C'est tout! Si on a besoin de redéfinir un getter par la suite on pourra ajouter une méthode sans casser la compatibilité avec les classes appelantes (voir liens en bas du post si vous voulez rentrer dans les détails).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Problème 2&lt;/b&gt;&lt;br /&gt;
Je veux créer une liste d'entiers et la filtrer pour récupérer uniquement les entiers positifs.&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;Solution Java&lt;/u&gt;&lt;br /&gt;
&lt;pre class="java" name="code"&gt;List&amp;lt;Integer&amp;gt; liste = Arrays.asList(-1,2,-3,4,-5,6);
List&amp;lt;Integer&amp;gt; positifs = new ArrayList&amp;lt;Integer&amp;gt;();
for (Integer x : liste){
 if(x &amp;gt; 0)
  positifs.add(x) 
}
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;Solution Scala&lt;/u&gt;&lt;br /&gt;
&lt;pre class="java" name="code"&gt;val liste = List(-1,2,-3,4,-5,6)
val positifs = liste.filter(x=&amp;gt;x&amp;gt;0)
&lt;/pre&gt;On voit bien là la puissance de l'approche fonctionelle de Scala. On passe une fonction anonyme (lambda) à la méthode filter (fournie par l'API Scala) pour retourner une sous partie de notre liste. &lt;br /&gt;
Il est possible de &lt;a href="http://stackoverflow.com/questions/122105/java-what-is-the-best-way-to-filter-a-collection"&gt;définir des prédicats&lt;/a&gt; (ou d'utiliser &lt;a href="http://code.google.com/p/guava-libraries/"&gt;Guava&lt;/a&gt;) en Java pour se rapprocher d'une approche fonctionnelle, mais tant que les fonctions lambda seront absentes du langage, on ne pourra pas obtenir une syntaxe aussi élégante.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Problème 3&lt;/b&gt;&lt;br /&gt;
Je veux ouvrir et parcourir un fichier&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;Solution Java&lt;/u&gt;&lt;br /&gt;
&lt;pre class="java" name="code"&gt;String filePath = "fichier.txt";

try{
BufferedReader buff = new BufferedReader(new FileReader(filePath));
try {
List&amp;lt;String&amp;gt; lines = new ArrayList&amp;lt;String&amp;gt;();
while ((line = buff.readLine()) != null) {
lines.add(line);
}
} finally {
buff.close();
}
} catch (IOException ioe) {
System.out.println(ioe.toString());
}
&lt;/pre&gt;Un peu lourd et surtout pas très lisible (ah les checked exceptions de Java...) !&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;Solution Scala&lt;/u&gt;&lt;br /&gt;
&lt;pre class="java" name="code"&gt;val lines = Source.fromFile("fichier.txt").mkString
&lt;/pre&gt;Ça se passe de commentaires...&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Problème 4&lt;/b&gt;&lt;br /&gt;
Je veux écrire un singleton et y accéder&lt;b&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;Solution Java&lt;/u&gt;&lt;br /&gt;
&lt;pre class="java" name="code"&gt;public class MonSingleton {
    
    private MonSingleton () {
    }
 
    public static MonSingleton getInstance() {
        if (null == instance) {
            instance = new MonSingleton();
        }
        return instance;
    }

    private static MonSingleton instance;
 
 public void hello(){
System.out.println("hello");
}
}
&lt;/pre&gt;Pour arriver à mes fins j'ai rendu le constructeur par défaut privé, créé une instance statique et une méthode pour y accéder.&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;Solution Scala&lt;/u&gt;&lt;br /&gt;
&lt;pre class="java" name="code"&gt;object MonSingleton {
def hello() = {
  println("hello")
}
}
&lt;/pre&gt;&lt;br /&gt;
La notion d'objet en Scala permet de définir une instance unique de classe, donc un singleton. A chaque fois que j’accéderai à mon objet en appelant &lt;i&gt;MonSingleton.hello&lt;/i&gt;, ce sera la même instance qui sera utilisée.&lt;br /&gt;
&lt;br /&gt;
Tout ceci n'était qu'une mise en bouche, le langage offre beaucoup d'autres possibilités notamment par son approche fonctionnelle.&lt;br /&gt;
&lt;br /&gt;
Je vous suggère de regarder ces articles :&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Les &lt;a href="http://jawher.wordpress.com/2008/04/13/java-introduction-a-scala-classes-et-objets/"&gt;classes/objets&lt;/a&gt;, &amp;nbsp;les &lt;a href="http://jawher.wordpress.com/2008/08/04/java-introduction-a-scala-methodes-et-fonctions/"&gt;fonctions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Les &lt;a href="http://sylvain-leroux.developpez.com/scala/traits-scala-et-decorateurs"&gt;traits&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Les &lt;a href="http://www.jeuweb.org/showthread.php?tid=6739&amp;amp;pid=84503#pid84503"&gt;acteurs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1231386620637429487-5686338590597773439?l=coffeebean.loicdescotte.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/IUKF/~4/W8AI3bqpLVI" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://coffeebean.loicdescotte.com/2010/11/pourquoi-scala-introduction.html#comment-form" title="9 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/5686338590597773439?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/5686338590597773439?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/IUKF/~3/W8AI3bqpLVI/pourquoi-scala-introduction.html" title="Pourquoi Scala? (Introduction)" /><author><name>Loïc Descotte</name><uri>http://www.blogger.com/profile/04087832203101001752</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_RfOlS-mqesc/Sri7_Inis3I/AAAAAAAABjo/64rI4AFXLRs/S220/n576917464_5655.jpg" /></author><thr:total>9</thr:total><feedburner:origLink>http://coffeebean.loicdescotte.com/2010/11/pourquoi-scala-introduction.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUIBRXs4fCp7ImA9Wx9UFE4.&quot;"><id>tag:blogger.com,1999:blog-1231386620637429487.post-1840315588223636424</id><published>2010-10-22T08:35:00.013+02:00</published><updated>2011-02-11T15:12:34.534+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-11T15:12:34.534+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ROO" /><category scheme="http://www.blogger.com/atom/ns#" term="Spring" /><title>Spring ROO 1.1</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_RfOlS-mqesc/TMAH5_SitPI/AAAAAAAACd8/OKoi4Bt-9IM/s1600/Sans+titre.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="72" src="http://4.bp.blogspot.com/_RfOlS-mqesc/TMAH5_SitPI/AAAAAAAACd8/OKoi4Bt-9IM/s320/Sans+titre.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avions vu &lt;a href="http://coffeebean.loicdescotte.com/2009/05/introduction-spring-roo.html"&gt;il y a quelques temps&lt;/a&gt;&amp;nbsp;ce que &lt;a href="http://www.springsource.org/roo/"&gt;&lt;span id="goog_1757479805"&gt;&lt;/span&gt;Spring ROO&lt;span id="goog_1757479806"&gt;&lt;/span&gt;&lt;/a&gt; proposait dans une de ses toutes&amp;nbsp;premieres&amp;nbsp;versions.&lt;br /&gt;
Depuis j'ai suivi d'un oeil distrait les évolutions de ce framework. Cependant une annonce m'a particulièrement intéressée : Spring ROO intègre désormais GWT comme technologie de présentation. &lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;GWT est&amp;nbsp;décidément&amp;nbsp;en vogue du côté des frameworks RAD en ce moment. Play aussi propose une intégration avec GWT via &lt;a href="http://www.playframework.org/documentation/1.0.1/gwt"&gt;un module&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Voyons comment ROO a évolué en 1 an et demi. Nous allons créer le même projet que la dernière fois, une&amp;nbsp;bibliothèque&amp;nbsp;de films.&lt;br /&gt;
&lt;br /&gt;
La syntaxe a un peu changé. Cette série de commandes permet de créer notre projet, nos entités et nos CRUD, puis de générer et lancer des tests :&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="java" name="code"&gt;mkdir films
cd films
roo
roo&amp;gt; project --topLevelPackage com.loicdescotte.coffeebean.films
roo&amp;gt; persistence setup --provider HIBERNATE --database HYPERSONIC_IN_MEMORY
roo&amp;gt; entity --class ~.Film --testAutomatically
roo&amp;gt; field string --fieldName titre --notNull
roo&amp;gt; field string --fieldName realisateur
roo&amp;gt; field date --fieldName dateSortie --type java.util.Date
roo&amp;gt; controller all --package ~.web
roo&amp;gt; selenium test --controller ~.web.FilmController
roo&amp;gt; gwt setup
roo&amp;gt; perform tests
roo&amp;gt; quit
&lt;/pre&gt;&lt;br /&gt;
Il est assez impressionnant de voir tout ce qui est généré quand on tape ces commandes.&lt;br /&gt;
On obtient un projet maven complet avec des services Spring, une IHM GWT et des tests JUnit et Selenium.&lt;br /&gt;
En tapant "help" dans le shell ROO on&amp;nbsp;s’aperçoit qu'il existe un grand nombre de commandes et qu'il est possible de&amp;nbsp;générer&amp;nbsp;énormément de choses (provider JSON, listeners JMS, bundles OSGI ...).&lt;br /&gt;
Le code généré est toujours un mélange de classes Java et d'aspects écrits en AspectJ. Les aspects permettent d'enrichir le code Java, par exemple pour ajouter des fonctions de&amp;nbsp;persistance&amp;nbsp;aux objets du domaine.&lt;br /&gt;
&lt;br /&gt;
Voici la classe java pour mon entité Film :&lt;br /&gt;
&lt;pre class="java" name="code"&gt;@RooJavaBean
@RooToString
@RooEntity
@Entity
public class Film {

    @NotNull
    private String titre;

    private String realisateur;

    @Temporal(TemporalType.TIMESTAMP)
    @DateTimeFormat(style = "S-")
    private Date dateSortie;
}
&lt;/pre&gt;&lt;br /&gt;
Vous remarquerez qu'ici on ne s'embête pas avec les getters/setters, ils seront ajoutés dynamiquement. On gagne donc en lisibilité.&lt;br /&gt;
&lt;br /&gt;
A côté de ça on a un aspect pour la persistance de nos films (Film_ROO_Entity.aj):&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="java" name="code"&gt;privileged aspect Film_Roo_Entity {

 @PersistenceContext
    transient EntityManager Film.entityManager;
    
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long Film.id;

      public static long Film.countFilms() {
        return entityManager().createQuery("select count(o) from Film o", Long.class).getSingleResult();
    }
    
    public static List&amp;lt;Film&amp;gt; Film.findAllFilms() {
        return entityManager().createQuery("select o from Film o", Film.class).getResultList();
    }
    
    public static Film Film.findFilm(Long id) {
        if (id == null) return null;
        return entityManager().find(Film.class, id);
    }

@Transactional
    public void Film.persist() {
        if (this.entityManager == null) this.entityManager = entityManager();
        this.entityManager.persist(this);
    }
    
    @Transactional
    public void Film.remove() {
        if (this.entityManager == null) this.entityManager = entityManager();
        if (this.entityManager.contains(this)) {
            this.entityManager.remove(this);
        } else {
            Film attached = this.entityManager.find(this.getClass(), this.id);
            this.entityManager.remove(attached);
        }
    }

//...

&lt;/pre&gt;&lt;br /&gt;
Il y a aussi un aspect pour la méthode toString(), un autre pour les getters/setters.&lt;br /&gt;
&lt;br /&gt;
Quand j'ai découvert ROO j'ai été un peu rebuté par ce mode de fonctionnement.&amp;nbsp;Finalement je le trouve plutôt élégant, il permet de bien isoler les différentes responsabilités du code.&lt;br /&gt;
&lt;br /&gt;
Taper la commande maven suivante permet de lancer l'application :&lt;br /&gt;
&lt;pre class="java" name="code"&gt;mvn gwt:run
&lt;/pre&gt;&lt;br /&gt;
Et voilà le résultat : &lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_RfOlS-mqesc/TMEwk6Yh0JI/AAAAAAAACeI/qcykQqm5opo/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="307" src="http://2.bp.blogspot.com/_RfOlS-mqesc/TMEwk6Yh0JI/AAAAAAAACeI/qcykQqm5opo/s320/1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_RfOlS-mqesc/TMEwlbHSBjI/AAAAAAAACeM/zuh3_r6q8HE/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="304" src="http://2.bp.blogspot.com/_RfOlS-mqesc/TMEwlbHSBjI/AAAAAAAACeM/zuh3_r6q8HE/s320/2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Il est également possible de déployer notre application sur le Cloud avec &lt;a href="http://www.cloudfoundry.com/"&gt;CloudFroundry&lt;/a&gt; (un service de SpringSource reposant sur l’infrastructure d'Amazon), en utilisant &lt;a href="http://forum.springsource.org/showthread.php?p=267357"&gt;ce module&lt;/a&gt;. &lt;br /&gt;
&lt;br /&gt;
Tout est donc fait pour qu'on puisse créer et déployer rapidement une application, à un bémol près : attention si vous prenez l'offre d'essai gratuit d'Amazon AWS. On peut vite basculer dans le payant si on dépasse les quotas, il ne semble pas y avoir de verrou sur le paiement comme chez Google.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1231386620637429487-1840315588223636424?l=coffeebean.loicdescotte.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/IUKF/~4/HiwxiF9xh_Q" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://coffeebean.loicdescotte.com/2010/10/spring-roo-11.html#comment-form" title="5 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/1840315588223636424?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1231386620637429487/posts/default/1840315588223636424?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/IUKF/~3/HiwxiF9xh_Q/spring-roo-11.html" title="Spring ROO 1.1" /><author><name>Loïc Descotte</name><uri>http://www.blogger.com/profile/04087832203101001752</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://1.bp.blogspot.com/_RfOlS-mqesc/Sri7_Inis3I/AAAAAAAABjo/64rI4AFXLRs/S220/n576917464_5655.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_RfOlS-mqesc/TMAH5_SitPI/AAAAAAAACd8/OKoi4Bt-9IM/s72-c/Sans+titre.png" height="72" width="72" /><thr:total>5</thr:total><feedburner:origLink>http://coffeebean.loicdescotte.com/2010/10/spring-roo-11.html</feedburner:origLink></entry></feed>

