<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>web - In Fine - Le Blog</title>
	<atom:link href="https://blog.infine.com/tag/web/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.infine.com</link>
	<description>Le blog des technos de demain !</description>
	<lastBuildDate>Thu, 26 Jan 2012 13:06:37 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.5.7</generator>

<image>
	<url>https://blog.infine.com/wp-content/uploads/2021/03/cropped-vignette-32x32.png</url>
	<title>web - In Fine - Le Blog</title>
	<link>https://blog.infine.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Devoxx 2011 &#8211; Comparatif de performances des frameworks web Java et plus encore &#8230;</title>
		<link>https://blog.infine.com/devoxx-2011-comparatif-de-performances-des-frameworks-web-java-et-plus-encore-1411?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=devoxx-2011-comparatif-de-performances-des-frameworks-web-java-et-plus-encore</link>
					<comments>https://blog.infine.com/devoxx-2011-comparatif-de-performances-des-frameworks-web-java-et-plus-encore-1411#respond</comments>
		
		<dc:creator><![CDATA[Christian Nguyen Van Than]]></dc:creator>
		<pubDate>Thu, 26 Jan 2012 11:00:56 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[devoxx]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[GWT]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[Spring MVC]]></category>
		<category><![CDATA[web]]></category>
		<guid isPermaLink="false">https://blog.infine.com/?p=1411</guid>

					<description><![CDATA[<p><span class="rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Temps de lecture : </span> <span class="rt-time">3</span> <span class="rt-label rt-postfix">min.</span></span> Comparatifs de frameworks web à Devoxx 2011 Cet article a pour but de présenter brièvement la présentation de Stijn Van den Enden, lors du Devoxx 2011, sur les performances brutes de plusieurs frameworks connus et de partager quelques impressions sur ce sujet. Dans la première partie, il présente la méthodologie de tests ainsi que les &#8230;</p>
<p>The post <a href="https://blog.infine.com/devoxx-2011-comparatif-de-performances-des-frameworks-web-java-et-plus-encore-1411">Devoxx 2011 – Comparatif de performances des frameworks web Java et plus encore …</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></description>
										<content:encoded><![CDATA[<span class="rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Temps de lecture : </span> <span class="rt-time">3</span> <span class="rt-label rt-postfix">min.</span></span><h1>Comparatifs de frameworks web à Devoxx 2011</h1>
<p>Cet article a pour but de présenter brièvement la présentation de  Stijn Van den Enden, lors du Devoxx 2011, sur les performances brutes de  plusieurs frameworks connus et de partager quelques impressions sur ce  sujet.</p>
<p>Dans la première partie, il présente la méthodologie de tests ainsi que les outils : le coté test.<br />
Dans la seconde partie, il nous montre les résultats qu&#8217;il a obtenu : le coté performance.<br />
Les slides de la présentation sont disponibles <a href="http://prezi.com/dr3on1qcajzw/www-world-wide-wait-devoxx-edition/">ici<br />
</a><br />
En résumé, on y voit la mise en place de la plateforme de tests ainsi que les outils utilisés.</p>
<p><span id="more-1411"></span></p>
<p><span style="text-decoration: underline">Plateforme de tests :</span></p>
<p><a href="https://blog.infine.com/wp-content/uploads/2011/11/plateforme-de-test1.png" class="fancyboxgroup" rel="gallery-1411"><img fetchpriority="high" decoding="async" class="alignnone size-large wp-image-1450" src="https://blog.infine.com/wp-content/uploads/2011/11/plateforme-de-test1-1024x646.png" alt="plateforme de test" width="807" height="509" srcset="https://blog.infine.com/wp-content/uploads/2011/11/plateforme-de-test1-1024x646.png 1024w, https://blog.infine.com/wp-content/uploads/2011/11/plateforme-de-test1-300x189.png 300w, https://blog.infine.com/wp-content/uploads/2011/11/plateforme-de-test1.png 1439w" sizes="(max-width: 807px) 100vw, 807px" /></a></p>
<p><span style="text-decoration: underline">Conclusion :</span></p>
<p><a href="https://blog.infine.com/wp-content/uploads/2011/11/conclusion.png" class="fancyboxgroup" rel="gallery-1411"><img decoding="async" class="alignnone size-large wp-image-1449" src="https://blog.infine.com/wp-content/uploads/2011/11/conclusion-1024x283.png" alt="conclusion des tests" width="778" height="215" srcset="https://blog.infine.com/wp-content/uploads/2011/11/conclusion-1024x283.png 1024w, https://blog.infine.com/wp-content/uploads/2011/11/conclusion-300x82.png 300w, https://blog.infine.com/wp-content/uploads/2011/11/conclusion.png 1172w" sizes="(max-width: 778px) 100vw, 778px" /></a></p>
<p>Sa conclusion étant qu&#8217;en terme de performance brute, on a :</p>
<ol>
<li>GWT</li>
<li>Spring MVC</li>
<li>JSF 2.1.2 (Implementation Mojarra) ou Wicket</li>
<li>MyFaces (n&#8217;apparait pas dans le slide)</li>
</ol>
<p>Dans sa conclusion, qui n&#8217;apparait pas dans les slides, il dit aussi que  souvent, ce n&#8217;est pas le framework web qui est la principale cause de  la mauvaise performance d&#8217;une application.<br />
Pendant sa présentation,  il a souligné que le seul framework qui a posé problème est JSF 2  (problème de mémoire, ce qui ne m&#8217;étonne pas).<br />
Enfin, il nous rappelle qu&#8217;il faut aussi penser à la facilité de développement pour garder une bonne productivité.</p>
<h1>Avis personnel</h1>
<p>Pour ma part, la conclusion de Stijn Van den Enden ne doit pas tenir  compte du temps de rendu de la page, sinon Spring MVC serait 1er avec  GWT voire même devant.</p>
<p>Sur le point où il faut privilégier la  facilité de développement, on regrettera l&#8217;absence du comparatif des  frameworks Grails et Play qui sont tous deux excellents sur ce point.</p>
<p>Si  vous avez envie de changer de framework, d&#8217;après plusieurs  présentations vu sur le même sujet (par exemple l&#8217;article de Peter  Thomas), il faut se fixer un prototype de page à faire et si cela vous  parait trop difficile, c&#8217;est que celui-ci n&#8217;est surement pas adapté à  vos besoins.</p>
<p>Personnellement, je me demande pourquoi il y a tant  de personnes qui démarrent un projet encore avec JSF pour le web alors  qu&#8217;il a autant de problèmes de performance et qu&#8217;il est parfois si  compliqué de faire des choses simples avec (exemple pagination coté  serveur&#8230;).</p>
<p>Pour finir, son approche de Spring MVC est  intéressante car elle tend vers une pratique que j&#8217;ai adopté. Pour ma  part, j&#8217;ai abandonné l&#8217;idée que le Java était fait pour le web, car  c&#8217;est loin d&#8217;être le cas. Je préfère juste garder Java pour la partie  serveur et utiliser essentiellement des langages du web pour la vue :  très peu de JSP et EL(Expression Language) avec beaucoup de HTML, CSS et  JQuery (avec des données fournies au format JSON, d&#8217;ailleurs Spring MVC  fait très bien cela).</p>
<p>S&#8217;il fallait choisir un framework pour le  web en ce moment, je prendrai Grails pour un projet &#8216;from scratch&#8217; ou  Spring MVC pour un projet existant. Je n&#8217;ai pas assez d&#8217;expérience sur  GWT mais sa génération du javascript me fait hésiter&#8230; Je garderai dans  les deux cas, JQuery pour les composants riches car il existe  énormément de plugins pour ce framework javascript ou ExtJS ou voir même  du flash (flex).</p>
<p>En ce qui concerne Wicket, sa programmation  ressemble un peu à du Swing (client lourd) qui pourrait dérouter un  développeur web. Tapestry est intéressant mais le temps d&#8217;apprentissage  est assez important.</p>
<h1>Comparatif plus étendu</h1>
<p>Pour ceux qui comme moi ont regretté l&#8217;absence de Grails et Play, voici  un article intéressant avec un comparatif des deux et surtout une légère  &#8216;customisation&#8217; pour gagner en performance.<br />
Notez que l&#8217;utilisation de Japid pour Play booste grandement ses performances et que Netty semble plus rapide que Tomcat.</p>
<p><em>Extrait du site JT Dev (vous pouvez cliquer sur les images pour les agrandir)</em></p>
<p><em><br />
</em></p>
<p><a href="https://blog.infine.com/wp-content/uploads/2011/12/results_numbers.jpg" class="fancyboxgroup" rel="gallery-1411"><img decoding="async" class="alignnone size-full wp-image-1838" src="https://blog.infine.com/wp-content/uploads/2011/12/results_numbers.jpg" alt="" width="511" height="445" srcset="https://blog.infine.com/wp-content/uploads/2011/12/results_numbers.jpg 511w, https://blog.infine.com/wp-content/uploads/2011/12/results_numbers-300x261.jpg 300w" sizes="(max-width: 511px) 100vw, 511px" /></a></p>
<p><a href="https://blog.infine.com/wp-content/uploads/2011/12/conc_users_graph.jpg" class="fancyboxgroup" rel="gallery-1411"><img loading="lazy" decoding="async" class="alignnone size-large wp-image-1839" src="https://blog.infine.com/wp-content/uploads/2011/12/conc_users_graph-1024x615.jpg" alt="" width="1024" height="615" srcset="https://blog.infine.com/wp-content/uploads/2011/12/conc_users_graph-1024x615.jpg 1024w, https://blog.infine.com/wp-content/uploads/2011/12/conc_users_graph-300x180.jpg 300w, https://blog.infine.com/wp-content/uploads/2011/12/conc_users_graph.jpg 1596w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></p>
<p><a href="http://www.jtict.com/blog/rails-wicket-grails-play-lift-jsp/">Plus de détails ici</a></p><p>The post <a href="https://blog.infine.com/devoxx-2011-comparatif-de-performances-des-frameworks-web-java-et-plus-encore-1411">Devoxx 2011 – Comparatif de performances des frameworks web Java et plus encore …</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://blog.infine.com/devoxx-2011-comparatif-de-performances-des-frameworks-web-java-et-plus-encore-1411/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Ce que j&#8217;aime dans Play!</title>
		<link>https://blog.infine.com/ce-que-j%e2%80%99aime-dans-play-10?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ce-que-j%25e2%2580%2599aime-dans-play</link>
					<comments>https://blog.infine.com/ce-que-j%e2%80%99aime-dans-play-10#comments</comments>
		
		<dc:creator><![CDATA[Florian Boulay]]></dc:creator>
		<pubDate>Fri, 18 Feb 2011 09:59:53 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[full-stack]]></category>
		<category><![CDATA[play]]></category>
		<category><![CDATA[play framework]]></category>
		<category><![CDATA[web]]></category>
		<guid isPermaLink="false">https://blog.infine.com/?p=10</guid>

					<description><![CDATA[<p><span class="rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Temps de lecture : </span> <span class="rt-time">3</span> <span class="rt-label rt-postfix">min.</span></span> Je suis devenu un adepte du framework Play!. Je ne le pratique pas depuis longtemps, seulement depuis 10 mois environ. Mais la courbe d&#8217;apprentissage est vraiment rapide. Une semaine est suffisante pour être à l&#8217;aise et être autonome. J&#8217;ai la modeste prétention, dans cet article, de montrer 2 ou 3 trucs qui font de ce &#8230;</p>
<p>The post <a href="https://blog.infine.com/ce-que-j%e2%80%99aime-dans-play-10">Ce que j’aime dans Play!</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></description>
										<content:encoded><![CDATA[<span class="rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Temps de lecture : </span> <span class="rt-time">3</span> <span class="rt-label rt-postfix">min.</span></span><p><a href="https://blog.infine.com/wp-content/uploads/2011/01/play_logo.png" class="fancyboxgroup" rel="gallery-10"><img loading="lazy" decoding="async" class="alignleft size-full wp-image-447" src="https://blog.infine.com/wp-content/uploads/2011/01/play_logo.png" alt="play logo" width="144" height="65" /></a>Je suis devenu un adepte du framework Play!. Je ne le pratique pas depuis longtemps, seulement depuis 10 mois environ. Mais la courbe d&#8217;apprentissage est vraiment rapide. Une semaine est suffisante pour être à l&#8217;aise et être autonome. J&#8217;ai la modeste prétention, dans cet article, de montrer 2 ou 3 trucs qui font de ce framework une nouvelle manière de voir le web en Java.</p>
<p>Pour commencer, Play! est très simple à installer. Il suffit de décompresser le zip dans un répertoire, et de créer une variable <em>PLAY_HOME</em> qui pointe sur ce répertoire. Play! a uniquement besoin de Java comme pré-requis pour fonctionner. Et c&#8217;est tout ! Pour rappel, la plupart des autres frameworks web Java ont au moins besoin d&#8217;un serveur d&#8217;application&#8230;</p>
<p>Comme Play! embarque un serveur web, il se suffit à lui-même. Cette notion est appelée &#8220;full-stack&#8221;. Elle signifie que Play! est autonome à la fois dans son mode de développement en proposant tout ce qu&#8217;il faut pour faire une application web, de la couche présentation à l&#8217;accès aux données, et également lors de l&#8217;exécution des applications Play! qui tournent grâce au serveur web intégré.</p>
<p>Play! propose de nombreuses fonctionnalités peu répandues dans le monde du web en java. Par exemple, le code modifié est pris à chaud par le serveur web, il suffit de rafraîchir le navigateur pour voir sa modification ! La gestion d&#8217;erreur est également poussée. Lorsqu&#8217;une exception se produit, l&#8217;erreur s&#8217;affiche très clairement dans le navigateur. Comme le montre l&#8217;image suivante :<br />
<figure id="attachment_458" aria-describedby="caption-attachment-458" style="width: 300px" class="wp-caption aligncenter"><a href="https://blog.infine.com/wp-content/uploads/2011/01/play_exception_page.png" class="fancyboxgroup" rel="gallery-10"><img decoding="async" src="https://blog.infine.com/wp-content/uploads/2011/01/play_exception_page-300x160.png" alt="Play exception page" /></a><figcaption id="caption-attachment-458" class="wp-caption-text"><em>Cliquez sur l'image pour l'agrandir</em></figcaption></figure></p>
<p>Le développement rapide est une des caractéristiques de Play! On passe beaucoup plus de temps à coder qu&#8217;à faire de la configuration ou de l&#8217;installation. Et ce n&#8217;est pas tout, Play! propose beaucoup de moyens d&#8217;accélérer le développement. Je vais donc vous en montrer quelques uns. Je ne compte pas énumérer tout ce qui fait que Play! permet de développer rapidement, mais seulement donner un aperçu.<br />
Play! propose sur son site, une documentation très complète, ainsi qu&#8217;un tutoriel bien fait qui permet de se familiariser avec les notions principales du framework. Si on peut paraître sceptique devant tant de d&#8217;enthousiasme, faire le tutoriel permettra à quiconque de se rendre compte de la rapidité avec laquelle le développement se fait avec Play!.</p>
<p><span id="more-10"></span></p>
<h1>Arborescence</h1>
<p>Ceux qui connaissent Ruby on Rails et Grails ont déjà les bases pour Play!. Par exemple, l&#8217;arborescence des répertoires est très similaire :<br />
<a href="https://blog.infine.com/wp-content/uploads/2010/05/play_directory_structure.png" class="fancyboxgroup" rel="gallery-10" title=""><img loading="lazy" decoding="async" src="https://blog.infine.com/wp-content/uploads/2010/05/play_directory_structure.png" alt="Play directory structure" title=""Play directory structure" width="90" height="108" class="alignnone size-full wp-image-451" /></a><br />
Les répertoires ont des noms explicites, par exemple le répertoire <em>public</em> permet au serveur web de renvoyer des ressources directement, telles que des images ou des scripts.<br />
Le répertoire <em>conf</em> contient les fichiers de configuration comme son nom l&#8217;indique. Par défaut, Play! en crée trois : </p>
<ul>
<li>Un pour l&#8217;application de l&#8217;application et du serveur web</li>
<li>Un pour définir les URL de l&#8217;application</li>
<li>Un dernier contenant les messages de l&#8217;application</li>
</ul>
<p>D&#8217;autres fichiers de configuration peuvent être créer dans ce répertoire, notamment pour chaque langue gérée par votre application.</p>
<h1>La puissance dans le fichier de configuration</h1>
<p><em>Application.conf</em> est un fichier similaire à un fichier properties. Il est créé par Play! lors de la création d&#8217;une application. Il contient plein de valeurs essentielles pour configurer le serveur web, telles que le port à utiliser, le nom du cookie. Il contient également des propriétés permettant de configurer l&#8217;application comme la base de données, la configuration JPA, du cache&#8230;</p>
<p>Le gros avantage de ce fichier, est qu&#8217;il peut être l&#8217;unique fichier de configuration de l&#8217;application, et ce quel que soit l&#8217;environnement sur lequel est déployé la web app ! En effet Play! intègre un système qui permet de surcharger des valeurs dans le fichier de configuration. Lors du lancement de l&#8217;application, il suffit de préciser un paramètre supplémentaire sur la ligne de commande pour choisir les propriétés à appliquer. Comme ce n&#8217;est sûrement pas clair, voici un exemple :</p>
<pre class="brush: java; title: ; notranslate">
%integration.application.mode=dev
%production.application.mode=prod
application.mode=dev
</pre>
<p>Le fichier ci-dessus est un extrait d&#8217;un fichier de configuration <em>application.conf</em>. Il contient 3 fois la même propriété nommée <em>application.mode</em>. Certaines sont suffixées ce qui permet de donner une valeur précise selon si l&#8217;application est lancée en intégration ou en production. Par défaut, la valeur sera celle de ligne 3 si le paramètre n&#8217;est pas indiqué. C&#8217;est super pratique et très bien pensé !</p>
<h1>Le rechargement à chaud du code et de la conf</h1>
<p>La propriété que j&#8217;ai montré dans l&#8217;extrait du fichier <em>application.conf</em> dans le paragraphe précédent, est une clé très spéciale, qui permet encore à Play! de se distinguer. Elle permet d&#8217;indiquer au framework que l&#8217;application est en mode développement ou production. La distinction est très importante pour le développeur, et pour la sécurité de l&#8217;application.</p>
<p>Le mode <em>dev</em> permet au développeur un gain de temps maximum. Lors du développement, un changement sur un fichier de code ou de configuration sera pris à chaud par le framework. Un rafraîchissement de la page du navigateur, et c&#8217;est pris en compte ! C&#8217;est tout simplement du bonheur de développer dans ces conditions.<br />
Le mode <em>production</em> interdit, bien entendu, le rechargement du code à chaud, mais il permet également de précompiler les fichiers java et les fichiers de templates (qui sont les fichiers permettant l&#8217;affichage des pages web). Les performances sont donc meilleures en mode <em>production</em> qu&#8217;en mode <em>développement</em>.</p>
<h1>Sans état !</h1>
<p>Play! est un framework sans état. Cela signifie qu&#8217;aucune session n&#8217;est conservée du côté du serveur. Cette philosophie est à l&#8217;opposée de la plupart des frameworks java bâtis sur la norme servlet. Cela permet à Play! de se rapprocher de la philosophie initiale du protocole HTTP où chaque requête est indépendante de la précédente, donc sans état. Le framework sait qui effectue la requête grâce au cookie.<br />
Du côté serveur, il faut donc repenser sa manière de gérer les requêtes sans état. Par exemple, si des objets doivent être stockés pour être utilisés lors des requêtes suivantes, il faudra utiliser un cache ou la base de donnée directement. D&#8217;ailleurs à propos du cache, Play! intègre un cache directement basé sur EhCache.<br />
Le fait que Play! soit sans état permet d&#8217;avoir une architecture scalable. Cela permet aussi au framework de gérer très facilement les requêtes de type REST qui sont également des requêtes sans état.<br />
Encore une bonne raison d&#8217;essayer Play!.</p>
<h2>Exemple d&#8217;URL de type REST</h2>
<p>Allez, je vous donne un exemple de REST implémenté dans Play!. L&#8217;exemple suivant permet d&#8217;effacer une personne de l&#8217;application.<br />
L&#8217;unique page de l&#8217;application affiche une liste de personnes. La seule action possible est d&#8217;en effacer une :<br />
<a href="https://blog.infine.com/wp-content/uploads/2011/01/list_person.png" class="fancyboxgroup" rel="gallery-10"><img loading="lazy" decoding="async" src="https://blog.infine.com/wp-content/uploads/2011/01/list_person.png" alt="list of persons" width="207" height="82" class="aligncenter size-full wp-image-488" /></a><br />
Le fait de cliquer sur le lien <em>delete</em> appelera une URL définie dans le fichier de configuration <em>routes</em> dont voici l&#8217;extrait concerné :</p>
<pre class="brush: java; title: ; notranslate">
DELETE        /person/{id}         Application.deletePerson
</pre>
<p>Ce fichier définie une URL de type REST. Elle signifie qu&#8217;une URL de type <em>/person/348</em> avec la méthode HTTP <em>DELETE</em> appelera la méthode <em>Application.deletePerson</em> avec le paramètre 348.<br />
Lorsqu&#8217;on affiche la page d&#8217;accueil, la log indique :</p>
<pre class="brush: java; title: ; notranslate">
21:00:57,315 INFO  ~ URL called : GET localhost/
</pre>
<p>Ensuite, une fois que nous cliquons sur le lien delete :</p>
<pre class="brush: java; title: ; notranslate">
21:06:24,937 INFO  ~ URL called : DELETE localhost/person/2
</pre>
<p>Evidemment, l&#8217;affichage des personnes fonctionne tel qu&#8217;attendu :<br />
<a href="https://blog.infine.com/wp-content/uploads/2011/01/list_person_with_deleted_person.png" class="fancyboxgroup" rel="gallery-10"><img loading="lazy" decoding="async" src="https://blog.infine.com/wp-content/uploads/2011/01/list_person_with_deleted_person.png" alt="list with person deleted" width="195" height="55" class="aligncenter size-full wp-image-489" /></a></p>
<p>Le code java est extrêmement simple. Voici la méthode affichant l&#8217;URL et la méthode HTTP pour chaque requête HTTP :</p>
<pre class="brush: java; title: ; notranslate">
@Before
static void printHttpInfos() {
	Logger.info(&quot;URL called : %s %s&quot;, request.method, request.domain + request.path);
}
</pre>
<p>Et voici le code java permettant la suppression d&#8217;une personne :</p>
<pre class="brush: java; title: ; notranslate">
public static void deletePerson(long id) {
	Person.&lt;Person&gt; findById(id).delete();
	index();
}
</pre>
<p>Je ne vais pas vous décrire ce que fait chaque ligne de code. Je voulais simplement montrer à quel point il est facile de faire des choses qui sont plus compliquées sans Play!. Encore une fois, n&#8217;hésitez pas à aller faire le tutoriel sur le site de Play!, on y apprend toutes les bases et notamment ce que je viens de vous montrer.</p>
<h1>Les tests</h1>
<p>Dans un framework moderne, la prise en charge des tests est indispensable, et Play! n&#8217;y échappe pas. Les tests Play! sont basés sur deux librairies très connues : JUnit et Selenium.<br />
En lançant le serveur en mode <em>test</em>, les tests peuvent être lancés via une page dédiée sur l&#8217;application web. C&#8217;est très pratique pour lancer manuellement des tests via le browser.<br />
D&#8217;autre part les données de tests peuvent être initialisées grâce à un fichier YAML. Voici le fichier utilisé pour initialiser les données du paragraphe précédent (dans mon cas je l&#8217;ai utilisé pour initialiser la base de données de mon application) :</p>
<pre class="brush: plain; title: ; notranslate">
Person(test1):
    firstName: Florian
    lastName: Boulay

Person(test2):
    firstName: Antonio
    lastName: Goncalves

Person(test3):
    firstName: Antoine
    lastName: Ramponi
</pre>
<p>Play! permet de créer 3 types de tests :</p>
<ul>
<li>Les tests unitaires : les classes doivent hériter de la classe <em>UnitTest</em>. C&#8217;est l&#8217;équivalent d&#8217;un test JUnit classique.</li>
<li>Les tests fonctionnels : les classes doivent hériter de la classe <em>FunctionnalTest</em>. Ce sont des tests d&#8217;intégration avec l&#8217;application web.</li>
<li>Les tests de validation : ce sont des tests Selenium.</li>
</ul>
<h2>Les tests  fonctionnels</h2>
<p>Je vais faire un petit zoom sur les tests dits fonctionnels.</p>
<p>Pour cela j&#8217;ai un peu modifié l&#8217;exemple utilisé précédemment afin d&#8217;avoir plus de cas de tests possibles. La mini application web ne comporte toujours qu&#8217;une seule page, mais elle est désormais composée de 2 listes : une liste d&#8217;employés disponibles, et une des employés d&#8217;astreinte. L&#8217;interface ressemble à ceci :<br />
<a href="https://blog.infine.com/wp-content/uploads/2011/01/managing_employees_2.png" class="fancyboxgroup" rel="gallery-10" title="Managing employees"><img loading="lazy" decoding="async" src="https://blog.infine.com/wp-content/uploads/2011/01/managing_employees_2-300x167.png" alt="Managing employees" title="Managing employees" width="300" height="167" class="aligncenter size-medium wp-image-582" srcset="https://blog.infine.com/wp-content/uploads/2011/01/managing_employees_2-300x167.png 300w, https://blog.infine.com/wp-content/uploads/2011/01/managing_employees_2.png 340w" sizes="(max-width: 300px) 100vw, 300px" /></a><br />
Le fait de cliquer sur <em>on call</em> permet de faire passer la personne d&#8217;astreinte en la mettant dans la seconde liste. Le fait de cliquer sur <em>free</em> permet de faire l&#8217;inverse.</p>
<p>Comme dit précédemment les classes de test doivent hériter de la classe <em>FunctionnalTest</em>. De plus, le serveur doit être lancé en mode test. Voici un exemple de test fonctionnel permettant de tester l&#8217;unique page de cette application. La première méthode teste l&#8217;état initial, c&#8217;est-à-dire les 3 personnes qui sont présentes dans la liste des employés disponibles. La seconde méthode teste le passage d&#8217;une personne de la première liste à la seconde en cliquant sur le lien <em>on call</em> :</p>
<pre class="brush: java; title: ; notranslate">
public class EmployeesTest extends FunctionalTest {

	@Before
	public void setUp() {
		Logger.debug(&quot;Reloading all data&quot;);
		Fixtures.deleteAll();
		Fixtures.load(&quot;data.yml&quot;);
	}

	@Test
	public void testStartState() throws Exception {
		Response response = GET(&quot;/&quot;);
		// test the 200 status
		assertIsOk(response);
		String httpBody = getContent(response);
		assertTrue(httpBody.length() &gt; 0);
		// test that 3 &lt;li&gt; are returned
		assertContentMatch(&quot;(?s)&lt;ul&gt;\\s*&quot; +
							&quot;&lt;li&gt;Florian Boulay.*&quot; +
							&quot;&lt;li&gt;Antonio Goncalves.*&quot; +
							&quot;&lt;li&gt;Antoine Ramponi.*&quot; +
							&quot;&lt;/ul&gt;&quot;, response);
	}

	@Test
	public void testOnCallPeople() throws Exception {
		// make Antonio Goncalves on call
		Person antonio = Person.find(&quot;byFirstName&quot;, &quot;Antonio&quot;).&lt;Person&gt; first();
		Response response = PUT(&quot;/person/onCall/&quot; + antonio.id, &quot;text/html&quot;, &quot;&quot;);
		// test the 302 response
		assertStatus(302, response);
		String httpBody = getContent(response);
		assertTrue(httpBody.length() == 0);
		java.net.URL locationHeader = new java.net.URL(response.getHeader(&quot;location&quot;));
		response = GET(locationHeader.getPath());
		// test the 200 response
		httpBody = getContent(response);
		assertTrue(httpBody.length() &gt; 0);
		assertContentMatch(&quot;(?s)&lt;ul&gt;\\s*&quot; +
							&quot;&lt;li&gt;Florian Boulay.*&quot; +
							&quot;&lt;li&gt;Antoine Ramponi.*&quot; +
							&quot;&lt;/ul&gt;&quot;, response);
		assertContentMatch(&quot;(?s)&lt;ul&gt;\\s*&quot; +
							&quot;&lt;li&gt;Antonio Goncalves.*&quot; +
							&quot;&lt;/ul&gt;&quot;, response);
	}

}
</pre>
<p>Voici les quelques logs générées :</p>
<pre class="brush: java; title: ; notranslate">
00:39:21,725 DEBUG ~ Reloading all data
00:39:21,777 INFO  ~ URL called : GET localhost/
00:39:22,469 DEBUG ~ Reloading all data
00:39:22,505 INFO  ~ URL called : PUT localhost/person/onCall/8
00:39:22,525 INFO  ~ URL called : GET localhost/
</pre>
<h1>L&#8217;API simple</h1>
<p>Ce qui est très agréable au quotidien avec Play! est la facilité d&#8217;utilisation des API disponibles. Je n&#8217;ai pas montré beaucoup de code dans cet article, mais vous pouvez constater la simplicité de lecture du code fait avec Play!. Cela permet comme presque tout le reste, d&#8217;avoir une marge de progression rapide, d&#8217;être opérationnel bien plus vite qu&#8217;avec d&#8217;autres framework web&#8230; Mais tout ça, je l&#8217;ai déjà dit. Je vais plutôt vous montrer quelques lignes utilisant l&#8217;API de Play!, vous pourrez vous faire une idée bien plus facilement qu&#8217;avec un long discours.</p>
<pre class="brush: java; title: ; notranslate">
// récupérer la requête HTTP courante
Request request = Http.Request.current();

// récupérer l'EntityManager 
EntityManager em = JPA.em();

// faire un appel rapide à un web service
HttpResponse response = WS.url(&quot;http://www.w3schools.com/webservices/tempconvert.asmx?op=FahrenheitToCelsius&quot;).get();

// récupérer toutes les entités Person (entité au sens objet du modèle de donnée)
List&lt;Person&gt; findAll = Person.findAll()
// compter le nombre d'entités Person
long count = Person.count();
// faire des requêtes simple sur l'entité Person
List&lt;Person&gt; allAntos = Person.find(&quot;byFirstNameLike&quot;, &quot;anto%&quot;).fetch();
// etc......
</pre>
<h3>Petit mot de la fin</h3>
<p>Cet article touche à sa fin. J&#8217;aurais tellement voulu vous en montrer plus comme la validation super simple, les templates HTML, comment répondre au client en fonction du format qu&#8217;il demande (XML, JSON&#8230;.), mais c&#8217;est déjà assez long. Je profiterai d&#8217;un prochain article pour me concentrer sur un aspect plus précis du framework.<br />
J&#8217;espère avoir convaincu les quelques sceptiques à propos du framework Play!</p>
<h3>Ressources</h3>
<p>Site officiel du framework Play! : <a href="http://www.playframework.org/">http://www.playframework.org/</a><br />
Le google group très actif : <a href="http://groups.google.com/group/play-framework">http://groups.google.com/group/play-framework</a><br />
Le repository git du code source de Play! : <a href="https://github.com/playframework/play">https://github.com/playframework/play</a><br />
Le premier livre sur Play! : <a href="http://www.the-play-book.co.uk/">http://www.the-play-book.co.uk/</a></p><p>The post <a href="https://blog.infine.com/ce-que-j%e2%80%99aime-dans-play-10">Ce que j’aime dans Play!</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://blog.infine.com/ce-que-j%e2%80%99aime-dans-play-10/feed</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
	</channel>
</rss>
