<?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>Robusta : Java &#38; RESTful Web Services &#187; Astuce du Jour</title>
	<atom:link href="https://blog.developpez.com/java_rest/pcategory/astuce-du-jour/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/java_rest</link>
	<description></description>
	<lastBuildDate>Fri, 24 Dec 2010 11:23:17 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>Pool de connexion Mysql sur Glassfish : Victoire :)</title>
		<link>https://blog.developpez.com/java_rest/p7185/astuce-du-jour/pool_de_connexion_mysql_sur_glassfish_vi</link>
		<comments>https://blog.developpez.com/java_rest/p7185/astuce-du-jour/pool_de_connexion_mysql_sur_glassfish_vi#comments</comments>
		<pubDate>Fri, 06 Feb 2009 11:28:47 +0000</pubDate>
		<dc:creator><![CDATA[nicorama]]></dc:creator>
				<category><![CDATA[Astuce du Jour]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Mais que ce fût dur ! J&#8217;avais déjà fait une vidéo sur la création d&#8217;un pool de connexion MySQL sur Glassfish. Malheureusement, lors de la pratique en test réel avec une application web et des alpha-testeurs, plus rien ne fonctionnait au bout de quelques heures : &#171;&#160;Impossible to resize Pool&#160;&#187; x 500 dans mes logs. Créer plus de Connexions possibles n&#8217;a pas servi à grand chose (j&#8217;ai testé avec 256 au lieu de 16 :)) [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Mais que ce fût dur !</p>
<p>J&rsquo;avais déjà fait une <a href="http://www.dailymotion.com/robusta-web/video/x7m8d5_jpasurglassfish_tech">vidéo</a> sur la création d&rsquo;un pool de connexion MySQL sur Glassfish. Malheureusement, lors de la pratique en test réel avec une application web et des alpha-testeurs, plus rien ne fonctionnait au bout de quelques heures : &laquo;&nbsp;Impossible to resize Pool&nbsp;&raquo; x 500 dans mes logs.</p>
<p><img src="http://nicolas-zozol.developpez.com/blog/images/mysql-glassfish/video%20robusta.png" alt="Video Robusta Web Glassfish et Mysql" title="Créer un Pool de Connexion avec Glassfish &amp; Mysql" /></p>
<p><span id="more-24"></span></p>
<p>Créer plus de Connexions possibles n&rsquo;a pas servi à grand chose (j&rsquo;ai testé avec 256 au lieu de 16 :)) ). Par contre j&rsquo;ai voulu pingé le pool grâce à l&rsquo;interface de Glassfish. Lorsqu&rsquo;aucune application n&rsquo;est déployé, le pool ne ping pas puisque le .jar de Mysql n&rsquo;est pas installé par défaut.</p>
<p>J&rsquo;ai donc : </p>
<ul>
<li>Copié mon Mysql Connector/J dans /usr/share/glassfish/lib</li>
<li>Précisé le .jar dans le Classpath de la JVM du serveur</li>
<li> Ajouté tant qu&rsquo;à faire de la mémoire : c&rsquo;est un serveur java !</li>
</ul>
<p><img src="http://nicolas-zozol.developpez.com/blog/images/mysql-glassfish/classpath.png" alt="classpath pour driver MySQL sur Glassfish" title="Classpath de Mysql pour Glassfish" /></p>
<p><img src="http://nicolas-zozol.developpez.com/blog/images/mysql-glassfish/xmms.png" alt="Memory de Glassfish" title="Memory de Glassfish" /></p>
<p>D&rsquo;une part je ping, et de plus je peux maintenant bombarder mon serveur de requêtes. J&rsquo;en déduis peut-être à tort qu&rsquo;utiliser le mysql.jar dans le /lib de son .war ne tient pas très bien la route.</p>
<p><img src="http://nicolas-zozol.developpez.com/blog/images/mysql-glassfish/ping.png" alt="ping on Glassfish Connection Pool" title="" /></p>
<p>Le serveur encaisse bien son millier de requêtes, et pour l&rsquo;instant, je n&rsquo;ai pas d&rsquo;avertissements d&rsquo;OVH <img src="http://www.developpez.net/forums/images/smilies/yaisse.gif" alt="" title="" />.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Screencast : Fabriquer des Composants Javabeans</title>
		<link>https://blog.developpez.com/java_rest/p6984/astuce-du-jour/screencast_fabriquer_des_composants_java</link>
		<comments>https://blog.developpez.com/java_rest/p6984/astuce-du-jour/screencast_fabriquer_des_composants_java#comments</comments>
		<pubDate>Sat, 20 Dec 2008 14:27:14 +0000</pubDate>
		<dc:creator><![CDATA[nicorama]]></dc:creator>
				<category><![CDATA[Astuce du Jour]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Bonjour, Voici deux vidéos-tutoriels permettant de fabriquer des composants Javabeans de façon simple, rapide et avec du code propre grâce à Netbeans &#8211; I) Beans Binding : Synchroniser la valeurs d&#8217;une propriété avec celle d&#8217;un formulaire &#8211; II) Programmation par Events : Réduire les combinaisons if/else avec une programmation modulaire, pilotée par les Events customizés. Deux vidéos devraient arriver après les fêtes. Les articles pour Dev.com&#8230;. en avril]]></description>
				<content:encoded><![CDATA[<p>Bonjour,</p>
<p>Voici deux vidéos-tutoriels permettant de fabriquer des composants Javabeans de façon simple, rapide et avec du <strong>code propre</strong> grâce à Netbeans</p>
<p> &#8211; <a href="http://www.dailymotion.com/robusta-web/video/x7r7cr_javabean-part-i-beansbinding-avec-n_tech">I) Beans Binding</a> : Synchroniser la valeurs d&rsquo;une propriété avec celle d&rsquo;un formulaire<br />
 &#8211; <a href="http://www.dailymotion.com/robusta-web/video/x7r8mk_javabeansevents_tech">II) Programmation par Events</a> : Réduire les combinaisons if/else avec une programmation modulaire, pilotée par les Events customizés.</p>
<p><a href="http://www.dailymotion.com/robusta-web/video/x7r7cr_javabean-part-i-beansbinding-avec-n_tech"><img src="http://nicolas-zozol.developpez.com/images/capture_screencast.png" alt="Composant Javabeans" title="Design d'un Composan Javabean" /></a></p>
<p>Deux vidéos devraient arriver après les fêtes. Les articles pour Dev.com&#8230;. en avril <img src="https://blog.developpez.com/java_rest/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Servlet-Mapping : Des expressions pas très régulières</title>
		<link>https://blog.developpez.com/java_rest/p6431/restful/servlet_mapping_des_expressions_pas_tres</link>
		<comments>https://blog.developpez.com/java_rest/p6431/restful/servlet_mapping_des_expressions_pas_tres#comments</comments>
		<pubDate>Mon, 22 Sep 2008 19:03:55 +0000</pubDate>
		<dc:creator><![CDATA[nicorama]]></dc:creator>
				<category><![CDATA[Astuce du Jour]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[RESTful]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Le Servlet Mapping dans un serveur Web permet de rediriger une URL vers un fichier acceptant une requête : une servlet ou une page JSP. Par exemple la requête GET /wsedupassion/account/12 sera redirigé vers la page /wsedupassion/service/account/account.jsp. Cette page JSP sera capable de traduire le &#8217;12&#8217; pour récupérer le compte d&#8217;index 12 et enverra donc sous forme XML les informations lié à l&#8217;utilisateur 12. &#160;&#60;br /&#62; &#60;resource&#62; &#60;br /&#62; &#160; &#60;class&#62;User&#60;/class&#62; &#60;br /&#62; &#160; &#60;id&#62;12&#60;/id&#62; [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Le Servlet Mapping dans un serveur Web permet de rediriger une URL vers un fichier acceptant une requête : une servlet ou une page JSP.<br />
Par exemple la requête <strong>GET /wsedupassion/account/12</strong> sera redirigé vers la page <strong>/wsedupassion/service/account/account.jsp</strong>. Cette page JSP sera capable de traduire le &rsquo;12&rsquo; pour récupérer le compte d&rsquo;index 12 et enverra donc sous forme XML les informations lié à l&rsquo;utilisateur 12.</p>
<p></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp;&lt;br /&gt;<br />
&lt;resource&gt; &lt;br /&gt;<br />
&nbsp; &lt;class&gt;User&lt;/class&gt; &lt;br /&gt;<br />
&nbsp; &lt;id&gt;12&lt;/id&gt; &lt;br /&gt;<br />
&nbsp; &lt;lastName&gt;Zozol&lt;/lastName&gt; &lt;br /&gt;<br />
&nbsp; &lt;firstName&gt;Nicolas&lt;/firstName&gt; &lt;br /&gt;<br />
&nbsp; &lt;url&gt;http://www.edupassion.com&lt;/url&gt; &lt;br /&gt;<br />
&nbsp; &lt;subject&gt;Computer Sciences&lt;/subject&gt; &lt;br /&gt;<br />
&nbsp; &lt;school&gt;Robusta Web&lt;/school&gt; &lt;br /&gt;<br />
&lt;/resource&gt; &lt;br /&gt;</div></div>
<p>
<span id="more-2"></span></p>
<p>Mais il y a dans le Domaine d&rsquo;une école, des cas plus complexes que récupérer les informations d&rsquo;un utilisateur. Par exemple récupérer l&rsquo;ensemble des élèves du cours 24. On utilisera la requête :<br />
   <strong>GET /wsedupassion/course/24/students</strong></p>
<p>Pour connaitre le professeur de ce groupe, ce sera :<br />
   <strong>GET /wsedupassion/course/24/teacher</strong></p>
<p>Pour ajouter l&rsquo;étudiant 18 à ce cours:<br />
   <strong>PUT /wsedupassion/course/24/students?idstudent=18</strong></p>
<p>Et pour tout connaitre de ce cours :<br />
   <strong>GET /wsedupassion/course/24/</strong></p>
<p></p>
<p>Et pour traiter ces requête, on utilisera les pages jsp :<br />
   &#8211; /wsedupassion/service/course/course.jsp<br />
   &#8211; /wsedupassion/service/course/teacher.jsp<br />
   &#8211; /wsedupassion/service/course/students.jsp<br />
Le serveur (Apache, Glassfish, JBOSS, &#8230;) doit donc analyser très correctement l&rsquo;uri pour dispatcher vers la bonne JSP. Voici un petit <a href="http://nicolas-zozol.developpez.com/tutoriels/java/restful/jsp/#LIV">tutoriel </a>pour les bases.
</p>
<p>
En première intention, j&rsquo;avais prévu :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp;&lt;br /&gt;<br />
&lt;servlet-mapping&gt; &lt;br /&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;servlet-name&gt;course&lt;/servlet-name&gt; &lt;br /&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;url-pattern&gt;/course/[0-9]+&lt;/url-pattern&gt; &lt;br /&gt;<br />
&lt;/servlet-mapping&gt; &lt;br /&gt;<br />
&lt;servlet-mapping&gt; &lt;br /&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;servlet-name&gt;course_students&lt;/servlet-name&gt; &lt;br /&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;url-pattern&gt;/course/[0-9]+/students/*&lt;/url-pattern&gt; &lt;br /&gt;<br />
&lt;/servlet-mapping&gt; &lt;br /&gt;<br />
&lt;servlet-mapping&gt; &lt;br /&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;servlet-name&gt;course_teacher&lt;/servlet-name&gt; &lt;br /&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;url-pattern&gt;/course/[0-9]+/teacher/*&lt;/url-pattern&gt; &lt;br /&gt;<br />
&lt;/servlet-mapping&gt; &lt;br /&gt;</div></div>
<p></p>
<p>Mais les expressions régulières ne sont en fait absolument pas reconnues. Le serveur ne connnait que &lsquo;*&rsquo; et privilégie le pattern selon 4 règles <strong>hierarchiques </strong>from outer space :<br />
  &#8211; Il préfère le pattern exact :<strong>/wsedupassion/account</strong> plutot que <strong>/wsedupassion/*</strong><br />
  &#8211; Il préfère le pattern le plus long : <strong>/course/12/teacher/</strong> plutot <strong>/course/*</strong><br />
  &#8211; Il préfère les<strong> xyz/*</strong> (chemin) plutôt que <strong>*.xzy</strong> (type de fichier)<br />
  &#8211; Il choisit <strong>/</strong> si cette servlet racine existe</p>
<p>Et sinon le serveur envoit l&rsquo;erreur 404( <a href="http://www2.roguewave.com/support/docs/leif/leif/html/bobcatug/7-7.html#772">Source</a>).</p>
<p>
Mon fichier web.xml ressemblera donc à :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp;&lt;br /&gt;<br />
&lt;servlet-mapping&gt; &lt;br /&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;servlet-name&gt;course&lt;/servlet-name&gt; &lt;br /&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;url-pattern&gt;/course*&lt;/url-pattern&gt; &lt;br /&gt;<br />
&lt;/servlet-mapping&gt; &lt;br /&gt;<br />
&lt;servlet-mapping&gt; &lt;br /&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;servlet-name&gt;course_students&lt;/servlet-name&gt; &lt;br /&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;url-pattern&gt;/course/*/students/*&lt;/url-pattern&gt; &lt;br /&gt;<br />
&lt;/servlet-mapping&gt; &lt;br /&gt;<br />
&lt;servlet-mapping&gt; &lt;br /&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;servlet-name&gt;course_teacher&lt;/servlet-name&gt; &lt;br /&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;url-pattern&gt;/course/*/teacher/*&lt;/url-pattern&gt; &lt;br /&gt;<br />
&lt;/servlet-mapping&gt;</div></div>
<p>De quoi faire hurler tout prof de fac tatillon sur ses expressions régulières. Mais c&rsquo;est à priori suffisant pour fonctionner, et en plus intuitif. Que demande le peuple ? Apparemment plus, puisque ca ne fonctionne pas. Deux &lsquo;*&rsquo;, ca fait beaucoup.<br />
 <strong>/school/*/student/</strong> n&rsquo;est pas différencié de <strong>/school/*/teacher</strong> et renvoient d&rsquo;ailleurs toutes les deux une erreur 4004 !</p>
<p>Pour dispatcher des uri un peu sophistiquées, il faudrait donc <br />
  &#8211; un servlet-mapping vers un dispatcher<br />
  &#8211; le dispatcher analyse l&rsquo;uri<br />
  &#8211; on forward la requete vers une autre servlet
</p>
<p>
Je n&rsquo;aime pas du tout ce mélange des genres : le servlet mapping a pour objet de rediriger, et devoir faire à la main une redirection dans le processus de redirection via des classes barbares comme un RequestDispatcher. Beurk ! Quelqu&rsquo;un a mieux ?</p>
<p>Sinon, autant garder l&rsquo;uri de la JSP. Et tant pis pour les <a href="http://www.w3.org/Provider/Style/URI">dogmes </a>!</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Récupérer en Javascript la valeur des boutons Radio Prototype</title>
		<link>https://blog.developpez.com/java_rest/p5353/ajax/recuperer_en_javascript_la_valeur_des_bo</link>
		<comments>https://blog.developpez.com/java_rest/p5353/ajax/recuperer_en_javascript_la_valeur_des_bo#comments</comments>
		<pubDate>Sat, 22 Mar 2008 17:00:43 +0000</pubDate>
		<dc:creator><![CDATA[nicorama]]></dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Astuce du Jour]]></category>
		<category><![CDATA[Prototype]]></category>
		<category><![CDATA[Web 2.0]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Classiquement, on récupère la valeur de boutons radios HTML grâce à une balise FORM incorporant l&#8217;attribut action pointant sur un script php : &#60;form action =&#34;script.php&#34; &#62; &#60;input type=&#34;radio&#34; name=&#34;radioGroup&#34; id=&#34;radio&#34; value=&#34;LEAVE_IT&#34; /&#62;Leave It &#60;input type=&#34;radio&#34; name=&#34;radioGroup&#34; id=&#34;radio2&#34; value=&#34;TAKE_IT&#34; /&#62; Take It &#60;input type=&#34;button&#34; value=&#34;OK&#34; /&#62; &#60;/form&#62; Cette astuce du jour a pour but de récupérer le bouton radio en Javascript, avec la bibliothèque Prototype, sans script php, ni même la balise form. En Ajax, [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Classiquement, on récupère la valeur de boutons radios HTML grâce à une balise FORM incorporant l&rsquo;attribut action pointant sur un script php :</p>
<blockquote>
<p>&lt;form action =&quot;script.php&quot; &gt; </p>
<p>&lt;input type=&quot;radio&quot; name=&quot;radioGroup&quot; id=&quot;radio&quot; value=&quot;LEAVE_IT&quot; /&gt;Leave It<br />
&lt;input type=&quot;radio&quot; name=&quot;radioGroup&quot; id=&quot;radio2&quot; value=&quot;TAKE_IT&quot; /&gt;  Take It<br />
&lt;input type=&quot;button&quot; value=&quot;OK&quot; /&gt;</p>
<p>&lt;/form&gt;</p>
</blockquote>
<p>Cette astuce du jour a pour but de récupérer le bouton radio en Javascript, avec la bibliothèque <a href="http://www.prototypejs.org/">Prototype</a>, sans script php, ni même la balise form.<br />
<span id="more-4"></span></p>
<p>En Ajax, on veut éviter le plus souvent possible l&rsquo;action sur les balises FORM. Même si l&rsquo;action est nulle : &lt;form action =&quot;&quot; &gt;, alors le navigateur affiche une nouvelle url : http://mypage?Submit=OK, par exemple. On peut utiliser un bouton de type &laquo;&nbsp;button&nbsp;&raquo; ou &laquo;&nbsp;submit&nbsp;&raquo; utilisant l&rsquo;attribut onclick=&nbsp;&raquo;doIt();&nbsp;&raquo;</p>
<p>La fonction javascript doIt() pourra alors récupérer la valeur du bouton radio avec cette fonction qui ne nécessite que l&rsquo;attribut name du groupe de boutons radio :</p>
<blockquote>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">/** <br />
* Returns the value of the selected radio button in the radio group <br />
* returns &quot;&quot; if the radio is not found or if nothing is checked <br />
* Public Domain <br />
*/ <br />
function $RF(radioName){ <br />
&nbsp; &nbsp; array=$$('input'); <br />
&nbsp; &nbsp; var value=&quot;&quot;; <br />
&nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; array.each( <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; function (radio){ <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (radio.hasAttribute(&quot;name&quot;) &amp;&amp; radio.readAttribute(&quot;name&quot;)==radioName) <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (radio.checked==&quot;true&quot; || radio.checked) value=radio.getValue(); &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} <br />
&nbsp; &nbsp;);//End of each() <br />
&nbsp; &nbsp;return value; &nbsp;<br />
}</div></div>
</blockquote>
<p>Le nom de la fonction est dans le plus (im)pur style Prototype, RF signifiant RadioForm.<br />
On l&rsquo;utilisera ainsi :</p>
<blockquote>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">function doIt(){ <br />
&nbsp; alert($RF(&quot;radioGroup&quot;)); <br />
}</div></div>
</blockquote>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Créer programmatiquement la bonne balise HTML avec XSLT</title>
		<link>https://blog.developpez.com/java_rest/p5101/xml/creer_programatiquement_la_bonne_balise</link>
		<comments>https://blog.developpez.com/java_rest/p5101/xml/creer_programatiquement_la_bonne_balise#comments</comments>
		<pubDate>Thu, 14 Feb 2008 21:03:07 +0000</pubDate>
		<dc:creator><![CDATA[nicorama]]></dc:creator>
				<category><![CDATA[Astuce du Jour]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Ce petit article permet au débutants ou occasionnels d&#8217;XML de créer dynamiquement une balise HTML à partir d&#8217;un fichier XML. Edupassion.com fournira un éditeur de cours online spécialement concu pour les besoins d&#8217;un prof. Avec notamment une numérotation des paragraphes de type GrandX, PetitX, et Lettre. Le but du jeu est donc de traduire la balise XML &#60;paragraph depth=&#34;GrandX&#34; number=&#34;II&#34;&#62;value&#60;/paragraph &#62; en &#60;h2&#62;II) value&#60;/h2&#62; pour le XHTML, ou &#60;paragraph depth=&#34;Lettre&#34; number=&#34;c&#34;&#62;value&#60;/paragraph&#62; en &#60;h4&#62;c)value&#60;/h4&#62; XSLT a [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Ce petit article permet au débutants ou occasionnels d&rsquo;XML de créer dynamiquement une balise HTML à partir d&rsquo;un fichier XML.</p>
<p>Edupassion.com  fournira un éditeur de cours online spécialement concu pour les besoins  d&rsquo;un prof. Avec notamment une numérotation des paragraphes de type  GrandX, PetitX, et Lettre.<br />
Le but du jeu est donc de traduire la  balise XML &lt;paragraph depth=&quot;GrandX&quot;  number=&quot;II&quot;&gt;value&lt;/paragraph &gt; en  &lt;h2&gt;II)  value&lt;/h2&gt; pour le XHTML, ou &lt;paragraph depth=&quot;Lettre&quot;  number=&quot;c&quot;&gt;value&lt;/paragraph&gt; en  &lt;h4&gt;c)value&lt;/h4&gt;</p>
<p>XSLT  a pour objectif de transformer le Modèle (fichier XML) en Vue (fichier  XHTML), et il eut été logique qu&rsquo;XSLT transformasse aussi les nombres  des paragraphes en caractères adaptés comme &quot;II&quot;, ou &quot;c&quot;. Cette  opération purement fonctionnelle est cependant plus simple et surtout  plus propre à la relecture en utilisant Java.</p>
<p><span id="more-16"></span><br />
Pour résoudre le problème, la première idée qui vient à l&rsquo;esprit est de le traiter cas par cas :</p>
<p>&lt;xsl:template match=&quot;paragraph&quot;&gt;<br />
&lt;xsl:choose&gt;<br />
          &lt;xsl:when test=&quot;./@depth=&rsquo;GrandX&rsquo; &quot;&gt;<br />
               &lt;h2&gt;<br />
                &lt;xsl:value-of select&quot;./@number&quot;/&gt;)&lt;xsl:value-of select&quot;.&quot;/&gt;<br />
               &lt;/h2&gt;<br />
          &lt;/xsl:when&gt;<br />
</p>
<p>&lt;xsl:when test=&quot;./@depth=&rsquo;PetitX&rsquo; &quot;&gt;<br />
          &lt;h2&gt;<br />
                        &lt;xsl:value-of select&quot;./@number&quot;/&gt;)&lt;xsl:value-of select&quot;.&quot;/&gt;<br />
          &lt;/h2&gt;<br />
&lt;/xsl:when&gt;</p>
<p>&lt;xsl:when test=&quot;./@depth=&rsquo;Lettre&rsquo; &quot;&gt;<br />
      &lt;h2&gt;<br />
      &lt;xsl:value-of select&quot;./@number&quot;/&gt;)&lt;xsl:value-of select&quot;.&quot;/&gt;<br />
      &lt;/h2&gt;<br />
