{"id":39,"date":"2007-07-06T14:38:30","date_gmt":"2007-07-06T13:38:30","guid":{"rendered":""},"modified":"2008-05-16T18:41:56","modified_gmt":"2008-05-16T17:41:56","slug":"sitemesh-gerer-son-layout-sans-douleur","status":"publish","type":"post","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/sitemesh-gerer-son-layout-sans-douleur\/","title":{"rendered":"Sitemesh : g\u00e9rer son layout sans douleur"},"content":{"rendered":"<p>La gestion des layouts dans les applications web a toujours \u00e9t\u00e9 pour moi un \u00e9pine dans le pieds jusqu&rsquo;\u00e0 ce que je d\u00e9couvre Sitemesh. Et pourtant, une API de layouting permet d&rsquo;\u00e9viter de copier\/coller du code inutile pour d\u00e9crire dans chaque page le header, la navigation, le footer, &#8230;<\/p>\n<p>Avant Sitemesh, deux solutions:<\/p>\n<ul>\n<li>inclusion de JSP<\/li>\n<li>Tiles<\/li>\n<\/ul>\n<p>L&rsquo;inclusion de JSP est basique et tr\u00e9s tr\u00e9s limit\u00e9 car ne peut r\u00e9ellement tirer profit des framework MVC. Pour moi ce n&rsquo;est pas une solution donc je ne vais pas en parler ici.<\/p>\n<p>Tr\u00e9s longtemps j&rsquo;ai utilis\u00e9 Tiles qui a de nombreux avantages :<\/p>\n<ul><li>Int\u00e9gration \u00e0 Struts et Spring<\/li>\n\n<li>Peut \u00eatre utilis\u00e9 comme framework MVC seul<\/li>\n\n<li>Configuration XML permettant l&rsquo;h\u00e9ritage<\/li>\n\n<li>Orientation composant avec un controlleur par composant<\/li>\n<\/ul>\n<p>Mais qui, h\u00e9las, comprend aussi de nombreux inconv\u00e9nients :<\/p>\n<ul><li>Fichier de configuration peu structur\u00e9 vite complexe et brouillon<\/li>\n\n<li>Pas de possibilit\u00e9 de partage de layouts entre diff\u00e9rents sites<\/li>\n\n<li>Pas de gestion sp\u00e9cifique des headers HTML (voir les possibilit\u00e9s de Sitemesh dans ce domaine)<\/li>\n\n<li>Tr\u00e9s vite, beaucoup d&rsquo;h\u00e9ritage entre composants rendent le fichier de configuration tr\u00e9s peu lisible<\/li>\n\n<li>Tr\u00e9s verbeux en configuration<\/li>\n<\/ul>\n<p>Sitemesh lui, a une approche forte diff\u00e9rente: Sitemesh utilise le design pattern decorator (<a href=\"http:\/\/pcaboche.developpez.com\/article\/design-patterns\/programmation-modulaire\/?page=page_2#L1.2\" target=\"_blank\">l&rsquo;article de pcaboche sur developpez<\/a>) pour &lsquo;ajouter&rsquo; des briques \u00e0 votre page. Concr\u00e9tement, vous ne d\u00e9veloppez que l&rsquo;int\u00e9rieur des pages, puis vous d\u00e9finissez dans Sitemesh un layout \u00e0 utiliser dans lequel vous donnez les diff\u00e9rents decorator qui vont aller ajouter des parties d&rsquo;HTML (donc vont aller d\u00e9corer) vos pages.<\/p>\n<p>La principale diff\u00e9rence de Sitemesh se situe dans le fait que vos pages peuvent \u00eatre cr\u00e9es avec n&rsquo;importe quelle technologie. Par exemple, vous d\u00e9finissez une page \/toto.do en Spring MVC (ou en Struts ou n&rsquo;importe quel framework que vous aimez), vous utilisez ensuite le filtre Servlet de Sitemesh et vous lui dites d&rsquo;intercepter les requ\u00eate en *.do, Sitemesh, lorsque vous appelez \/toto.do, va intercepter la requ\u00eate et la d\u00e9corer.<\/p>\n<p>Dans Sitemesh, les d\u00e9corateurs sont eux m\u00eame des pages compl\u00e8te (donc, \/footer.do, \/header.do, \/navigation.do ou \/toto.do peuvent \u00eatre vues ind\u00e9pendamment, en HTML et peuvent toutes \u00eatres des controlleurs SpringMVC), ce qui permet de les d\u00e9veloper et les tester ind\u00e9pendamment. Et en plus, Sitemesh peut d\u00e9corer une page d&rsquo;une site, par une page d&rsquo;un autre site!<\/p>\n<p>Derni\u00e8re fonctionalit\u00e9 \u00e9voqu\u00e9e, la gestion des header. Comme les pages d\u00e9cor\u00e9es et les d\u00e9corateurs sont des pages HTML compl\u00e8te, elles contiennent toutes un titre, des CSS, &#8230; Sitemesh permet donc, au niveau de la d\u00e9coration, de sp\u00e9cifier des header par d\u00e9faut puis de les r\u00e9\u00e9crire par l&rsquo;objet d\u00e9cor\u00e9. En fait, Sitemesh parse les diff\u00e9rentes pages HTML et nous donne acc\u00e9s aux \u00e9l\u00e9ments head et body de la page pour pouvoir aller puiser dedans les informations qui nous int\u00e9ressent.<\/p>\n<p>Bien sure, plein d&rsquo;autres fonctionalit\u00e9s pour ce framework tr\u00e9s simple d&rsquo;utilisation et de principe mais tr\u00e9s performant, allez voire sur le site &#8230; Je pr\u00e9cise quand m\u00eame que j&rsquo;utilise Tiles depuis 3 ans et que je vient de d\u00e9couvrire Sitemesh que j&rsquo;utilise pour un nouveau projets et j&rsquo;en suis tr\u00e9s content.<\/p>\n<p>Petit r\u00e9capitulatif Sitemesh:<\/p>\n<ul><li>Pattern decorator qui permet la separation entre le code et le layout, l&rsquo;int\u00e9gration du layout se fesant via un filtre en fin de requ\u00eate<\/li>\n\n<li>Possibilit\u00e9 d&rsquo;avoir les \u00e9l\u00e9ments du layout dans un site externe (donc de les partager entre plusieurs applications)<\/li>\n\n<li>Tout les \u00e9l\u00e9ments (\u00e9l\u00e9ments de layout et pages internes) sont des HTML complets et donc d\u00e9veloppable et testable ind\u00e9pendamment<\/li>\n\n<li>Agnostique par rapport \u00e0 la technologie web JAVA utilis\u00e9<\/li>\n\n<li>Gestion int\u00e9gr\u00e9 des diff\u00e9rents header des pages et des d\u00e9corateurs<\/li>\n<\/ul>\n<p><strong><span style=\"text-decoration: underline\">Un exemple simple :<\/span><\/strong><\/p>\n<p><strong>1. D\u00e9finition du filtre de servlet :<\/strong>\n<code>\n&lt;filter&gt;\n&lt;filter-name&gt;sitemesh&lt;\/filter&gt;\n&lt;filter-class&gt;com.opensymphony.module.sitemesh.filter.PageFilter&lt;\/filter&gt;\n&lt;\/filter&gt;\n<\/code><\/p>\n<p><strong>2. D\u00e9finition du fichier de configuration de Sitemesh :<\/strong>\n<code>\n&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;\n&lt;decorators defaultdir=&quot;\/view\/decorator&quot;&gt;\n&lt;decorator name=&quot;main&quot; page=&quot;main.jsp&quot;&gt;\n&lt;pattern&gt;\/*&lt;\/pattern&gt;\n&lt;excludes&gt;\n&lt;pattern&gt;\/ErrorPage&lt;\/pattern&gt;\n&lt;\/excludes&gt;\n&lt;\/decorator&gt;\n&lt;decorator name=&quot;empty&quot; page=&quot;empty.jsp&quot;\/&gt;\n&lt;\/decorators&gt;\n<\/code>\n<em>Ici, on d\u00e9finit la JSP main.jsp comme description de layout et je lui dit d&rsquo;appliquer ce layout \u00e0 toutes les pages \u00e0 l&rsquo;exclusion de la page \/ErrorPage. Le decorator empty servant \u00e0 pouvoir d\u00e9finir des decorateur &#8230; qui ne d\u00e9corent pas!<\/em><\/p>\n<p><strong>3. Voici enfin la page de layout :<\/strong>\n<code>\n&lt; ?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;\n&lt; %@ taglib uri=&quot;&lt;a href=&quot;http:\/\/www.opensymphony.com\/sitemesh\/decorator&quot;&gt;http:\/\/www.opensymphony.com\/sitemesh\/decorator&lt;\/a&gt;&quot; prefix=&quot;decorator&quot; %&gt;\n&lt; %@ taglib uri=&quot;&lt;a href=&quot;http:\/\/www.opensymphony.com\/sitemesh\/page&quot;&gt;http:\/\/www.opensymphony.com\/sitemesh\/page&lt;\/a&gt;&quot; prefix=&quot;page&quot; %&gt;\n&lt; !DOCTYPE html PUBLIC &quot;-\/\/W3C\/\/DTD XHTML 1.0 Strict\/\/EN&quot; &quot;&lt;a href=&quot;http:\/\/www.w3.org\/TR\/xhtml1\/DTD\/xhtml1-strict.dtd&quot;&amp;gt&quot;&gt;http:\/\/www.w3.org\/TR\/xhtml1\/DTD\/xhtml1-strict.dtd&quot;&amp;gt&lt;\/a&gt;;\n&lt;html&gt;\n&lt;head&gt;\n&lt;title&gt;&lt;decorator :title default=&quot;BELGACOM DEFAULT TITLE&quot;\/&gt;&lt;\/decorator&gt;&lt;\/title&gt;\n&lt;decorator:head\/&gt;\n&lt;div&gt;&lt;page:applyDecorator name=&quot;empty&quot; page=&quot;\/decorator\/header&quot;\/&gt;&lt;\/page&gt;&lt;\/div&gt;\n&lt;div&gt;&lt;decorator:body \/&gt;&lt;\/div&gt;\n&lt;div&gt;&lt;page:applyDecorator name=&quot;empty&quot; page=&quot;\/decorator\/footer&quot;\/&gt;&lt;\/page&gt;&lt;\/div&gt;\n&lt;\/head&gt;\n&lt;\/html&gt;\n<\/code>\n<em>Ici, on d\u00e9finit donc la pages HTML globale, on lui pr\u00e9cise des \u00e9l\u00e9ments du header globaux qui pourront \u00eatre red\u00e9finit dans l&rsquo;\u00e9l\u00e9ment d\u00e9cor\u00e9, puis on as ensuite la pages HTML de layout elle m\u00eame.<\/em><\/p>\n<ul><li><em> : renvoit le titre de la page d\u00e9cor\u00e9e<\/em><\/li>\n\n<li><em>  : renvoit le header de la page d\u00e9cor\u00e9<\/em><\/li>\n\n<li><em> : renvoit le body de la page d\u00e9cor\u00e9<\/em><\/li>\n\n<li><em> : applique le layout donn\u00e9 dans l&rsquo;attribut &lsquo;name&rsquo; sur la page donn\u00e9e dans l&rsquo;attribut &lsquo;page&rsquo; et met le r\u00e9sultat ici. Gr\u00e2ce \u00e0 cette ligne on d\u00e9core la page interne par des morceaux d&rsquo;autres pages, et on remarque que l&rsquo;on peut chainer les decorateurs facilement.<\/em><\/li>\n<\/ul>\n<p>Ce petit exemple est loin de montrer toutes les possibilit\u00e9s de Sitemesh mais qui permet d&rsquo;en montrer la simplicit\u00e9 et le fonctionnement g\u00e9n\u00e9rale.<\/p>\n<p>Site officiel de Sitemesh: <a href=\"http:\/\/www.opensymphony.com\/sitemesh\/\"><a href=\"http:\/\/www.opensymphony.com\/sitemesh\/\">http:\/\/www.opensymphony.com\/sitemesh\/<\/a><\/a><\/p>\n<p>N&rsquo;h\u00e9sitez pas \u00e0 faire vos remarques o\u00f9 \u00e0 me poser des questions.<\/p>\n<p><strong><strong><em> MISE A JOUR <\/em><\/strong><\/strong>\nCet article sur developpez.com: <a href=\"http:\/\/loic-mathieu.developpez.com\/java\/tutoriel\/sitemesh-intro\/\"><a href=\"http:\/\/loic-mathieu.developpez.com\/java\/tutoriel\/sitemesh-intro\/\">http:\/\/loic-mathieu.developpez.com\/java\/tutoriel\/sitemesh-intro\/<\/a><\/a><\/p>\n<p><strong><strong><em> MISE A JOUR <\/em><\/strong><\/strong>\nUn bug existe dans la version actuelle (corrig\u00e9 dans la version 2.4) au  niveau de la d\u00e9coration d&rsquo;une page d&rsquo;erreur. Toutes les informations ici: <a title=\"Permanent Link to Sitemesh : d\u00e9coration d\u2019une page d\u2019erreur\" rel=\"bookmark\" href=\"http:\/\/loicmathieu.free.fr\/wordpress\/\/?p=62\">Sitemesh : d\u00e9coration d\u2019une page d\u2019erreur<\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>Sitemesh permet de g\u00e9rer facilement le layout des application web JAVA. Une petite description de comment il marche.<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":4,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"","footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[9],"tags":[151,11,15,13,14],"class_list":["post-39","post","type-post","status-publish","format-standard","hentry","category-informatique","tag-informatique","tag-java","tag-layout","tag-sitemesh","tag-web"],"aioseo_notices":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":34,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/ajax-ou-flex-ou-flash-discussion-sans-fin\/","url_meta":{"origin":39,"position":0},"title":"Ajax ou Flex (ou Flash) : discussion sans fin","author":"admin","date":"mardi 22 mai 2007","format":false,"excerpt":"Web 2.0, Ajax, Flex (ou flash dynamic, cel\u00e0 revient quasiment au m\u00eame), ... quelle techno pour quelle utilisation, laquelle est la plus \u00e0 la mode (la plus 'hype' :-). Difficile de trancher, moi je ne vais pas le faire. J'utilise AJAX, et des coll\u00e8gues on fait un site complet en\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":19,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/ruby-on-rails\/","url_meta":{"origin":39,"position":1},"title":"Ruby on Rails","author":"admin","date":"jeudi 15 f\u00e9vrier 2007","format":false,"excerpt":"Bonjour, d'habitude au ton bucolique des vacances ou revendicatif des coups de gueules, aujourd'hui le ton de ce post va \u00eatre technophile. En effet, je bosse dans l'informatique qui est donc un de mes centre d'int\u00e9r\u00eat, et je vous livre ici mon premier message sur les nouvelles technologies. J'ai tester\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":62,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/sitemesh-decoration-dune-page-derreur\/","url_meta":{"origin":39,"position":2},"title":"Sitemesh : d\u00e9coration d&rsquo;une page d&rsquo;erreur","author":"admin","date":"mercredi 12 d\u00e9cembre 2007","format":false,"excerpt":"Bonjour, Il y a quelques temps, j'ai \u00e9crit un article introductif \u00e0 Sitemesh que l'on peut trouver ici: Sitemesh : g\u00e9rer son layout sans douleur. Un bug a \u00e9t\u00e9 trouv\u00e9 dans Sitemesh, normalement corrig\u00e9 dans la version 2.4 dont la date de sortie n'a pas encore \u00e9t\u00e9 annonc\u00e9e, je vais\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":64,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/convention-over-configuration\/","url_meta":{"origin":39,"position":3},"title":"convention over configuration","author":"admin","date":"mercredi 19 d\u00e9cembre 2007","format":false,"excerpt":"\"Convention over Configuration\" (on trouve parfois une traduction par \"convention plut\u00f4t que configuration), ce design pattern (ou patron de conception, pour faire plaisir aux francophones intransigeant) est un des plus int\u00e9r\u00e9ssant de ceux \u00e0 la mode en ce moment. Le principe en est tr\u00e8s simple: les applications se basent sur\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":92,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/rest-architecture-orientee-ressource\/","url_meta":{"origin":39,"position":4},"title":"REST &#8211; Architecture Orient\u00e9e Ressource","author":"admin","date":"mercredi 25 mars 2009","format":false,"excerpt":"Au menu aujourd'hui, un sujet tr\u00e8s tendance: REST. Abord\u00e9\u00a0 par le biais de l'Architecture Orient\u00e9 Ressource (ou ROA: Resource Oriented Architecture), autrement dit, comment cr\u00e9er une architecture de service bas\u00e9 sur REST. D\u00e9finitions Comme toujours, commen\u00e7ons par quelques d\u00e9finitions. Je vais les faire assez th\u00e9orique sinon apr\u00e8s, il ne me\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":20,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/ror-et-java-trails\/","url_meta":{"origin":39,"position":5},"title":"RoR et JAVA = Trails","author":"admin","date":"vendredi 16 f\u00e9vrier 2007","format":false,"excerpt":"Bonjour, Encore un petit article informatique. Hier je vous ai parler de RoR (Ruby on Rails) dans cet article ci. J'ai d\u00e9couvert qu'un framework java nomm\u00e9 Trails avait pour but de permettre exactement la m\u00eame chose que RoR avec JAVA (g\u00e9n\u00e9ration de al structure du projet, du mapping object relationel,\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/39","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/comments?post=39"}],"version-history":[{"count":0,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/39\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/media?parent=39"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/categories?post=39"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/tags?post=39"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}