{"id":380,"date":"2009-05-10T19:16:38","date_gmt":"2009-05-11T04:16:38","guid":{"rendered":"https:\/\/www.kellyrob99.com\/blog\/?p=380"},"modified":"2009-05-10T20:54:38","modified_gmt":"2009-05-11T05:54:38","slug":"gracelets-and-seam-a-dsl-for-facelets-with-easy-integration","status":"publish","type":"post","link":"https:\/\/www.kellyrob99.com\/blog\/2009\/05\/10\/gracelets-and-seam-a-dsl-for-facelets-with-easy-integration\/","title":{"rendered":"Gracelets and Seam &#8211; a DSL for Facelets and Groovy with easy integration"},"content":{"rendered":"<p>Over the last year I&#8217;ve done a lot of work with <a class=\"zem_slink\" href=\"http:\/\/www.seamframework.org\" title=\"JBoss Seam\" rel=\"homepage\">JBoss Seam<\/a>, and while it&#8217;s not <a class=\"zem_slink\" href=\"http:\/\/grails.org\" title=\"Grails (framework)\" rel=\"homepage\">Grails<\/a> it&#8217;s also not that bad for a web framework.  Facelets is the view technology of choice, and it&#8217;s certainly better than many alternatives, but at the heart it is still xml and all those brackets make me dizzy after awhile.  Along comes <a href=\"http:\/\/gracelets.sourceforge.net\/index.html\">Gracelets<\/a> to provide a nice builder <a class=\"zem_slink\" href=\"http:\/\/en.wikipedia.org\/wiki\/Digital_subscriber_line\" title=\"Digital subscriber line\" rel=\"wikipedia\">DSL<\/a> and Groovy integration as a replacement for my xml woes. Yay!  It also brings some great simplification to the creation of component libraries &#8211; including hot deployment.  But enough of the sales pitch, let&#8217;s see if it works.<\/p>\n<p>In order to test drive Gracelets, I took an existing Seam web-app and configured the web.xml with the GraceletsViewHandler in place of the standard SeamListener.  I generally use <a class=\"zem_slink\" href=\"http:\/\/maven.apache.org\" title=\"Apache Maven\" rel=\"homepage\">Maven<\/a> for dependency management, and I couldn&#8217;t find a repository hosting Gracelets so I installed the downloaded jars into my local repository and adding them to the web-app. The JBoss Seam Extension is also required.<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nmvn install:install-file -Dfile=gracelets-api-2.0.0.jar -DgroupId=gracelets -DartifactId=gracelets-api -Dversion=2.0.0 -Dpackaging=jar -DgeneratePom=true\r\nmvn install:install-file -Dfile=gracelets-impl-2.0.0.RC2.jar -DgroupId=gracelets -DartifactId=gracelets-impl -Dversion=2.0.0.RC2 -Dpackaging=jar -DgeneratePom=true\r\nmvn install:install-file -Dfile=jboss_seam_2.0.0_all-1.0.11.jar -DgroupId=gracelets -DartifactId=jboss-seam-extension -Dversion=1.0.11 -Dpackaging=jar -DgeneratePom=true\r\n<\/pre>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n&lt;dependency&gt;\r\n        &lt;groupid&gt;gracelets&lt;\/groupid&gt;\r\n        &lt;artifactid&gt;jboss-seam-extension&lt;\/artifactid&gt;\r\n        &lt;version&gt;1.0.11&lt;\/version&gt;\r\n&lt;\/dependency&gt;\r\n&lt;dependency&gt;\r\n        &lt;groupid&gt;gracelets&lt;\/groupid&gt;\r\n        &lt;artifactid&gt;gracelets-api&lt;\/artifactid&gt;\r\n        &lt;version&gt;2.0.0&lt;\/version&gt;\r\n &lt;\/dependency&gt;\r\n &lt;dependency&gt;\r\n        &lt;groupid&gt;gracelets&lt;\/groupid&gt;\r\n        &lt;artifactid&gt;gracelets-impl&lt;\/artifactid&gt;\r\n        &lt;version&gt;2.0.0.RC2&lt;\/version&gt;\r\n &lt;\/dependency&gt;\r\n<\/pre>\n<p>The application was deployed as usual and fired up without a problem. For a test page I just created an index.groovy file in the root directory. According to the docs, a .groovy extension trumps .xhtml so that effectively replaced the front page of the app. Here&#8217;s the standard first page of a new web-app(straight from the Gracelets examples), with the xhtml builder.<\/p>\n<pre class=\"brush: groovy; title: ; notranslate\" title=\"\">\r\nxh.html { \r\n     head { title(&quot;Hello World Example&quot;) }\r\n\r\n     body {\r\n         print { &quot;Hello World @ &quot; + new Date() }\r\n     }\r\n}\r\n<\/pre>\n<p>Not bad, let&#8217;s compare to the standard Facelets version, using a file based on the standard seam-gen created index.xhtml file. I&#8217;ve bound the instantiation of the Date object to a backing bean, since you can&#8217;t make an inline call to do it a standard Facelets view. I seem to recall seeing that Seam kept a component available to provide the present Date\/Time, but I couldn&#8217;t find it offhand today.<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n&lt;!DOCTYPE html PUBLIC &quot;-\/\/W3C\/\/DTD XHTML 1.0 Transitional\/\/EN&quot;\r\n        &quot;http:\/\/www.w3.org\/TR\/xhtml1\/DTD\/xhtml1-transitional.dtd&quot;&gt;\r\n&lt;f:view contentType=&quot;text\/html&quot;\r\n        xmlns=&quot;http:\/\/www.w3.org\/1999\/xhtml&quot;\r\n        xmlns:ui=&quot;http:\/\/java.sun.com\/jsf\/facelets&quot;\r\n        xmlns:h=&quot;http:\/\/java.sun.com\/jsf\/html&quot;\r\n        xmlns:f=&quot;http:\/\/java.sun.com\/jsf\/core&quot;\r\n        xmlns:a=&quot;http:\/\/richfaces.org\/a4j&quot;\r\n        xmlns:s=&quot;http:\/\/jboss.com\/products\/seam\/taglib&quot;&gt;\r\n    &lt;html&gt;\r\n    &lt;head&gt;\r\n        &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text\/html; charset=UTF-8&quot;\/&gt;\r\n        &lt;title&gt;Hello World Example&lt;\/title&gt;\r\n        &lt;ui:insert name=&quot;head&quot;\/&gt;\r\n    &lt;\/head&gt;\r\n    &lt;body&gt;\r\n    Hello World @ #{backingBean.date}\r\n    &lt;\/body&gt;\r\n    &lt;\/html&gt;\r\n&lt;\/f:view&gt;\r\n<\/pre>\n<p>Notice I&#8217;ve also left the Seam and <a class=\"zem_slink\" href=\"http:\/\/www.jboss.org\/jbossrichfaces\/\" title=\"Richfaces\" rel=\"homepage\">RichFaces<\/a> tab library namespaces in the xml declaration. Although the Gracelets docs didn&#8217;t seem to easily confirm this, inclusion of the JBoss Seam extension also makes those libraries and their associated builders available by default for Gracelets views. Here&#8217;s a final example to leave you with that incorporates a couple of elements from those libraries and a quick and dirty use of .each for rendering, and even a couple of screenshots to show off the progression.<\/p>\n<pre class=\"brush: groovy; title: ; notranslate\" title=\"\">\r\ndef loremIpsum = '''\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Proin tempor, mauris sed volutpat consequat, risus tellus ultrices\r\ntortor, at sollicitudin felis erat vitae augue. Pellentesque habitant morbi tristique senectus et netus et malesuada fames\r\nac turpis egestas. Vestibulum tincidunt egestas viverra. Integer ullamcorper, ipsum id malesuada sollicitudin, nisl velit\r\nultricies purus, eu aliquet diam mi sit amet eros. Quisque arcu orci, consequat dictum vehicula a, pellentesque eu nisl.\r\n'''\r\nxh.html {\r\n     head { title(&quot;Hello World Example&quot;) }\r\n     body {\r\n         s.div(id:'aSeamDiv', rendered:'true') {\r\n            r.panel(header:'A RichFaces Panel') {\r\n                println { &quot;Hello World @ &quot; + new Date() }\r\n                a('MyBlogLink', href: 'https:\/\/www.kellyrob99.com\/blog')\r\n            }\r\n         }\r\n         r.separator()\r\n         r.spacer()\r\n         r.simpleTogglePanel(header:'A RichFaces TogglePanel'){\r\n            println loremIpsum\r\n         }\r\n\r\n         def tableModel = loremIpsum.tokenize()&#x5B;0..10]\r\n         def tableModel2 = loremIpsum.tokenize()&#x5B;11..20]\r\n         table {\r\n            tr {\r\n                td {\r\n                    tableModel.each { println it }\r\n                }\r\n                td {\r\n                    tableModel2.each { println it }\r\n                }\r\n            }\r\n         }\r\n     }\r\n}\r\n<\/pre>\n<p>Not bad at all. I won&#8217;t bore you with the equivalent xml version &#8211; suffice it to say it takes up a lot more space.  I haven&#8217;t even touched on the easy component\/library features Gracelets provides yet, but I am already quite impressed simply by the replacement of xml with an equivalent but sparser syntax. And I don&#8217;t miss the need for closing tags much either. The documentation for the project is quite complete, rich with examples, at least for the standard jsf components(hint hint &#8211; more examples using Seam and RichFaces would be appreciated!)  Give it a try and decide for yourself, but if it keeps going this way, it might become a reasonable alternative for Grails.<\/p>\n<p>\ud83d\ude42<\/p>\nngg_shortcode_0_placeholder\n<div class=\"zemanta-pixie\"><a class=\"zemanta-pixie-a\" href=\"http:\/\/reblog.zemanta.com\/zemified\/4fdd0aeb-98bb-4937-b9ad-e5a5d2f4eb93\/\" title=\"Reblog this post [with Zemanta]\"><img data-recalc-dims=\"1\" decoding=\"async\" class=\"zemanta-pixie-img\" src=\"https:\/\/i0.wp.com\/img.zemanta.com\/reblog_c.png\" alt=\"Reblog this post [with Zemanta]\" \/><\/a><span class=\"zem-script more-related pretty-attribution\"><script type=\"text\/javascript\" src=\"http:\/\/static.zemanta.com\/readside\/loader.js\" defer=\"defer\"><\/script><\/span><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Over the last year I&#8217;ve done a lot of work with JBoss Seam, and while it&#8217;s not Grails it&#8217;s also not that bad for a web framework. Facelets is the view technology of choice, and it&#8217;s certainly better than many alternatives, but at the heart it is still xml and all those brackets make me [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"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},"jetpack_post_was_ever_published":false},"categories":[6],"tags":[76,75,257,258,73,77,42,35,74],"class_list":["post-380","post","type-post","status-publish","format-standard","hentry","category-dev","tag-facelets","tag-gracelets","tag-groovy","tag-java","tag-jboss-seam","tag-jsf","tag-maven","tag-programming","tag-xml"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.8 - aioseo.com -->\n\t<meta name=\"description\" content=\"A test drive of Gracelets, a Groovy DSL for JSF and Facelets.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"TheKaptain\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/www.kellyrob99.com\/blog\/2009\/05\/10\/gracelets-and-seam-a-dsl-for-facelets-with-easy-integration\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.8\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"The Kaptain on ... stuff | Tales of development, life and the folly that goes along with both\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Gracelets and Seam - a DSL for Facelets with easy integration | The Kaptain on ... stuff\" \/>\n\t\t<meta property=\"og:description\" content=\"A test drive of Gracelets, a Groovy DSL for JSF and Facelets.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/www.kellyrob99.com\/blog\/2009\/05\/10\/gracelets-and-seam-a-dsl-for-facelets-with-easy-integration\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2009-05-11T04:16:38+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2009-05-11T05:54:38+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Gracelets and Seam - a DSL for Facelets with easy integration | The Kaptain on ... stuff\" \/>\n\t\t<meta name=\"twitter:description\" content=\"A test drive of Gracelets, a Groovy DSL for JSF and Facelets.\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/2009\\\/05\\\/10\\\/gracelets-and-seam-a-dsl-for-facelets-with-easy-integration\\\/#article\",\"name\":\"Gracelets and Seam - a DSL for Facelets with easy integration | The Kaptain on ... stuff\",\"headline\":\"Gracelets and Seam &#8211; a DSL for Facelets and Groovy with easy integration\",\"author\":{\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/author\\\/admin\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/#organization\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"http:\\\/\\\/img.zemanta.com\\\/reblog_c.png?x-id=4fdd0aeb-98bb-4937-b9ad-e5a5d2f4eb93\",\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/2009\\\/05\\\/10\\\/gracelets-and-seam-a-dsl-for-facelets-with-easy-integration\\\/#articleImage\"},\"datePublished\":\"2009-05-10T19:16:38-09:00\",\"dateModified\":\"2009-05-10T20:54:38-09:00\",\"inLanguage\":\"en-US\",\"commentCount\":4,\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/2009\\\/05\\\/10\\\/gracelets-and-seam-a-dsl-for-facelets-with-easy-integration\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/2009\\\/05\\\/10\\\/gracelets-and-seam-a-dsl-for-facelets-with-easy-integration\\\/#webpage\"},\"articleSection\":\"Development, Facelets, Gracelets, Groovy, Java, JBoss Seam, JSF, maven, Programming, XML\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/2009\\\/05\\\/10\\\/gracelets-and-seam-a-dsl-for-facelets-with-easy-integration\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/category\\\/dev\\\/#listItem\",\"name\":\"Development\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/category\\\/dev\\\/#listItem\",\"position\":2,\"name\":\"Development\",\"item\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/category\\\/dev\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/2009\\\/05\\\/10\\\/gracelets-and-seam-a-dsl-for-facelets-with-easy-integration\\\/#listItem\",\"name\":\"Gracelets and Seam &#8211; a DSL for Facelets and Groovy with easy integration\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/2009\\\/05\\\/10\\\/gracelets-and-seam-a-dsl-for-facelets-with-easy-integration\\\/#listItem\",\"position\":3,\"name\":\"Gracelets and Seam &#8211; a DSL for Facelets and Groovy with easy integration\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/category\\\/dev\\\/#listItem\",\"name\":\"Development\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/#organization\",\"name\":\"The Kaptain on ... stuff\",\"description\":\"Tales of development, life and the folly that goes along with both\",\"url\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/author\\\/admin\\\/#author\",\"url\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/author\\\/admin\\\/\",\"name\":\"TheKaptain\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/2009\\\/05\\\/10\\\/gracelets-and-seam-a-dsl-for-facelets-with-easy-integration\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e41f09f3548f065fe6967ac904d3ea2a638614c16d879cac47cfad64e5b1426a?s=96&d=monsterid&r=g\",\"width\":96,\"height\":96,\"caption\":\"TheKaptain\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/2009\\\/05\\\/10\\\/gracelets-and-seam-a-dsl-for-facelets-with-easy-integration\\\/#webpage\",\"url\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/2009\\\/05\\\/10\\\/gracelets-and-seam-a-dsl-for-facelets-with-easy-integration\\\/\",\"name\":\"Gracelets and Seam - a DSL for Facelets with easy integration | The Kaptain on ... stuff\",\"description\":\"A test drive of Gracelets, a Groovy DSL for JSF and Facelets.\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/2009\\\/05\\\/10\\\/gracelets-and-seam-a-dsl-for-facelets-with-easy-integration\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/author\\\/admin\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/author\\\/admin\\\/#author\"},\"datePublished\":\"2009-05-10T19:16:38-09:00\",\"dateModified\":\"2009-05-10T20:54:38-09:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/\",\"name\":\"The Kaptain on ... stuff\",\"description\":\"Tales of development, life and the folly that goes along with both\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Gracelets and Seam - a DSL for Facelets with easy integration | The Kaptain on ... stuff","description":"A test drive of Gracelets, a Groovy DSL for JSF and Facelets.","canonical_url":"https:\/\/www.kellyrob99.com\/blog\/2009\/05\/10\/gracelets-and-seam-a-dsl-for-facelets-with-easy-integration\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.kellyrob99.com\/blog\/2009\/05\/10\/gracelets-and-seam-a-dsl-for-facelets-with-easy-integration\/#article","name":"Gracelets and Seam - a DSL for Facelets with easy integration | The Kaptain on ... stuff","headline":"Gracelets and Seam &#8211; a DSL for Facelets and Groovy with easy integration","author":{"@id":"https:\/\/www.kellyrob99.com\/blog\/author\/admin\/#author"},"publisher":{"@id":"https:\/\/www.kellyrob99.com\/blog\/#organization"},"image":{"@type":"ImageObject","url":"http:\/\/img.zemanta.com\/reblog_c.png?x-id=4fdd0aeb-98bb-4937-b9ad-e5a5d2f4eb93","@id":"https:\/\/www.kellyrob99.com\/blog\/2009\/05\/10\/gracelets-and-seam-a-dsl-for-facelets-with-easy-integration\/#articleImage"},"datePublished":"2009-05-10T19:16:38-09:00","dateModified":"2009-05-10T20:54:38-09:00","inLanguage":"en-US","commentCount":4,"mainEntityOfPage":{"@id":"https:\/\/www.kellyrob99.com\/blog\/2009\/05\/10\/gracelets-and-seam-a-dsl-for-facelets-with-easy-integration\/#webpage"},"isPartOf":{"@id":"https:\/\/www.kellyrob99.com\/blog\/2009\/05\/10\/gracelets-and-seam-a-dsl-for-facelets-with-easy-integration\/#webpage"},"articleSection":"Development, Facelets, Gracelets, Groovy, Java, JBoss Seam, JSF, maven, Programming, XML"},{"@type":"BreadcrumbList","@id":"https:\/\/www.kellyrob99.com\/blog\/2009\/05\/10\/gracelets-and-seam-a-dsl-for-facelets-with-easy-integration\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/www.kellyrob99.com\/blog#listItem","position":1,"name":"Home","item":"https:\/\/www.kellyrob99.com\/blog","nextItem":{"@type":"ListItem","@id":"https:\/\/www.kellyrob99.com\/blog\/category\/dev\/#listItem","name":"Development"}},{"@type":"ListItem","@id":"https:\/\/www.kellyrob99.com\/blog\/category\/dev\/#listItem","position":2,"name":"Development","item":"https:\/\/www.kellyrob99.com\/blog\/category\/dev\/","nextItem":{"@type":"ListItem","@id":"https:\/\/www.kellyrob99.com\/blog\/2009\/05\/10\/gracelets-and-seam-a-dsl-for-facelets-with-easy-integration\/#listItem","name":"Gracelets and Seam &#8211; a DSL for Facelets and Groovy with easy integration"},"previousItem":{"@type":"ListItem","@id":"https:\/\/www.kellyrob99.com\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/www.kellyrob99.com\/blog\/2009\/05\/10\/gracelets-and-seam-a-dsl-for-facelets-with-easy-integration\/#listItem","position":3,"name":"Gracelets and Seam &#8211; a DSL for Facelets and Groovy with easy integration","previousItem":{"@type":"ListItem","@id":"https:\/\/www.kellyrob99.com\/blog\/category\/dev\/#listItem","name":"Development"}}]},{"@type":"Organization","@id":"https:\/\/www.kellyrob99.com\/blog\/#organization","name":"The Kaptain on ... stuff","description":"Tales of development, life and the folly that goes along with both","url":"https:\/\/www.kellyrob99.com\/blog\/"},{"@type":"Person","@id":"https:\/\/www.kellyrob99.com\/blog\/author\/admin\/#author","url":"https:\/\/www.kellyrob99.com\/blog\/author\/admin\/","name":"TheKaptain","image":{"@type":"ImageObject","@id":"https:\/\/www.kellyrob99.com\/blog\/2009\/05\/10\/gracelets-and-seam-a-dsl-for-facelets-with-easy-integration\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/e41f09f3548f065fe6967ac904d3ea2a638614c16d879cac47cfad64e5b1426a?s=96&d=monsterid&r=g","width":96,"height":96,"caption":"TheKaptain"}},{"@type":"WebPage","@id":"https:\/\/www.kellyrob99.com\/blog\/2009\/05\/10\/gracelets-and-seam-a-dsl-for-facelets-with-easy-integration\/#webpage","url":"https:\/\/www.kellyrob99.com\/blog\/2009\/05\/10\/gracelets-and-seam-a-dsl-for-facelets-with-easy-integration\/","name":"Gracelets and Seam - a DSL for Facelets with easy integration | The Kaptain on ... stuff","description":"A test drive of Gracelets, a Groovy DSL for JSF and Facelets.","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/www.kellyrob99.com\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/www.kellyrob99.com\/blog\/2009\/05\/10\/gracelets-and-seam-a-dsl-for-facelets-with-easy-integration\/#breadcrumblist"},"author":{"@id":"https:\/\/www.kellyrob99.com\/blog\/author\/admin\/#author"},"creator":{"@id":"https:\/\/www.kellyrob99.com\/blog\/author\/admin\/#author"},"datePublished":"2009-05-10T19:16:38-09:00","dateModified":"2009-05-10T20:54:38-09:00"},{"@type":"WebSite","@id":"https:\/\/www.kellyrob99.com\/blog\/#website","url":"https:\/\/www.kellyrob99.com\/blog\/","name":"The Kaptain on ... stuff","description":"Tales of development, life and the folly that goes along with both","inLanguage":"en-US","publisher":{"@id":"https:\/\/www.kellyrob99.com\/blog\/#organization"}}]},"og:locale":"en_US","og:site_name":"The Kaptain on ... stuff | Tales of development, life and the folly that goes along with both","og:type":"article","og:title":"Gracelets and Seam - a DSL for Facelets with easy integration | The Kaptain on ... stuff","og:description":"A test drive of Gracelets, a Groovy DSL for JSF and Facelets.","og:url":"https:\/\/www.kellyrob99.com\/blog\/2009\/05\/10\/gracelets-and-seam-a-dsl-for-facelets-with-easy-integration\/","article:published_time":"2009-05-11T04:16:38+00:00","article:modified_time":"2009-05-11T05:54:38+00:00","twitter:card":"summary","twitter:title":"Gracelets and Seam - a DSL for Facelets with easy integration | The Kaptain on ... stuff","twitter:description":"A test drive of Gracelets, a Groovy DSL for JSF and Facelets."},"aioseo_meta_data":{"post_id":"380","title":"Gracelets and Seam - a DSL for Facelets with easy integration | #site_title","description":"A test drive of Gracelets, a Groovy DSL for JSF and Facelets.","keywords":[{"label":"Groovy","value":"Groovy"},{"label":"Grails","value":"Grails"},{"label":"maven","value":"maven"},{"label":"Gracelets","value":"Gracelets"},{"label":"JSF","value":"JSF"},{"label":"Facelets","value":"Facelets"}],"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"location":null,"local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":null,"created":"2021-02-09 05:15:56","updated":"2025-11-29 20:23:49","seo_analyzer_scan_date":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.kellyrob99.com\/blog\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.kellyrob99.com\/blog\/category\/dev\/\" title=\"Development\">Development<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tGracelets and Seam \u2013 a DSL for Facelets and Groovy with easy integration\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/www.kellyrob99.com\/blog"},{"label":"Development","link":"https:\/\/www.kellyrob99.com\/blog\/category\/dev\/"},{"label":"Gracelets and Seam &#8211; a DSL for Facelets and Groovy with easy integration","link":"https:\/\/www.kellyrob99.com\/blog\/2009\/05\/10\/gracelets-and-seam-a-dsl-for-facelets-with-easy-integration\/"}],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/prjtg-68","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.kellyrob99.com\/blog\/wp-json\/wp\/v2\/posts\/380","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kellyrob99.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.kellyrob99.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.kellyrob99.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kellyrob99.com\/blog\/wp-json\/wp\/v2\/comments?post=380"}],"version-history":[{"count":36,"href":"https:\/\/www.kellyrob99.com\/blog\/wp-json\/wp\/v2\/posts\/380\/revisions"}],"predecessor-version":[{"id":410,"href":"https:\/\/www.kellyrob99.com\/blog\/wp-json\/wp\/v2\/posts\/380\/revisions\/410"}],"wp:attachment":[{"href":"https:\/\/www.kellyrob99.com\/blog\/wp-json\/wp\/v2\/media?parent=380"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kellyrob99.com\/blog\/wp-json\/wp\/v2\/categories?post=380"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kellyrob99.com\/blog\/wp-json\/wp\/v2\/tags?post=380"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}