&lt;/xsl:when&gt;</p>
<p>&lt;/xsl:choose&gt;<br />
&lt;/xsl:template&gt;</p>
<p>Ca  marche, mais dès que la programmation sera plus complexe (séparation  entre le titre et le corps du paragraphe, ou boutons de controle),  alors le corps de chaque choix se remplira, ce qui n&rsquo;est pas bien beau.  On pourra utiliser &lt;xsl:apply-templates/&gt;, mais là encore,  l&rsquo;imbrication multiples de ces balises n&rsquo;est pas conseillée si ce code  doit être lu par des collègues non expert en XSLT.<br />
<br />
Comme la balise choisie est variable, nous allons tout logiquement utiliser une variable, et créer un element dynamiquement.</p>
<p>&lt;xsl:template match=&quot;paragraph&quot;&gt;</p>
<p>      &lt;xsl:variable name=&quot;baliseVar&quot;&gt;<br />
      &lt;xsl:choose&gt;<br /> <br />
        &lt;xsl:when test=&quot;./@depth=&rsquo;GrandX&rsquo; &quot;&gt;h2&lt;/xsl:when&gt;<br />
     &lt;xsl:when test=&quot;./@depth=&rsquo;PetitX&rsquo; &quot;&gt;h3&lt;/xsl:when&gt;<br />
        &lt;xsl:when test=&quot;./@depth=&rsquo;Lettre&rsquo; &quot;&gt;h4&lt;/xsl:when&gt;<br />
        &lt;xsl:otherwise&gt;h4&lt;/xsl:otherwise&gt;</p>
