<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6976937843030293501</id><updated>2011-07-30T18:53:49.565-07:00</updated><title type='text'>Le blog de fx</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://leblogdefx.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6976937843030293501/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://leblogdefx.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>François-Xavier Bonnet</name><uri>http://www.blogger.com/profile/03259946979359845913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_xM1livk6zDo/SqYbQDZiUNI/AAAAAAAACa8/Ga9VI1hyDLg/S220/fxbonnet.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>8</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6976937843030293501.post-1960311538215686733</id><published>2011-03-30T02:40:00.000-07:00</published><updated>2011-03-30T02:40:34.913-07:00</updated><title type='text'>Faire tourner GWT sur un environnement .NET, qui a dit impossible ?</title><content type='html'>Après avoir réussi à faire tourner et à compiler des applications Java Spring / Hibernate sous environnement .NET à l'aide de IKVM, l'étape suivante : faire tourner une application web java dans IIS. Pour tester, quel meilleur exemple qu'une application GWT ?&lt;br /&gt;&lt;br /&gt;A priori personne n'avait tenté ça avant nous. Les articles trouvés sur internet parlaient d'essais de développement de services RPC dans d'autres technologies avec GWT utilisé uniquement pour la partie client (html et javascript). Notre objectif était différent : développer une interface web en utilisant GWT à la fois pour la partie client (html et javascript) et pour la partie serveur (servlet RPC), donc vraiment un développement standard GWT. Ensuite utiliser IKVM pour compiler cette application en .NET et la transformer en une application web .NET pour la faire tourner dans un serveur IIS.&lt;br /&gt;&lt;br /&gt;Deux difficultés :&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;compiler le code java, en particulier GWT à l'aide de IKVM&lt;/li&gt;&lt;li&gt;faire un pont entre l'API Servlet Java et l'API System.web&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Eh bien ça marche !&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;L'article complet se trouve ici :&lt;/div&gt;&lt;div&gt;&lt;a href="http://blog.smile.fr/Faire-tourner-GWT-sur-un-environnement-.NET-qui-a-dit-impossible-Partie-1"&gt;http://blog.smile.fr/Faire-tourner-GWT-sur-un-environnement-.NET-qui-a-dit-impossible-Partie-1&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://blog.smile.fr/Faire-tourner-GWT-sur-un-environnement-.NET-qui-a-dit-impossible-Partie-2"&gt;http://blog.smile.fr/Faire-tourner-GWT-sur-un-environnement-.NET-qui-a-dit-impossible-Partie-2&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/6976937843030293501-1960311538215686733?l=leblogdefx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leblogdefx.blogspot.com/feeds/1960311538215686733/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6976937843030293501&amp;postID=1960311538215686733' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6976937843030293501/posts/default/1960311538215686733'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6976937843030293501/posts/default/1960311538215686733'/><link rel='alternate' type='text/html' href='http://leblogdefx.blogspot.com/2011/03/faire-tourner-gwt-sur-un-environnement.html' title='Faire tourner GWT sur un environnement .NET, qui a dit impossible ?'/><author><name>François-Xavier Bonnet</name><uri>http://www.blogger.com/profile/03259946979359845913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_xM1livk6zDo/SqYbQDZiUNI/AAAAAAAACa8/Ga9VI1hyDLg/S220/fxbonnet.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6976937843030293501.post-2790083949764990007</id><published>2011-02-08T03:43:00.000-08:00</published><updated>2011-02-08T03:43:08.890-08:00</updated><title type='text'>Article sur ESIGate</title><content type='html'>Pour ceux qui ne connaitraient pas encore ESIGate, un petit article qui explique ce que c'est :&lt;br /&gt;&lt;a href="http://blog.smile.fr/ESIGate-le-portail-d-un-genre-nouveau"&gt;http://blog.smile.fr/ESIGate-le-portail-d-un-genre-nouveau&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Pas évident d'expliquer à quoi ça sert sans trop rentrer dans les détails techniques...&lt;br /&gt;Sinon ESIGate c'est ici :&lt;br /&gt;&lt;a href="http://www.esigate.org/"&gt;http://www.esigate.org&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6976937843030293501-2790083949764990007?l=leblogdefx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leblogdefx.blogspot.com/feeds/2790083949764990007/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6976937843030293501&amp;postID=2790083949764990007' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6976937843030293501/posts/default/2790083949764990007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6976937843030293501/posts/default/2790083949764990007'/><link rel='alternate' type='text/html' href='http://leblogdefx.blogspot.com/2011/02/article-sur-esigate.html' title='Article sur ESIGate'/><author><name>François-Xavier Bonnet</name><uri>http://www.blogger.com/profile/03259946979359845913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_xM1livk6zDo/SqYbQDZiUNI/AAAAAAAACa8/Ga9VI1hyDLg/S220/fxbonnet.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6976937843030293501.post-1751241307858498567</id><published>2011-02-08T02:43:00.000-08:00</published><updated>2011-02-08T02:43:04.257-08:00</updated><title type='text'>Marier Java et .NET à l'aide de IKVM</title><content type='html'>IKVM, la machine virtuelle Java écrite en .NET semble maintenant être arrivée à maturité. Rappel des principes :&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;partant du constat que le JDK et le framework .NET se ressemblent énormément (les mauvaises langues diront qu'ils se copient mutuellement) IKVM, plutôt que de réimplémenter un JDK à partir de zéro, implémente les fonctionnalités du JDK soit en utilisant la fonctionnalité correspondante du framework .NET soit en réutilisant du code de OpenJDK&lt;/li&gt;&lt;li&gt;IKVM tourne sous environnement Microsoft .NET ou Mono mais c'est déjà bien puisque on peut déjà choisir entre les environnements Windows ou Linux&lt;/li&gt;&lt;li&gt;IKVM permet de convertir une librairie Java en .NET pour utilisation dans une application .NET (un .jar devient une .dll !)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Il restait à vérifier que l'outil est bien à la hauteur de ses promesses en faisant un proto faisant tourner une applications Java et des librairies Java complexe dans cette environnement. Le choix s'est porté sur une application utilisant Spring et Hibernate. Le résultat est au&amp;nbsp;delà&amp;nbsp;&amp;nbsp;des espérances :&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;l'application java fonctionne et peut même être convertie en un fichier .exe !&lt;/li&gt;&lt;li&gt;un rapide test de performances montre des résultats similaires à la même application tournant avec le JDK Oracle&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;L'article détaillé se trouve ici :&lt;/div&gt;&lt;div&gt;&lt;a href="http://blog.smile.fr/Java-ou-.NET-et-pourquoi-pas-les-deux-!"&gt;http://blog.smile.fr/Java-ou-.NET-et-pourquoi-pas-les-deux-!&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Prochaine étape : arriver à faire tourner une application web java dans IIS. Les tests en cours sont encourageants.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6976937843030293501-1751241307858498567?l=leblogdefx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leblogdefx.blogspot.com/feeds/1751241307858498567/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6976937843030293501&amp;postID=1751241307858498567' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6976937843030293501/posts/default/1751241307858498567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6976937843030293501/posts/default/1751241307858498567'/><link rel='alternate' type='text/html' href='http://leblogdefx.blogspot.com/2011/02/marier-java-et-net-laide-de-ikvm.html' title='Marier Java et .NET à l&apos;aide de IKVM'/><author><name>François-Xavier Bonnet</name><uri>http://www.blogger.com/profile/03259946979359845913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_xM1livk6zDo/SqYbQDZiUNI/AAAAAAAACa8/Ga9VI1hyDLg/S220/fxbonnet.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6976937843030293501.post-4495054199691883133</id><published>2009-11-02T07:55:00.000-08:00</published><updated>2009-11-02T08:59:44.223-08:00</updated><title type='text'>Parser une page HTML ou la transformer avec XSL</title><content type='html'>En Java, quelques outils open-source permettent de traiter comme un fichier xml une page HTML, même mal formée au sens xml (par exemple avec des balises non fermées type "&amp;lt;br&amp;gt;").&lt;div&gt;&lt;br /&gt;&lt;div&gt;J'ai testé un peu les deux outils les plus connus &lt;a href="http://htmlparser.sourceforge.net/"&gt;htmlparser &lt;/a&gt;et &lt;a href="http://sourceforge.net/projects/nekohtml/"&gt;CyberNeko&lt;/a&gt; ainsi qu'un troisième que je ne connaissais pas : &lt;a href="http://about.validator.nu/htmlparser/"&gt;validator.nu HTML Parser&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ce que j'ai noté :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;htmlparser&lt;br /&gt;&lt;ul&gt;&lt;li&gt;pas de dépendances (pratique pour l'utiliser dans un projet)&lt;/li&gt;&lt;li&gt;le parsing se fait via une API propriétaire&lt;/li&gt;&lt;li&gt;il permet de construire un document en mémoire qu'on peut ensuite manipuler (pas terrible si on veut s'en servir sur des gros volumes)&lt;/li&gt;&lt;li&gt;l'outil peut charger une page directement depuis le web&lt;/li&gt;&lt;li&gt;assez pratique à utiliser pour réaliser un crawler de sites&lt;/li&gt;&lt;li&gt;projet peu actif (la dernière version stable date de juin 2006, autant dire que le projet est mort)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;CyberNeko&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;dépend de Xerces dont il utilise l'API (assez gênant quand on l'utilise dans un projet vu qu'il ramène une version de XercesImpl ainsi que de xml-apis)&lt;/li&gt;&lt;li&gt;transforme une page en un document DOM (pas idéal pour les performances)&lt;/li&gt;&lt;li&gt;normalise tous les tags en html 4 (noms de tags en majuscules, attributs en minuscules) mais sans notion de namespace. Un peu surprenant.&lt;/li&gt;&lt;li&gt;projet actif (la dernière version stable date de septembre 2009)&lt;/li&gt;&lt;li&gt;donne de bon résultats en performances d'après le benchmark réalisé par le projet &lt;a href="http://www.portletbridge.org/saxbenchmark/index.html"&gt;PortletBridge&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Validator.nu HTML Parser&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;projet récent et actif&lt;/li&gt;&lt;li&gt;implémentation de l'algorithme de parsing standardisé html 5&lt;/li&gt;&lt;li&gt;pas de dépendances (pratique pour l'utiliser dans un projet)&lt;/li&gt;&lt;li&gt;permet de faire du SAX&lt;/li&gt;&lt;li&gt;permet de transformer directement un document via xslt&lt;/li&gt;&lt;li&gt;nécessite un parser xml pas trop ancien (ne fonctionne pas par exemple avec le plugin maven cargo et jetty embedded)&lt;/li&gt;&lt;li&gt;compilable avec GWT (ça peut servir ?)&lt;/li&gt;&lt;li&gt;attribue par défaut aux tags html le namespace xmlns="http://www.w3.org/1999/xhtml" donc il vaut mieux bien connaitre la manipulation des namespaces avant de s'en servir&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Personnellement, je préfère largement le troisième qui m'a permis de transformer une page html non conforme xml en seulement quelques lignes de code et sans faire de DOM, uniquement en SAX et sans introduire de dépendances supplémentaires dans mon projet.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6976937843030293501-4495054199691883133?l=leblogdefx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leblogdefx.blogspot.com/feeds/4495054199691883133/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6976937843030293501&amp;postID=4495054199691883133' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6976937843030293501/posts/default/4495054199691883133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6976937843030293501/posts/default/4495054199691883133'/><link rel='alternate' type='text/html' href='http://leblogdefx.blogspot.com/2009/11/parser-une-page-html-ou-la-transformer.html' title='Parser une page HTML ou la transformer avec XSL'/><author><name>François-Xavier Bonnet</name><uri>http://www.blogger.com/profile/03259946979359845913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_xM1livk6zDo/SqYbQDZiUNI/AAAAAAAACa8/Ga9VI1hyDLg/S220/fxbonnet.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6976937843030293501.post-3335421209409625989</id><published>2008-12-17T09:13:00.000-08:00</published><updated>2008-12-17T09:47:25.981-08:00</updated><title type='text'>Squill : ceci n'est pas un ORM</title><content type='html'>&lt;div&gt;Fichiers xml de mapping, annotations JPA, Hibernate, HQL Criteria... Voila avec quoi doivent jongler les développeurs Java pour accéder à une base de données.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Résultat :&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;un long apprentissage pour maitriser tout ça&lt;/li&gt;&lt;li&gt;le développeur est éloigné du SQL, bugs et problèmes de performances sont inévitables&lt;/li&gt;&lt;li&gt;la plupart des problèmes ne sont identifiés qu'à l'exécution, en cours de développement, il n'y a aucune vérification de la cohérence des développements avec la structure de la base&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Squill propose une approche radicalement différente :&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;une tache ant génère un ensemble de classe correspondant aux tables de la base&lt;/li&gt;&lt;li&gt;le développeur utilise ces classes qui offrent des méthodes correspondant aux différentes instructions SQL&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Les avantages sont énormes :&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Le développeur code pratiquement du SQL&lt;/li&gt;&lt;li&gt;Aucun SQL généré automatiquement&lt;/li&gt;&lt;li&gt;Tout est vérifié à la compilation (ex : si on supprime une colonne, on a une erreur de compilation !)&lt;/li&gt;&lt;li&gt;Autocompletion&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Enfin tout ça, c'est la théorie. Pour l'instant ce n'est que de la version beta, mais j'aime beaucoup l'idée.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="https://squill.dev.java.net/"&gt;https://squill.dev.java.net/&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6976937843030293501-3335421209409625989?l=leblogdefx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leblogdefx.blogspot.com/feeds/3335421209409625989/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6976937843030293501&amp;postID=3335421209409625989' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6976937843030293501/posts/default/3335421209409625989'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6976937843030293501/posts/default/3335421209409625989'/><link rel='alternate' type='text/html' href='http://leblogdefx.blogspot.com/2008/12/squill-ceci-nest-pas-un-orm.html' title='Squill : ceci n&apos;est pas un ORM'/><author><name>François-Xavier Bonnet</name><uri>http://www.blogger.com/profile/03259946979359845913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_xM1livk6zDo/SqYbQDZiUNI/AAAAAAAACa8/Ga9VI1hyDLg/S220/fxbonnet.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6976937843030293501.post-7000166597582980541</id><published>2008-07-07T03:22:00.000-07:00</published><updated>2008-07-07T03:23:56.886-07:00</updated><title type='text'>Portlet, bridge et servlet filter</title><content type='html'>Pour ceux qui se sont arrachés les cheveux à essayer d'intégrer des webapp en portlet via un bridge, il est possible de faire fonctionner les servlet filter dans l'application. Pour cela il faut :&lt;br /&gt;1) être en servlet 2.4 ou +&lt;br /&gt;Il faut donc utiliser le bon schema au niveau du fichier web.xml&lt;br /&gt;Tourner sous un Tomcat 5.5 ou +&lt;br /&gt;2) utiliser l'élément &lt;dispatcher&gt; au niveau de chacun des filter pour indiquer s'il doit être exécuté en cas de forward/include&lt;br /&gt;Attention au risque de boucle infinie !&lt;br /&gt;&lt;br /&gt;Plus de détails :&lt;br /&gt;&lt;a href="http://www.ibm.com/developerworks/java/library/j-tomcat2/"&gt;http://www.ibm.com/developerworks/java/library/j-tomcat2/#N10082&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Extrait de la spec servlet 2.4 :&lt;br /&gt;SRV.6.2.5 Filters and the RequestDispatcher&lt;br /&gt;New for version 2.4 of the Java Servlet specification is the ability to configure filters&lt;br /&gt;to be invoked under request dispatcher forward() and include() calls.&lt;br /&gt;By using the new &lt;dispatcher&gt; element in the deployment descriptor, the&lt;br /&gt;developer can indicate for a filter-mapping whether he would like the filter to be&lt;br /&gt;applied to requests when:&lt;br /&gt;1. The request comes directly from the client.&lt;br /&gt;This is indicated by a &lt;dispatcher&gt; element with value REQUEST,&lt;br /&gt;or by the absence of any &lt;dispatcher&gt; elements.&lt;br /&gt;2. The request is being processed under a request dispatcher representing the&lt;br /&gt;Web component matching the &lt;url-pattern&gt; or &lt;servlet-name&gt; using a forward()&lt;br /&gt;call.&lt;br /&gt;This is indicated by a &lt;dispatcher&gt; element with value FORWARD.&lt;br /&gt;3. The request is being processed under a request dispatcher representing the&lt;br /&gt;Web component matching the &lt;url-pattern&gt; or &lt;servlet-name&gt; using an include()&lt;br /&gt;call.&lt;br /&gt;This is indicated by a &lt;dispatcher&gt; element with value INCLUDE.&lt;br /&gt;4. The request is being processed with the error page mechanism specified in "Error&lt;br /&gt;Handling" on page 73 to an error resource matching the &lt;url-pattern&gt;.&lt;br /&gt;This is indicated by a &lt;dispatcher&gt; element with the value ERROR.&lt;br /&gt;5. Or any combination of 1, 2, 3, or 4 above.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6976937843030293501-7000166597582980541?l=leblogdefx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leblogdefx.blogspot.com/feeds/7000166597582980541/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6976937843030293501&amp;postID=7000166597582980541' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6976937843030293501/posts/default/7000166597582980541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6976937843030293501/posts/default/7000166597582980541'/><link rel='alternate' type='text/html' href='http://leblogdefx.blogspot.com/2008/07/portlet-bridge-et-servlet-filter.html' title='Portlet, bridge et servlet filter'/><author><name>François-Xavier Bonnet</name><uri>http://www.blogger.com/profile/03259946979359845913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_xM1livk6zDo/SqYbQDZiUNI/AAAAAAAACa8/Ga9VI1hyDLg/S220/fxbonnet.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6976937843030293501.post-4250287440981457743</id><published>2008-07-03T05:59:00.000-07:00</published><updated>2008-07-03T07:23:32.515-07:00</updated><title type='text'>Manipulation des chaines de caractères et performances en Java</title><content type='html'>En Java, dans des programmes qui doivent manipuler, analyser et traiter des chaines de caractères, la manière de coder peut avoir un gros impact sur les performances. Quelques éléments clé à prendre en compte :&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Une String est un objet immuable. Elle peut être utilisée en parallèle par plusieurs Threads simultanément en toute sécurité. Il est donc inutile de copier une chaine de caractère en faisant new String(s).&lt;/li&gt;&lt;li&gt;Inutile de sortir systématiquement vos chaines de caractères comme des constantes, le compilateur le fait pour vous !&lt;/li&gt;&lt;li&gt;Une chaine de caractère contient un char[]. Les opérations de type substring() sont très peu couteuses en mémoire ou en CPU puisqu'il n'y a pas copie de ce tableau mais simplement création d'un nouvel objet String qui pointe vers le même tableau.&lt;/li&gt;&lt;li&gt;A la compilation, une concaténation de chaines de caractères "toto" + "titi" est automatiquement remplacée par la création d'un StringBuilder. Cette classe existe depuis le JDK 1.5 et est bien plus performante que la classe StringBuffer. L'API est la même mais il n'y a pas de synchronized (a ne pas utiliser en accès multithread donc). Donc remplacer dans une méthode les concaténation de chaine par des StringBuffer comme on le recommandait il y a quelques années fait désormais baisser les performances !&lt;/li&gt;&lt;li&gt;Un StringBuilder ou un StringBuffer contient lui aussi un char[] dont la taille par défaut est 16. Dès que le buffer est plein, le char[] est automatiquement remplacé par un char deux fois plus grand dans lequel le premier est copié. Bien dimensionner le buffer à l'origine peut donc économiser pas mal d'opérations de copie.&lt;/li&gt;&lt;li&gt;L'appel de la méthode toString() d'un StringBuilder ou d'un StringBuffer déclenche la copie du char[] qu'il contient. Ne pas faire writer.append(stringBuffer.toString()) mais plutôt directement writer.append(stringBuffer) permet d'éviter une opération de copie.&lt;/li&gt;&lt;li&gt;Toutes les opérations de type replace() ou replaceall() déclenchent des copies du tableau.&lt;/li&gt;&lt;li&gt;On peut exécuter des recherches et des remplacements directement sur des StringBuffer sans faire de toString() de la manière suivante :&lt;br /&gt;stringBuilder=Pattern.compile("expr").matcher("stringBuilder").replaceAll("newvalue"); On économise ainsi une copie.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Ne pas hésiter à décompiler les classes String et StringBuilder pour bien comprendre comment tout ça fonctionne. C'est très instructif et ça aide beaucoup à optimiser le code.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6976937843030293501-4250287440981457743?l=leblogdefx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leblogdefx.blogspot.com/feeds/4250287440981457743/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6976937843030293501&amp;postID=4250287440981457743' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6976937843030293501/posts/default/4250287440981457743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6976937843030293501/posts/default/4250287440981457743'/><link rel='alternate' type='text/html' href='http://leblogdefx.blogspot.com/2008/07/manipulation-des-chaines-de-caractres.html' title='Manipulation des chaines de caractères et performances en Java'/><author><name>François-Xavier Bonnet</name><uri>http://www.blogger.com/profile/03259946979359845913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_xM1livk6zDo/SqYbQDZiUNI/AAAAAAAACa8/Ga9VI1hyDLg/S220/fxbonnet.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6976937843030293501.post-5988885299839163773</id><published>2008-06-24T05:31:00.000-07:00</published><updated>2008-06-24T05:37:30.454-07:00</updated><title type='text'>Mort aux fichiers xml de configuration</title><content type='html'>En tant que développeur Java, je déteste passer mon temps à écrire des fichiers xml. La plupart des frameworks à la mode demandent d'énormes fichiers de configuration qui ont la facheuse habitude de nécessiter à chaque modification un redémarrage des applications.&lt;br /&gt;&lt;br /&gt;Pourquoi ne pas coder tout ça en Java directement ? Pour l'essentiel, il ne s'agit pas de paramétrages mais de choses qui ne changeront jamais dans la vie de l'application. Alors pourquoi supporter un parsing lourd et source de bugs à chaque démarrage de l'application ? Les rares paramètres qui nécessitent réellement d'être changés de temps en temps sont ceux qui dépendent de la configuration de déploiement (machines, adresses, mots de passe...), ils tiendraient dans un properties.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6976937843030293501-5988885299839163773?l=leblogdefx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leblogdefx.blogspot.com/feeds/5988885299839163773/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6976937843030293501&amp;postID=5988885299839163773' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6976937843030293501/posts/default/5988885299839163773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6976937843030293501/posts/default/5988885299839163773'/><link rel='alternate' type='text/html' href='http://leblogdefx.blogspot.com/2008/06/mort-aux-fichiers-xml-de-configuration.html' title='Mort aux fichiers xml de configuration'/><author><name>François-Xavier Bonnet</name><uri>http://www.blogger.com/profile/03259946979359845913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_xM1livk6zDo/SqYbQDZiUNI/AAAAAAAACa8/Ga9VI1hyDLg/S220/fxbonnet.jpg'/></author><thr:total>0</thr:total></entry></feed>
