{"id":1399,"date":"2014-03-09T16:19:51","date_gmt":"2014-03-09T14:19:51","guid":{"rendered":"http:\/\/hasselba.ch\/blog\/?p=1399"},"modified":"2014-03-09T16:21:43","modified_gmt":"2014-03-09T14:21:43","slug":"xpages-add-an-attribute-to-the-body-element","status":"publish","type":"post","link":"https:\/\/hasselba.ch\/blog\/?p=1399","title":{"rendered":"XPages: Add an attribute to the BODY-Element"},"content":{"rendered":"<p>Today I wanted to add an attribute to the &lt;BODY&gt; element of my XPage. My goal was to generate HTML code like this:<\/p>\n<pre><code>&lt;body role=\"<a>document<\/a>\"&gt;<\/code><\/pre>\n<p>After some testing I found a solution by overwriting the method <em>encodeHtmlBodyStart<\/em>. To do this, you have to extend the class <em>ViewRootRendererEx2<\/em>:<\/p>\n<pre><code>package ch.hasselba.xpages;\r\n\r\nimport java.io.IOException;\r\nimport javax.faces.context.FacesContext;\r\nimport javax.faces.context.ResponseWriter;\r\nimport com.ibm.xsp.component.UIViewRootEx;\r\nimport com.ibm.xsp.renderkit.html_basic.ViewRootRendererEx2;\r\n\r\npublic class MyViewRootRenderer extends ViewRootRendererEx2 {\r\n\r\n\u00a0\u00a0 \u00a0@Override\r\n\u00a0\u00a0 \u00a0protected void encodeHtmlBodyStart(FacesContext fc, UIViewRootEx uiRoot,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ResponseWriter writer) throws IOException {\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0writer.startElement(\"body\", uiRoot);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0writer.writeAttribute(\"role\", \"document\", \"role\");\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0writeln(writer);\r\n\u00a0\u00a0 \u00a0}\r\n\r\n}<\/code><\/pre>\n<p>To activate it you have to change the renderer class in the <em>faces-config.xml<\/em>:<\/p>\n<pre><code>&lt;faces-config&gt;  \r\n  &lt;render-kit&gt;\r\n    &lt;renderer&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;component-family&gt;javax.faces.ViewRoot&lt;\/component-family&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;renderer-type&gt;com.ibm.xsp.ViewRootEx&lt;\/renderer-type&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;renderer-class&gt;ch.hasselba.xpages.MyViewRootRenderer&lt;\/renderer-class&gt;\r\n\u00a0\u00a0\u00a0 &lt;\/renderer&gt;\r\n  &lt;\/render-kit&gt;\r\n&lt;\/faces-config&gt;\r\n<\/code><\/pre>\n<p>Now, the attribute is added correctly to my HTML code:<\/p>\n<p><img decoding=\"async\" alt=\"\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAASoAAACTCAIAAAC26sNxAAAU3UlEQVR4nO1dy7GrMBIlkFlOldJRPKxeAI7Ae1U5BufA4gYyMWgWgNRffQBb9r19ygvz0QfQoVtCfTRFg8EwCNPoChgMfxdGP4NhGIx+BsMwdNDv6f\/9m7bfPUhnLI\/b9O+fe\/z05yln+DIss5t2uHk5ktaHGIPf\/70ayxynKU5TnPxleQYfpym+o\/YEp+7gMrvuR\/ZKrFfg5mW7rK66lekXPM8u3C+kXyXDV2OZXT\/91hvu5gX+a04b3dxXGsIS3XX0izEu88voV7rSU3fQv+mN14iVdD7Af+hw6Q6r9FPvy+Vs+Tr6LbPb7nL+1wqj31rsiTv4YfQDNkqyVv30KzdKmS3P+5Rc0\/uTnf9v+nefH7fthNtjkTME\/i0+R0J2IN0csjMJLnb1CwoupnSl0C9FyBkHvyfK\/wBmtzuKLs4+puN+2vfvv9xAA\/UtV89wmiK60wr9sms6xclFWqElOlCiByesjSNXmGQeUG3JMy8UWrrSljuoAD5P9FjAgTUz1LlwTmgmpacO+SKWidIvs9tS5H\/0tqcfomKg9BPtJ7kHJWP19Ix+e5LklP7MN3TOnuHOPZa8hHTb6PsHdyoUt\/yY9SsieHCLQ5ymiLIv2IRAG\/HsIquwRL+AaRMoVTzYDB6VslIoVSl4UL0lOlifJTp4LbVCz9p5FYr1Yy0XuW97M8Hb29mkcVzboVet3xKdg\/RrtOpH6ZeTSJvbz\/dQL8YeXkmX9wL6za7ozhUbJUobpFEWiX7BM5YGzCJmuHJ+M64PKFRoN6D0SqF88zKozVTgWzpNaCYpH57hlc1Co9+6\/33Wr4V+\/T1A5U7VXQY1dYPzWa4RcjloonKjBAZQMH1Rpl92HeEPnIa8RExF2jiC4P2iH6heudD30680oiM86H1X5Xk3tiQVGv222yumKHHwNfS7h633eJu7xk0V+jW+v15g\/Qgoi2qNcjOAoumLzdavAOxSFuhXHjOoFzqAfnvLnVkDFpp0wfpdiS7rR2rXPfJ5gn4xxp+H63VBVQKJ778W63cKpL8k0S93vZboJPM4uehF0xeVvh8rdJkRixANmukXcadRqLxeaNOVHgQeK6XcIWMBdDfu4G1bcrfxIkai24LHArxs\/TKCT7WAPbSJfn+HX+T\/kSFQkPA2\/5BN9tkdjKBWvh\/KTgN\/5QkHFX\/jAh6ywS7+DKFTJxY4O2Y3pDE0PvLR4nlOZBgGnJ\/PxLRRx1T1Qhuv9CiQQ8jeX5Ld2N6zYOSTpKM+5pXvZOiok3Fsm3T2cZidOlJiqEHpOL2+l3EMRr8Pw6u6TH8DWpfJ6GcowxfcPEMV7Mt7Au1qfNKMGaOfwTAMRj+DYRiMfgbDMBj9DIZhMPoZDMNg9DMYhsHEJkxs4rIMW2FiEztMbMLEJq7MMMPEJrbDJjahwcQmTGziNExswsQmTGwCPWcTm6BJTGxi3WNiE+dgYhMmNqHDxCbkzctgYhMmNlGqkYlNNFzpcZjYhIlNNMPEJq6GiU2Y2IRaHRObaL7SgzCxCRObUCtlYhMdV3oUJjZheBlMbOIETGzCcAYmNnEGJjZhOAYTmzgFE5swGAxdMPoZDMNg9DMYhsHoZzAMg9HPYBgGo5+hFfI01Bj9xV\/Vh4FO3Hk9PoV+6\/SXA0G3T38gTiLG+HmqBUNELNqhTUM1+hVzLD\/TfrGJ1+Ao\/X4erl\/eYsVHhk0XJBheNBumMeC9b2L3n8IJWY3+Kdefhd9Ev4oEw0j6sQnWhowTshp9YhN0ajVq93u8wioVER63PfQhp\/LP\/B8Fv4M52Sm7ff9tfuacQYkwoZhD4YZpqgULm5MrnVpSLVAVLhoCxzQJBj5tmoftVXQf1p37JOmtuVTVEHLFpMiMwjQdPegxz8N2ccE1D+QEZfaPpuWBrneKk4sBvFm2bF1cQBFAMEKZOB72nUG+nJOyGh3htk+PWj\/efN4RN1YqQr2WFMpwf8a4aqIhV3N53Dh5lk0eZt+\/ZgsDml5g\/eRQJSRMoEVVNylcHIVq\/Wq6DzCIngfj161fg+nzxRNooaTCBf0oJsBR0vLgchjsbeJddFBcQw\/nRzsdugM0JOXENN12sQls3PDNFsL8wh3vWemn67gU6IfY9byjgMBXOJ8CpRKHSqoFjQoXR6HRr677sLcYLxm3Kv0E08dQph8vAl5LuVfpWfykGgfe0DutjBJp9GNqHahW19AvxlqgO5Qzg3GxLRwgtGHQ6Yd3krJe0\/fTtRsLqgUV9\/KsaoFKv7ruQ4wxRs\/8or36RXa19fo4\/YhXpopusBZPPe1mt7alb1x+Taj0kwQ+QHTuZfRby6sLvuxu4WYGpSD3n4eD7uVx+uFUb7B+6aCbZzoAVVIteHFUS4f1I9i9suAFWlZFJVqMt2cdTlglsYj1ckj+fOi\/6tamgpqs3zH68ZfLa6xfBusBUXogyjGerOMi19AP7H966vqiLqiYiVpiUbUgWysuggXvDLpPTQoXRwH9LqQXWNZ9wL4Tb98FNYT2AU\/UHEkqqQ8WdxUMX+jarYa9kDOZCcC8xNn1kbngfBIBAdqVPSqr0Sw2sSSRXE0MgrimiSTMZYVHebaQbxudwMin0HuEndJOpaaiaoGiGV5RLVAVLs4D+l1FPVxCJz7yyQVFxQHVRtMXWbMmI7EBq4nmVFJL9di39LBWVS0P3TXlQ5SgR1HU8lii8\/iKrpPV+JRZLzK6rNnFkD98fmrY9AvQ862vYlW+GlcL+0MY\/ZSSlf7vH6JfO\/T5aL8Bf5N+9Kv6sYmd\/eBf3qUj17qVX4iA3Mtf+zoKJZ\/zPD6XfgbDr4fRz2AYBqOfwTAMRj+DYRiMfgbDMByn3zI7G4A3GM7gMP2C3wfeQWDeSz\/Qpdkt9XWnDYavwFGxieDR\/nd9H\/+Zb5l+YEqcwfCNOCY2wRzPIfSLNgnF8N3oE5vYkB3PlITOjaaiSXB5QDxXmwpY0NktaEa16Hx+iSyNwUDRv7a7OOaCw\/\/I+rVYxYzrUNB8shXF0e57J1NM+3HCSQZDFe1iE+A0YSayQBscNIQMnh77hw7xKF4e74dq0fDyMBg+B73WT\/ncUKCfsio1iZFt1LCgfb8Ms36G70On2IRo+mKv9YMZ3nF\/j1m\/BvpZ38\/wpega+dS\/tBfoxz1G0KMjdNqGYRIbSbabIbWRT8MvQbPYRKyYvuw3ks0YoyCJm3t08NA9JGUKSavCPZ7pZP8UZYMNhi9C+6wXm2RmMFwMm3JtMAyD0c9gGAajn8EwDEY\/g2EYjH4GwzAY\/QyGYTD6GQzDYPQzGIahiX5XykmkGdjvUq0WAQWrr51MsK7a4ualurwRWjzkt6H9NvxpNItNXBnPXlts7G14wZRRfWVOAS0rQn4y9JVVCrfBNEIyjq\/vdwK\/mX7glaUr5ez4vfQr3wabKb+hWWxCWIiPLLUH1\/FjIXk86s8\/4c6V2Hj6daXq2YFE6+2BFytaE0VdxV2MX1RSstX7+DnL7Lat\/A+kRwvBEfrBo3w1PHjUh73pr2vTJRoEsMpc2BYGWZfv8yHnAAv14pJ3+6J\/ayX5UbiinbjQSvE2bFmYU9ocblteaJasbhvu7MxEp52l68lsWdxyPDuv1s4H9qbFT1e+MPlFgzsray\/mCm+JrO1M+n5k3VlyMtkky756bc1XsNiq39foWZeVpWfum5D2wUcHltT1bO3I88v6\/fEo6WaxidIy60JYetaJ4F4rzqpE4zq0jj2\/GIlq0r62lEfAG6sH9ONH82LltSXmSvTzeee2TnGin5QtNMjBUzaS5nHNqpp\/WCOkz\/rhvl9indSXS2pLWHYpxsj6fs\/7Hn3bafqiSo1Grmm7VPeywflUa1ps69LRvIZ4EHxRiIP0C8yBxMsjZ\/7vm5fTz6wfg7yoObdLPw+nWr8cxr48bhX6bV2++9xr+qJumYTHKuxqs35X4Susn1yBffNK+lnfr3fkE9oxLDiNJVvwJhYs23U7OZOPCMhXBk9I30\/s5sl9PzJSfgUjiS+3DmnAvh8qItC+HzKAAZkp2IXz0IKV6Scyqsv64To0r\/9qI58bmsQmwGf3BxjeLIx80nHLmqIEHa1pgOwH8k7bDvgqkV1IcMbKOPHQKcABQx\/y6OKKNMYortiMBhvJ0YBcx22o06OT6finlwqVKrPe0rTJ3wLaUK0M0wgB+JBJZ6v1u3f5nQbDt+Mz6Ndt+gyG34DR9GNf3tvxv\/\/8137f\/ntRs\/oWjKbfUQxvN\/a76je6KY2E0c9+g3+jm9JIGP3sN\/g3uimNxLfSLxoDf8VvdCMajC+mn8Hw7TD6vQR0ksoHgMcrGIajn34k8A9P9RyAFjGDNImlcbbFNi3Gh6Mzzr6SfiR0cAcJbkoYpCexzI4X1fuAy9l3TXQ6dRuaxSY2fEygekLrRXdNpc4zXv\/axGA4i3qbpzZHJ9GvS1bjOqjP8bq58l1TUk\/dhq71\/a6VnHgzup5Onpj416YoCkEMi0y\/LlmN6\/Bp9Dt1G5rFJvCMaklUQhWb2BbNnP7988\/8Hy7WV5GxKF14KeCOTpzez+L7pTnXOWoe7Pd4hnGer+xTwtIUZDi\/GZ7g2UTqdCYXhuht555Np8Y3KVcpdNGvrifBy5JvPGptukSImDydsdEvnaR7qMJBPgsfiiYUa6zdBq7WwX34zrXdNetXFJuIMQJy5hD4+x5LcZt\/wJK33f6t+NrDfbb9Jl6kGQGzoYFC20kC\/UhCqj1RiPdL5xyin5ZbJOoSSt9Ppd8h5OeS\/oHXfYPQR9n6pUPEhpCGjXw7XOhOxCusOVHrWANEED8brgtApl9RbGLfcZfM2s98I4Q80L1siqO9sH+Co1TlkFOJfmWCbfF4QJ3lWh00gX483FZk2uX0I65aflgtQh+tzifcFPy5fJhneFl\/n4\/AEQWDS6xfUWyicM5Kv5W3y+O2kfMK+pV3NTiftRK3piybvijRb7Ut7JeSL3Ocl7jM0a9WsRaK3guBfm3viOvpl54CMHl56LDkYMZj9JPS7PsqGiSn2krhnq8tp1lsYjvUav1QLHyMBfptuS2P25bDZdav0Wk5gp0bXpOpbmzZOMkagBtWu1fTd+nF51i\/zIncZdKsn5jBFdYPF1qVADoGrg9Qtn7kYppHPotiEzHGAv02C7k87lu2F\/b9gGlxl\/X9VswuzrPOEIk8Czt\/dujxeLfxYQ1I58\/\/FX0\/VIF39P32RhU8J0eD0Ad+s1KfRqYfywdtErZt9u4i+pHnRb\/rVJLnOnKZXbF3x8Um1CHTpEBxD3DwZj+\/9kFfcQvyA4C+TGlE7BgCHZZMO8mPaPWJnueKTIYlOsmuHqCfoIeLc4CDsfOC1EeJDkWHooRaGfAI0gs+PSe5a6CoSOLnDXa5eaGbajIpSyjafPJ1vb7yvHLn42KTzgyGl0H0OCCMfgbDq2D0MxjGgHj1Iox+3w3ePYO\/vzNX7kth9DMYhsHoZzAMg9HPYBgGo5\/BMAxGP4NhA1nh9A04Rj9lQaIcNPQe1OL9RuDdEgz7CtK\/AVrE09vK\/zD6lcJ32aTq99Nvw0ct0ThAguHq2IixuGbF3C9B55RrAIF+g\/BR9BsgwWD0+1q0i01E4HNyUYmnsu4fU6BAU7ebRCXgzOl1OqwSuRX5Xn2OLQ8uK+oauD2+rxqRpmkPJC8xTcvW1+ij0+TLChcr\/UA8IQ5YRXGG7NblmqTJ2S1vjDQzW1ay0AsNeNXBbbFBMElgpR+55AQ0zQC\/dFJWAfxvlraT8yxfKa08XmURJhcr46fOtd2TY7kHK1Drx4Lc88k5BqJnOTFihMX+VIP1o28UEg9INonZusyKLdG5HLxT7mkQXcCSwsWaLVYx0EITSITRVpaLDjT00NZkZxcdXMVan2RDC8UL93L1AIdX2NXukngD11pl6Z0up0jxI0pXyqKxSEgRCS4hz6VVbILz6ulb6bfZwI26PStpKkHrTdavmFNx0Aab2ws9odqTwxVm9kRTuJCavubCieH5xxR4CalIUysXCnU0yJXyyqiiGxJbxPdLVGbnsSev0q9wpbD+9LUoVQ8W2mj9WuLZY1TpBwxgj+lrjDpW6McdRRa1KbiXIEshaZMcgn49+HkQ+jE1CnLhqsJF7TF7nK1o\/Q68ZEhLIo2yUmgKR2aVLyvi0PDFWvvug06\/wpXCVKjyUvAneaytYhNPf4p+KYZdP0GCRCwuaqcqeaixz1Ix2uGNcVeYwQL9mAUraENQhQvJiqZ2QIyJbP2upl9LoWtyLsfA9TtSQVS5qMG89OEY\/faHRdUMGobEmkc+iczEtiptO\/1ybHuPkAR7E0ivhrrSGeUXTYFOZzb3spHVAv1wd0gTm5AVLtjnMhQ1z97HL6dfW6FrY+VFe+wWQsoJBvYz6Lc+Pl60+HKpWT+YHLU7MIwJRXKheG5BLXcb8+z+VkEcQSICqbqBJakJTX+XJRT80qMgA56B9kCQW+W3Te6z0R4LH1Cd6CBNztbFMKPhRM9co8bXDBkG9Dh5uVCYiTBI6+IC\/HBqT6AXF9B757g0hihCl\/zJ4pUmaMNdpFZgQC9ObOTTYDC8D0Y\/g2EYjH4GwzAY\/QyGYTD6GQzDYPQzGIbB6GcwDIPRz2AYBqOf4fuAVxz+BByskdHP8H0w+hkML8Iyu4\/RLngxjH6GT4PRz\/CbACaRu3kG61tKU9TBirOTmxeUFkeQ+ADnrovrm4rH4PqVaMU\/OZ5SFgGhrh6vEj0D5J1Oq9K8fqXldSNLawpGo98fQF7OOTLhDGpoyLnOOZIWrhfsnMMyIIifRNqD08U5ENgVAgo5qdEir5ELgKuE40LRFq17GeUrLdVomVEhNGHwk9Hvt4OHJ+ODJfrRZgZOF7JNLVDgD9tVGKs4QT8SOJZO6im+kq1SvLCrfBuW2flg9Pv9wB4djrCrWD+9kZXalkQOuk8kkFwpARr9iJwIiA0VrG87\/aovE+VmMUca+KjBu3kx+v0xYIeoZv240Ad4eastus36vZN+LEuh+hpKV1rcVb4Os35\/AbTxkG1Asc1IEn0cfDKVfMS+nmo421owOBvrgrT1tEr0E3rAXc6nfqXFGrEXGPJ5re\/3+1FWE5bHA7cWErybF+hBkXEEH1DmyoAgOyb4ZIKtbE2aK4u285lwwAWk6XQ+tSst1Ei6\/bTM\/wMSvJEll56+GgAAAABJRU5ErkJggg==\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Today I wanted to add an attribute to the &lt;BODY&gt; element of my XPage. My goal was to generate HTML code like this: &lt;body role=&#8220;document&#8220;&gt; After some testing I found a solution by overwriting the method encodeHtmlBodyStart. To do this, &hellip; <a href=\"https:\/\/hasselba.ch\/blog\/?p=1399\">Weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[89,26,74],"tags":[47,7,77,31,86,3],"class_list":["post-1399","post","type-post","status-publish","format-standard","hentry","category-java","category-jsf","category-xpages","tag-9-0","tag-domino","tag-html","tag-java","tag-jsf","tag-xpages"],"_links":{"self":[{"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1399","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1399"}],"version-history":[{"count":3,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1399\/revisions"}],"predecessor-version":[{"id":1402,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1399\/revisions\/1402"}],"wp:attachment":[{"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1399"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1399"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1399"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}