<p>       &lt;/xsl:choose&gt;<br />
       &lt;/xsl:variable&gt;</p>
<p>&lt;xsl:element name=&quot;{$baliseVar}&quot;&gt;<br />
&lt;xsl:value-of select=&quot;./@number&quot;/&gt;)<br />
&lt;xsl:value-of select&quot;.&quot;/&gt;<br />
&lt;/xsl:element&gt;<br />
&lt;/xsl:template&gt;<br />
<br />
On  ne gagne pas immédiatement en nombre de lignes, mais beaucoup en  clarté, car les deux problèmes sont clairement disjoints. Attention  toutefois à l&rsquo;utilisation des accolades dans &lt;xsl:element  name=&quot;{$baliseVar}&quot;&gt; , car contrairement au PHP, &quot;$baliseVar&quot; ne  sera pas traité par le processeur XSLT comme une variable, mais comme  un texte normal.</p>
<p>L&rsquo;utilisation des variables en XSLT est très  efficace pour se sortir des sentiers tortueux d&rsquo;XPATH. Mais XSLT a ses  limites, et je conseille fortement de faire les opérations les plus  complexes avec un langage comme Java &amp; JDOM.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Astuce du Jour : Création dynamique d&#8217;Elements HTML avec Prototype 1.6</title>
		<link>https://blog.developpez.com/java_rest/p5007/ajax/creation_dynamique_d_elements_html_avec_6</link>
		<comments>https://blog.developpez.com/java_rest/p5007/ajax/creation_dynamique_d_elements_html_avec_6#comments</comments>
		<pubDate>Fri, 01 Feb 2008 06:27:28 +0000</pubDate>
		<dc:creator><![CDATA[nicorama]]></dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Astuce du Jour]]></category>
		<category><![CDATA[Prototype]]></category>
		<category><![CDATA[Web 2.0]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[L&#8217;essence d&#8217;Ajax est de manipuler un objet ou un document sur le navigateur sans être géné par le temps de latence du serveur. Cette astuce du jour propose de préparer un peu le terrain en créant dynamiquement sur la page du contenu HTML. Nous verrons dans des articles plus fouillés comment enregistrer la modification sur le serveur. Le deuxième objectif est de documenter en français la fonction Element#insert( ) de Prototype, qui a ce jour [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>L&rsquo;essence d&rsquo;Ajax est de manipuler un objet ou un document sur le navigateur sans être géné par le temps de latence du serveur.</p>
<p>Cette astuce du jour propose de préparer un peu le terrain en créant dynamiquement sur la page du contenu HTML. Nous verrons dans des articles plus fouillés comment enregistrer la modification sur le serveur.<br />
Le deuxième objectif est de documenter en français la fonction <strong>Element#insert( ) de Prototype</strong>, qui a ce jour a été &laquo;&nbsp;oubliée&nbsp;&raquo; par les faiseurs de documentation.</p>
<p>Voici comment créer un Element HTML à l&rsquo;intérieur d&rsquo;un autre élément : </p>
<p><span id="more-15"></span></p>
<blockquote><p>
&lt;script type=&quot;text/javascript&quot; src=&quot;js/prototype.js&quot;&gt;&lt;/script&gt;</p>
<p>&lt;div id=&quot;haut&quot;&gt;Haut&lt;/div&gt;<br />
&lt;div id=&quot;bas&quot;&gt;Bas&lt;/div&gt;</p>
<p>&lt;script type=&quot;text/javascript&quot;&gt;<br />    /* Création de l&rsquo;élément */<br />    var numero = new Element(&lsquo;h3&prime;, { &lsquo;class': &lsquo;pNumber&rsquo; }).update(&lsquo;Titre&rsquo;);<br />    /* Insertion de l&rsquo;élément */<br />    $(&lsquo;haut&rsquo;).insert( {bottom: numero});</p>
<p>&lt;/script&gt;
</p></blockquote>
<p>&laquo;&nbsp;Mon dieu quelle horreur !&nbsp;&raquo; s&rsquo;écrierait tout programmeur orthodoxe de Java. J&rsquo;en fus et pourtant cette écriture complexe est extrèmement productive. Le fait d&rsquo;être compact est également un plus quand c&rsquo;est mélangé au milieu du XHTML.</p>
<p>Pour la création de l&rsquo;élément, vous trouverez la documentation et les exemples <a href="http://www.prototypejs.org/api/element">ici</a>. L&rsquo;insertion de l&rsquo;élément necessite plus d&rsquo;explications :</p>
<p><strong>$(&lsquo;haut&rsquo;)</strong> correspond bien-sûr à l&rsquo;élément HTML ayant pour id : &lsquo;haut&rsquo;. Pour les non-initiés à Prototype, cela correspond à <strong>document.getElementById(&lsquo;haut&rsquo;);</strong> tout en s&rsquo;assurant que <strong>$(&lsquo;haut&rsquo;)</strong> aura des propriétés compatibles avec tous les navigateurs.</p>
<p><strong>{bottom : numero}</strong> contient d&rsquo;une part la position, puis l&rsquo;élément OU le contenu à rajouter.<br />
On peut par exemple faire :</p>
<blockquote>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$('haut').insert( {after: '&lt;h3 class=&quot;pClass&quot;&gt;Petit paragraph&lt;/h3&gt;'}); <br />
$('haut').insert( {before: 'Un peu de texte, sans balise'});</div></div>
</blockquote>
<p>Il y a quatre positions possibles :  <strong>before, after, top , bottom</strong>. Voici ce que les différentes positions  donnent en pratique avec le code suivant : </p>
<blockquote>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">var numero = new Element('h3', { 'class': 'pNumber' }).update('Titre'); /* nouvel element */ &nbsp; <br />
$('haut').insert( {position : numero }); /* Insertion */</div></div>
</blockquote>
<table width="95%" border="1">
<tr>
<td>position</td>
<td>code créé</td>
<td>resultat</td>
<td width="250">commentaire</td>
</tr>
<tr>
<td>before</td>
<td>
<h3>Titre</h3>
<p></p>
<div id=&quot;haut&quot;>Haut</div>
<p></p>
<div id=&quot;bas&quot;>Bas</div>
</p>
</td>
<td>
<h3>Titre</h3>
<div>Haut</div>
<div>Bas</div>
</td>
<td width="250">L&rsquo;element h3 est créé avant l&rsquo;élément &lsquo;haut&rsquo;</td>
</tr>
<tr>
<td>after</td>
<td>
<div id=&quot;haut&quot;>Haut</div>
<p></p>
<h3>Titre</h3>
<p></p>
<div id=&quot;bas&quot;>Bas</div>
<p>
      </td>
<td>
<div>Haut</div>
<h3>Titre</h3>
<div>Bas</div>
</td>
<td width="250">L&rsquo;element h3 est créé après l&rsquo;élément &lsquo;haut&rsquo;.<br /> <br />
    Il s&rsquo;intercalle donc entre les deux DIV</td>
</tr>
<tr>
<td>top</td>
<td>
<div id=&quot;haut&quot;>
<h3>Titre</h3>
<p>Haut</p></div>
<p></p>
<div id=&quot;bas&quot;>Bas</div>
</td>
<td>
<div>
<h3>Titre</h3>
<p>Haut</p></div>
<div>Bas</div>
</td>
<td width="250">L&rsquo;element h3 est créé à l&rsquo;intérieur de l&rsquo;élément &lsquo;haut&rsquo;.<br /> <br />
      Parmi les fils de  l&rsquo;élément &lsquo;haut&rsquo;, h3 est rajouté en tout premier.</td>
</tr>
<tr>
<td>bottom</td>
<td>
<div id=&quot;haut&quot;>Haut<br />
<h3>Titre</h3>
</div>
<p></p>
<div id=&quot;bas&quot;>Bas</div>
</td>
<td>
<div> Haut<br />
<h3>Titre</h3>
</div>
<div>Bas</div>
</td>
<td width="250">L&rsquo;element h3 est créé à l&rsquo;intérieur de l&rsquo;élément &lsquo;haut&rsquo;.<br />
Parmi les fils de  l&rsquo;élément &lsquo;haut&rsquo;, h3 est rajouté tout à la fin..</td>
</tr>
</table>
<p>Ces quatres possibilités rendent l&rsquo;ajout d&rsquo;Elements bien plus aisés que le temps du document.write(&#8230;). Attention toutefois au style de programmation : comme pour le PHP et sans doute le Ruby, on peut toutefois facilement faire proliférer les abominables guillemets simples, doubles et backslachés.</p>
<p>Dernière astuce :il est possible de raccourcir l&rsquo;écriture en se passant de la position et des accolades en écrivant simplement :</p>
<blockquote><p><code class="codecolorer text default"><span class="text">$('haut').insert( numero);</span></code></p></blockquote>
<p>
Cela revient à utiliser la position <strong>bottom</strong>, ce qui sera probablement 80% de vos insertions.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
