{"id":17757,"date":"2017-07-20T16:15:20","date_gmt":"2017-07-20T13:15:20","guid":{"rendered":"http:\/\/www.webcodegeeks.com\/?p=17757"},"modified":"2018-01-08T13:07:21","modified_gmt":"2018-01-08T11:07:21","slug":"bootstrap-grails-tutorial","status":"publish","type":"post","link":"https:\/\/www.webcodegeeks.com\/css\/bootstrap\/bootstrap-grails-tutorial\/","title":{"rendered":"Bootstrap Grails Tutorial"},"content":{"rendered":"<p>In this article we will explore the integration of Bootstrap with the Grails web framework. After a discussion on Grails framework we look at using Bootstrap framework with a grails application. For versions lower than 2.4.4 of Grails framework we need to enable a plugin to integrate the two but with version 2.4.4 and above, much less effort is required. We will look at all scenarios with different versions in this tutorial.<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n[ulp id=&#8217;57DHuNTHJ2qczaGz&#8217;]<br \/>\n&nbsp;<\/p>\n<div class=\"toc\">\n<h3>Table of Contents<\/h3>\n<dl>\n<dt><a href=\"#grails\">1. Grails<\/a><\/dt>\n<dt><a href=\"#tools\">2. Tools<\/a><\/dt>\n<dt><a href=\"#getStarted\">3. Get Started<\/a><\/dt>\n<dd>\n<dl>\n<dt><a href=\"#grails329\">3.1 Grails v3.2.9 Application<\/a><\/dt>\n<dt><a href=\"#grails244\">3.2 Grails v2.4.4 Application<\/a><\/dt>\n<dt><a href=\"#grails239\">3.3 Grails v2.3.9 Application<\/a><\/dt>\n<\/dl>\n<\/dd>\n<dt><a href=\"#wrapup\">4. That&#8217;s a Wrap<\/a><\/dt>\n<dt><a href=\"#run\">5. Running the Sample<\/a><\/dt>\n<dt><a href=\"#download\">6. Download the Source Code<\/a><\/dt>\n<\/dl>\n<\/div>\n<h2><a name=\"grails\"><\/a>1. Grails<\/h2>\n<p>Grails is a groovy based web framework which promotes Convention over configuration paradigm. &#8220;Convention over Configuration&#8221; essentially means that the framework makes many of the decisions for us by using sensible defaults. Only when we need to deviate or implement customized functionality we need to make effort for those changes. For the most part the defaults make sense and we can go along with them thus reducing our workload and increasing productivity manifolds.<\/p>\n<p>Grails is built on top of existing technologies like Hibernate and Spring MVC using existing codebases to enable quick development and increased developer productivity.<\/p>\n<h2><a name=\"tools\"><\/a>2. Tools<\/h2>\n<p>We will use the following toolset for this tutorial:<\/p>\n<ul>\n<li>Grails Framework v3.2.9<\/li>\n<li>Grails Framework v2.4.4<\/li>\n<li>Grails Framework v2.3.9<\/li>\n<li>Bootstrap<\/li>\n<li>Notepad++<\/li>\n<li>JDK v1.8.0_u31<\/li>\n<\/ul>\n<h2><a name=\"getStarted\"><\/a>3. Get Started<\/h2>\n<p>Firstly we will create an application using Grails v3.2.9 and take a look at the way Bootstrap is used with it. Next we will generate a sample application using Grails v2.3.9 &amp; v2.4.4. We will use the UI generated with latest version which uses bootstrap and make it work with these versions of grails.<br \/>\nNow that we have our work cut out let&#8217;s get started.<\/p>\n<h3><a name=\"grails329\"><\/a>3.1 Grails v3.2.9 Application<\/h3>\n<p>This is the latest version of Grails Framework at the time of this article. To create a grails application, we open a command prompt at the root of the folder where we want to place the project. Type in the following command to have an application scaffolded for us.<\/p>\n<pre class=\"brush: bash\">grails create-app WCGBootstrapGrails329<\/pre>\n<p>Once this command is executed we have a starter application ready and placed in the folder WCGBootstrapGrails329. To run this application we type in the following command after switching to this folder.<\/p>\n<pre class=\"brush: bash\">grails run-app<\/pre>\n<p>It might take a while but eventually a message should show to the effect that the application is running at <code>http:\/\/localhost:8080<\/code>. Once we navigate to this address in a browser we should see the following on our screens.<\/p>\n<figure id=\"attachment_17948\" aria-describedby=\"caption-attachment-17948\" style=\"width: 728px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/LandingPage329.jpg\"><img decoding=\"async\" class=\"size-full wp-image-17948\" src=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/LandingPage329.jpg\" alt=\"\" width=\"728\" height=\"642\" srcset=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/LandingPage329.jpg 728w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/LandingPage329-300x265.jpg 300w\" sizes=\"(max-width: 728px) 100vw, 728px\" \/><\/a><figcaption id=\"caption-attachment-17948\" class=\"wp-caption-text\">Landing Page v3.2.9<\/figcaption><\/figure>\n<p>The Html rendered above is built from two files, namely <code>main.gsp<\/code> and <code>index.gsp<\/code>. Their content is below:<\/p>\n<p><span style=\"text-decoration: underline;\"><em>main.gsp<\/em><\/span><\/p>\n<pre class=\"brush: html\">&lt;!doctype html&gt;\r\n&lt;html lang=\"en\" class=\"no-js\"&gt;\r\n&lt;head&gt;\r\n    &lt;meta http-equiv=\"Content-Type\" content=\"text\/html; charset=UTF-8\"\/&gt;\r\n    &lt;meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"\/&gt;\r\n    &lt;title&gt;\r\n        &lt;g:layoutTitle default=\"Grails\"\/&gt;\r\n    &lt;\/title&gt;\r\n    &lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"\/&gt;\r\n\r\n    &lt;asset:stylesheet src=\"application.css\"\/&gt;\r\n\r\n    &lt;g:layoutHead\/&gt;\r\n&lt;\/head&gt;\r\n&lt;body&gt;\r\n\r\n    &lt;div class=\"navbar navbar-default navbar-static-top\" role=\"navigation\"&gt;\r\n        &lt;div class=\"container\"&gt;\r\n            &lt;div class=\"navbar-header\"&gt;\r\n                &lt;button type=\"button\" class=\"navbar-toggle\" data-toggle=\"collapse\"\r\ndata-target=\".navbar-collapse\"&gt;\r\n                    &lt;span class=\"sr-only\"&gt;Toggle navigation&lt;\/span&gt;\r\n                    &lt;span class=\"icon-bar\"&gt;&lt;\/span&gt;\r\n                    &lt;span class=\"icon-bar\"&gt;&lt;\/span&gt;\r\n                    &lt;span class=\"icon-bar\"&gt;&lt;\/span&gt;\r\n                &lt;\/button&gt;\r\n                &lt;a class=\"navbar-brand\" href=\"\/#\"&gt;\r\n                    &lt;i class=\"fa grails-icon\"&gt;\r\n                        &lt;asset:image src=\"grails-cupsonly-logo-white.svg\"\/&gt;\r\n                    &lt;\/i&gt; Grails\r\n                &lt;\/a&gt;\r\n            &lt;\/div&gt;\r\n            &lt;div class=\"navbar-collapse collapse\" aria-expanded=\"false\" style=\"height: 0.8px;\"&gt;\r\n                &lt;ul class=\"nav navbar-nav navbar-right\"&gt;\r\n                    &lt;g:pageProperty name=\"page.nav\" \/&gt;\r\n                &lt;\/ul&gt;\r\n            &lt;\/div&gt;\r\n        &lt;\/div&gt;\r\n    &lt;\/div&gt;\r\n\r\n    &lt;g:layoutBody\/&gt;\r\n\r\n    &lt;div class=\"footer\" role=\"contentinfo\"&gt;&lt;\/div&gt;\r\n\r\n    &lt;div id=\"spinner\" class=\"spinner\" style=\"display:none;\"&gt;\r\n        &lt;g:message code=\"spinner.alt\" default=\"Loading&amp;hellip;\"\/&gt;\r\n    &lt;\/div&gt;\r\n\r\n    &lt;asset:javascript src=\"application.js\"\/&gt;\r\n\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;\r\n<\/pre>\n<p><span style=\"text-decoration: underline;\"><em>index.gsp<\/em><\/span><\/p>\n<pre class=\"brush: html\">&lt;!doctype html&gt;\r\n&lt;html&gt;\r\n&lt;head&gt;\r\n    &lt;meta name=\"layout\" content=\"main\"\/&gt;\r\n    &lt;title&gt;Welcome to Grails&lt;\/title&gt;\r\n\r\n    &lt;asset:link rel=\"icon\" href=\"favicon.ico\" type=\"image\/x-ico\" \/&gt;\r\n&lt;\/head&gt;\r\n&lt;body&gt;\r\n    &lt;content tag=\"nav\"&gt;\r\n        &lt;li class=\"dropdown\"&gt;\r\n            &lt;a href=\"#\" class=\"dropdown-toggle\" data-toggle=\"dropdown\" role=\"button\" aria-haspopup=\"true\" \r\naria-expanded=\"false\"&gt;Application Status &lt;span class=\"caret\"&gt;&lt;\/span&gt;&lt;\/a&gt;\r\n            &lt;ul class=\"dropdown-menu\"&gt;\r\n                &lt;li&gt;&lt;a href=\"#\"&gt;Environment: \r\n${grails.util.Environment.current.name}&lt;\/a&gt;&lt;\/li&gt;\r\n                &lt;li&gt;&lt;a href=\"#\"&gt;App profile: ${grailsApplication.config.grails?.profile}&lt;\/a&gt;&lt;\/li&gt;\r\n                &lt;li&gt;&lt;a href=\"#\"&gt;App version:\r\n&lt;g:meta name=\"info.app.version\"\/&gt;&lt;\/a&gt;&lt;\/li&gt;\r\n                &lt;li role=\"separator\" class=\"divider\"&gt;&lt;\/li&gt;\r\n                &lt;li&gt;&lt;a href=\"#\"&gt;Grails version:\r\n&lt;g:meta name=\"info.app.grailsVersion\"\/&gt;&lt;\/a&gt;&lt;\/li&gt;\r\n                &lt;li&gt;&lt;a href=\"#\"&gt;Groovy version: ${GroovySystem.getVersion()}&lt;\/a&gt;&lt;\/li&gt;\r\n&lt;li&gt;&lt;a href=\"#\"&gt;JVM version: ${System.getProperty('java.version')}&lt;\/a&gt;&lt;\/li&gt;\r\n                &lt;li role=\"separator\" class=\"divider\"&gt;&lt;\/li&gt;\r\n                &lt;li&gt;&lt;a href=\"#\"&gt;Reloading active: ${grails.util.Environment.reloadingAgentEnabled}&lt;\/a&gt;&lt;\/li&gt;\r\n            &lt;\/ul&gt;\r\n        &lt;\/li&gt;\r\n        &lt;li class=\"dropdown\"&gt;\r\n            &lt;a href=\"#\" class=\"dropdown-toggle\" data-toggle=\"dropdown\" role=\"button\" aria-haspopup=\"true\" \r\naria-expanded=\"false\"&gt;Artefacts &lt;span class=\"caret\"&gt;&lt;\/span&gt;&lt;\/a&gt;\r\n            &lt;ul class=\"dropdown-menu\"&gt;\r\n                &lt;li&gt;&lt;a href=\"#\"&gt;Controllers: ${grailsApplication.controllerClasses.size()}&lt;\/a&gt;&lt;\/li&gt;\r\n                &lt;li&gt;&lt;a href=\"#\"&gt;Domains: ${grailsApplication.domainClasses.size()}&lt;\/a&gt;&lt;\/li&gt;\r\n                &lt;li&gt;&lt;a href=\"#\"&gt;Services: ${grailsApplication.serviceClasses.size()}&lt;\/a&gt;&lt;\/li&gt;\r\n                &lt;li&gt;&lt;a href=\"#\"&gt;Tag Libraries: ${grailsApplication.tagLibClasses.size()}&lt;\/a&gt;&lt;\/li&gt;\r\n            &lt;\/ul&gt;\r\n        &lt;\/li&gt;\r\n        &lt;li class=\"dropdown\"&gt;\r\n            &lt;a href=\"#\" class=\"dropdown-toggle\" data-toggle=\"dropdown\" role=\"button\" aria-haspopup=\"true\" \r\naria-expanded=\"false\"&gt;Installed Plugins &lt;span class=\"caret\"&gt;&lt;\/span&gt;&lt;\/a&gt;\r\n            &lt;ul class=\"dropdown-menu\"&gt;\r\n                &lt;g:each var=\"plugin\" in=\"${applicationContext.getBean('pluginManager').allPlugins}\"&gt;\r\n                    &lt;li&gt;&lt;a href=\"#\"&gt;${plugin.name} - ${plugin.version}&lt;\/a&gt;&lt;\/li&gt;\r\n                &lt;\/g:each&gt;\r\n            &lt;\/ul&gt;\r\n        &lt;\/li&gt;\r\n    &lt;\/content&gt;\r\n\r\n    &lt;div class=\"svg\" role=\"presentation\"&gt;\r\n        &lt;div class=\"grails-logo-container\"&gt;\r\n            &lt;asset:image src=\"grails-cupsonly-logo-white.svg\" class=\"grails-logo\"\/&gt;\r\n        &lt;\/div&gt;\r\n    &lt;\/div&gt;\r\n\r\n    &lt;div id=\"content\" role=\"main\"&gt;\r\n        &lt;section class=\"row colset-2-its\"&gt;\r\n            &lt;h1&gt;Welcome to Grails&lt;\/h1&gt;\r\n\r\n            &lt;p&gt;\r\nCongratulations, you have successfully started your first Grails application! At the moment\r\nthis is the default page, feel free to modify it to either redirect to a controller or display\r\nwhatever content you may choose. Below is a list of controllers that are currently deployed in\r\nthis application, click on each to execute its default action:\r\n            &lt;\/p&gt;\r\n\r\n            &lt;div id=\"controllers\" role=\"navigation\"&gt;\r\n                &lt;h2&gt;Available Controllers:&lt;\/h2&gt;\r\n                &lt;ul&gt;\r\n                    &lt;g:each var=\"c\" in=\"${grailsApplication.controllerClasses.sort { it.fullName } }\"&gt;\r\n                        &lt;li class=\"controller\"&gt;\r\n                            &lt;g:link controller=\"${c.logicalPropertyName}\"&gt;${c.fullName}&lt;\/g:link&gt;\r\n                        &lt;\/li&gt;\r\n                    &lt;\/g:each&gt;\r\n                 &lt;\/ul&gt;\r\n            &lt;\/div&gt;\r\n        &lt;\/section&gt;\r\n    &lt;\/div&gt;\r\n\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;\r\n<\/pre>\n<p>As we can see from close inspection of css classes, this UI makes extensive use of the Bootstrap Framework. The same framework and its dependencies are included into the page as well. Now let us use this UI for the other Grails applications where the integration requires a bit of work on our part. Our aim is to make this same UI work flawlessly with those other versions of Grails Framework.<\/p>\n<h3><a name=\"grails244\"><\/a>3.2 Grails v2.4.4 Application<\/h3>\n<p>To create a Grails application with version 2.4.4 we need to follow the same course of action. We need to type the following command to generate our scaffolded application.<\/p>\n<pre class=\"brush: bash\">grails create-app WCGBootstrapGrails244<\/pre>\n<p>After the completion of this command our new application should be ready and seated in the folder &#8220;WCGBootstrapGrails244&#8221;. Let us navigate to this folder and execute the following command to check if things look right.<\/p>\n<pre class=\"brush: bash\">grails run-app<\/pre>\n<p>Once this is completed, we will see a message that our application is running at <code>http:\/\/localhost:8080\/WCGBootstrapGrails244<\/code>. When we navigate in a browser we will see the following screen.<\/p>\n<figure id=\"attachment_17969\" aria-describedby=\"caption-attachment-17969\" style=\"width: 780px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/LandingPage244-1.jpg\"><img decoding=\"async\" class=\"size-full wp-image-17969\" src=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/LandingPage244-1.jpg\" alt=\"\" width=\"780\" height=\"660\" srcset=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/LandingPage244-1.jpg 780w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/LandingPage244-1-300x254.jpg 300w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/LandingPage244-1-768x650.jpg 768w\" sizes=\"(max-width: 780px) 100vw, 780px\" \/><\/a><figcaption id=\"caption-attachment-17969\" class=\"wp-caption-text\">Landing Page v2.4.4<\/figcaption><\/figure>\n<h4>3.2.1 Html Markup Change<\/h4>\n<p>We will make changes in two files for Html Markup. First up, copy the contents of <code>main.gsp<\/code> in the project WCGBootstrapGrails329 to the <code>main.gsp<\/code> file of this project. Next we do the same for the <code>index.gsp<\/code> file.<\/p>\n<h4>3.2.2 Changes to JavaScript Assets<\/h4>\n<p>Now to make the pages work we need to make changes to the <code>assets<\/code> folder under <code>grails-app<\/code> folder. First we copy the <code>images<\/code> folder from the WCGBootstrapGrails329 project. Next we make changes to the JavaScript and StyleSheets.<\/p>\n<p>The <code>application.js<\/code> file&#8217;s content needs to change from<\/p>\n<p><span style=\"text-decoration: underline;\"><em>application.js<\/em><\/span><\/p>\n<pre class=\"brush: js\">\/\/ This is a manifest file that'll be compiled into application.js.\r\n\/\/\r\n\/\/ Any JavaScript file within this directory can be referenced here using a relative path.\r\n\/\/\r\n\/\/ You're free to add application-wide JavaScript to this file, but it's generally better \r\n\/\/ to create separate JavaScript files as needed.\r\n\/\/\r\n\/\/= require jquery\r\n\/\/= require_tree .\r\n\/\/= require_self\r\n\r\nif (typeof jQuery !== 'undefined') {\r\n\t(function($) {\r\n\t\t$('#spinner').ajaxStart(function() {\r\n\t\t\t$(this).fadeIn();\r\n\t\t}).ajaxStop(function() {\r\n\t\t\t$(this).fadeOut();\r\n\t\t});\r\n\t})(jQuery);\r\n}\r\n<\/pre>\n<p>to this<\/p>\n<p><span style=\"text-decoration: underline;\"><em>application.js<\/em><\/span><\/p>\n<pre class=\"brush: js\">\/\/ This is a manifest file that'll be compiled into application.js.\r\n\/\/\r\n\/\/ Any JavaScript file within this directory can be referenced here using a relative path.\r\n\/\/\r\n\/\/ You're free to add application-wide JavaScript to this file, but it's generally better\r\n\/\/ to create separate JavaScript files as needed.\r\n\/\/\r\n\/\/= require jquery-2.2.0.min\r\n\/\/= require bootstrap\r\n\/\/= require_tree .\r\n\/\/= require_self\r\n\r\nif (typeof jQuery !== 'undefined') {\r\n    (function($) {\r\n        $(document).ajaxStart(function() {\r\n            $('#spinner').fadeIn();\r\n        }).ajaxStop(function() {\r\n            $('#spinner').fadeOut();\r\n        });\r\n    })(jQuery);\r\n}\r\n<\/pre>\n<p>As you can see we have added to the requires at the top one for <code>bootstrap.js<\/code> and the other for <code>JQuery<\/code> version 2.2.0. We have also replaced the other require for JQuery already in the file. We do need to place these two files referenced in the requires in the same folder to finalize the changes.<\/p>\n<h4>3.2.3 Changes to StyleSheet Assets<\/h4>\n<p>Now it is the turn of the StyleSheet file for changes. We change the contents of <code>application.css<\/code> file from<\/p>\n<p><span style=\"text-decoration: underline;\"><em>application.css<\/em><\/span><\/p>\n<pre class=\"brush: css\">\/*\r\n* This is a manifest file that'll be compiled into application.css, which will include all the files\r\n* listed below.\r\n*\r\n* Any CSS file within this directory can be referenced here using a relative path.\r\n*\r\n* You're free to add application-wide styles to this file and they'll appear at the top of the\r\n* compiled file, but it's generally better to create a new file per style scope.\r\n*\r\n*= require main\r\n*= require mobile\r\n*= require_self\r\n*\/\r\n<\/pre>\n<p>to this<\/p>\n<p><span style=\"text-decoration: underline;\"><em>application.css<\/em><\/span><\/p>\n<pre class=\"brush: css\">\/*\r\n* This is a manifest file that'll be compiled into application.css, which will include all the files\r\n* listed below.\r\n*\r\n* Any CSS file within this directory can be referenced here using a relative path.\r\n*\r\n* You're free to add application-wide styles to this file and they'll appear at the top of the\r\n* compiled file, but it's generally better to create a new file per style scope.\r\n*\r\n*= require bootstrap\r\n*= require grails\r\n*= require main\r\n*= require mobile\r\n*= require_self\r\n*\/\r\n<\/pre>\n<p>As you can see we have required the <code>bootstrap<\/code> and <code>grails<\/code> css files in addition to the ones which were already their. Like with JavaScript files we need to place the additional files and replace the older ones with new copies from WCGBootstrapGrails329 project we created in the previous section.<\/p>\n<p>This wraps up the changes needed to use <code>Bootstrap<\/code> with version 2.4.4 of a grails web application. To verify our changes we will run the following command from the root of the project.<\/p>\n<pre class=\"brush: bash\">grails run-app<\/pre>\n<p>We will see a message to the effect that the application is running at <code>http:\/\/localhost:8080\/WCGBootstrapGrails244<\/code> URL. When we navigate to it using a browser we should see the below screen.<\/p>\n<figure id=\"attachment_17959\" aria-describedby=\"caption-attachment-17959\" style=\"width: 588px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/LandingPage244New-1.jpg\"><img decoding=\"async\" class=\"size-full wp-image-17959\" src=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/LandingPage244New-1.jpg\" alt=\"\" width=\"588\" height=\"554\" srcset=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/LandingPage244New-1.jpg 588w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/LandingPage244New-1-300x283.jpg 300w\" sizes=\"(max-width: 588px) 100vw, 588px\" \/><\/a><figcaption id=\"caption-attachment-17959\" class=\"wp-caption-text\">Landing Page v2.4.4<\/figcaption><\/figure>\n<h3><a name=\"grails239\"><\/a>3.3 Grails v2.3.9 Application<\/h3>\n<p>In this section we will attempt to use the Bootstrap Framework with Grails v2.3.9. First off, we need to create an application using Grails v2.3.9 by running the following command at the root of the project folder.<\/p>\n<pre class=\"brush: bash\">grails create-app WCGBootstrapGrails239<\/pre>\n<p>Once this command is completed we should have a folder named WCGBootstrapGrails239 with our newly created application.<br \/>\nNext, let us run the application to see how the landing page looks like using the command at the root of the application, i.e., WCGBootstrapGrails239.<\/p>\n<pre class=\"brush: bash\">grails run-app<\/pre>\n<p>Once this command is completed we should get a message to the effect that the application is running at <code>http:\/\/localhost:8080\/WCGBootstrapGrails239<\/code>. Navigating to the address in a browser we should see the below screen.<\/p>\n<figure id=\"attachment_17955\" aria-describedby=\"caption-attachment-17955\" style=\"width: 780px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/LandingPage239-1.jpg\"><img decoding=\"async\" class=\"size-full wp-image-17955\" src=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/LandingPage239-1.jpg\" alt=\"\" width=\"780\" height=\"660\" srcset=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/LandingPage239-1.jpg 780w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/LandingPage239-1-300x254.jpg 300w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/LandingPage239-1-768x650.jpg 768w\" sizes=\"(max-width: 780px) 100vw, 780px\" \/><\/a><figcaption id=\"caption-attachment-17955\" class=\"wp-caption-text\">Landing Page v2.3.9<\/figcaption><\/figure>\n<h4>3.3.1 Html Markup Change<\/h4>\n<p>Now let us replace the existing UI with the one from grails v3.2.9 project.<br \/>\nWe need to make the <code>main.gsp<\/code> and <code>index.gsp<\/code> file look exactly like their v3.2.9 counterparts.<\/p>\n<h4>3.3.2 Enable Asset Pipeline Plugin<\/h4>\n<p>We will enable the Asset pipeline which makes the static assets number one citizens like all the other artifacts. To do this we need to edit the <code>BuildConfig.groovy<\/code> file which is located in the <code>WCGBootstrapGrails239\\grail-app\\conf<\/code> folder.<br \/>\nWe need to uncomment the following line in the file <code>\/\/compile \":asset-pipeline:1.6.1\"<\/code>. Apart from this, copy over the <code>assets<\/code> folder from the 2.4.4 version project to this one.<\/p>\n<p>After making these changes, our application is setup to use the Bootstrap framework. So lets run it to see the output. Navigate to the root of the project in a console and run the following command:<\/p>\n<pre class=\"brush: bash\">grails run-app<\/pre>\n<p>A message should appear indicating that the application is running at <code>http:\/\/localhost:8080\/WCGBootstrapGrails239<\/code>. We should see the below screen upon navigating to the address in a browser.<\/p>\n<figure id=\"attachment_17961\" aria-describedby=\"caption-attachment-17961\" style=\"width: 588px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/LandingPage239_New-1.jpg\"><img decoding=\"async\" class=\"size-full wp-image-17961\" src=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/LandingPage239_New-1.jpg\" alt=\"\" width=\"588\" height=\"554\" srcset=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/LandingPage239_New-1.jpg 588w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/LandingPage239_New-1-300x283.jpg 300w\" sizes=\"(max-width: 588px) 100vw, 588px\" \/><\/a><figcaption id=\"caption-attachment-17961\" class=\"wp-caption-text\">Landing Page v2.3.9<\/figcaption><\/figure>\n<h2><a name=\"wrapup\"><\/a>4. That&#8217;s a Wrap<\/h2>\n<p>Now that we were able to do the same UI layout based on Bootstrap using 3 different versions of Grails, namely v2.3.9, v2.4.4 and v3.2.9 we can call it a day.<\/p>\n<h2><a name=\"run\"><\/a>5. Running the Sample<\/h2>\n<p>To run each of our applications on, in my case Windows 10, we need to change the <code>path<\/code> environment variable to reflect the bin directory of the desired Grails version. That is the only step required to switch. All the other commands remain the same. Lets list the ones we used most often:<\/p>\n<p><strong>Create a new Application<\/strong><\/p>\n<pre class=\"brush: bash\">grails create-app appname<\/pre>\n<p><strong>Run the Application<\/strong><\/p>\n<pre class=\"brush: bash\">grails run-app<\/pre>\n<h2><a name=\"download\"><\/a>6. Download the Source Code<\/h2>\n<div class=\"download\"><strong>Download<\/strong><br \/>\nYou can download the full source code of this example here : <a href=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2017\/07\/WCG-Bootstrap-Grails-Tutorial.zip\" target=\"_blank\" rel=\"noopener\"><strong>WCG &#8212; Bootstrap Grails Tutorial<\/strong><\/a><\/div>\n","protected":false},"excerpt":{"rendered":"<p>In this article we will explore the integration of Bootstrap with the Grails web framework. After a discussion on Grails framework we look at using Bootstrap framework with a grails application. For versions lower than 2.4.4 of Grails framework we need to enable a plugin to integrate the two but with version 2.4.4 and above, &hellip;<\/p>\n","protected":false},"author":213,"featured_media":8515,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[284],"tags":[376,240],"class_list":["post-17757","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-bootstrap","tag-bootstrap","tag-grails"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Bootstrap Grails Tutorial - Web Code Geeks - 2026<\/title>\n<meta name=\"description\" content=\"In this article we will explore the integration of Bootstrap with the Grails web framework. After a discussion on Grails framework we look at using\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.webcodegeeks.com\/css\/bootstrap\/bootstrap-grails-tutorial\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Bootstrap Grails Tutorial - Web Code Geeks - 2026\" \/>\n<meta property=\"og:description\" content=\"In this article we will explore the integration of Bootstrap with the Grails web framework. After a discussion on Grails framework we look at using\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.webcodegeeks.com\/css\/bootstrap\/bootstrap-grails-tutorial\/\" \/>\n<meta property=\"og:site_name\" content=\"Web Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/webcodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2017-07-20T13:15:20+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2018-01-08T11:07:21+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2015\/11\/bootstrap-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Siddharth Seth\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@webcodegeeks\" \/>\n<meta name=\"twitter:site\" content=\"@webcodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Siddharth Seth\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.webcodegeeks.com\/css\/bootstrap\/bootstrap-grails-tutorial\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/css\/bootstrap\/bootstrap-grails-tutorial\/\"},\"author\":{\"name\":\"Siddharth Seth\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/9c939eb4c915443c7e493c813d979592\"},\"headline\":\"Bootstrap Grails Tutorial\",\"datePublished\":\"2017-07-20T13:15:20+00:00\",\"dateModified\":\"2018-01-08T11:07:21+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/css\/bootstrap\/bootstrap-grails-tutorial\/\"},\"wordCount\":1317,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/css\/bootstrap\/bootstrap-grails-tutorial\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2015\/11\/bootstrap-logo.jpg\",\"keywords\":[\"bootstrap\",\"Grails\"],\"articleSection\":[\"Bootstrap\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.webcodegeeks.com\/css\/bootstrap\/bootstrap-grails-tutorial\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.webcodegeeks.com\/css\/bootstrap\/bootstrap-grails-tutorial\/\",\"url\":\"https:\/\/www.webcodegeeks.com\/css\/bootstrap\/bootstrap-grails-tutorial\/\",\"name\":\"Bootstrap Grails Tutorial - Web Code Geeks - 2026\",\"isPartOf\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/css\/bootstrap\/bootstrap-grails-tutorial\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/css\/bootstrap\/bootstrap-grails-tutorial\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2015\/11\/bootstrap-logo.jpg\",\"datePublished\":\"2017-07-20T13:15:20+00:00\",\"dateModified\":\"2018-01-08T11:07:21+00:00\",\"description\":\"In this article we will explore the integration of Bootstrap with the Grails web framework. After a discussion on Grails framework we look at using\",\"breadcrumb\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/css\/bootstrap\/bootstrap-grails-tutorial\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.webcodegeeks.com\/css\/bootstrap\/bootstrap-grails-tutorial\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/css\/bootstrap\/bootstrap-grails-tutorial\/#primaryimage\",\"url\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2015\/11\/bootstrap-logo.jpg\",\"contentUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2015\/11\/bootstrap-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.webcodegeeks.com\/css\/bootstrap\/bootstrap-grails-tutorial\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.webcodegeeks.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"CSS\",\"item\":\"https:\/\/www.webcodegeeks.com\/category\/css\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Bootstrap\",\"item\":\"https:\/\/www.webcodegeeks.com\/category\/css\/bootstrap\/\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Bootstrap Grails Tutorial\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#website\",\"url\":\"https:\/\/www.webcodegeeks.com\/\",\"name\":\"Web Code Geeks\",\"description\":\"Web Developers Resource Center\",\"publisher\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.webcodegeeks.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\/\/www.webcodegeeks.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"contentUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/webcodegeeks\",\"https:\/\/x.com\/webcodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/9c939eb4c915443c7e493c813d979592\",\"name\":\"Siddharth Seth\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/86a5133a5e9d79f7997e2649b1afe58e895c0d88df47b3359103ec4c1a2077d6?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/86a5133a5e9d79f7997e2649b1afe58e895c0d88df47b3359103ec4c1a2077d6?s=96&d=mm&r=g\",\"caption\":\"Siddharth Seth\"},\"description\":\"Siddharth is a Software Development Professional with a Master degree in Computer Applications from IGNOU. He has over 14 years of experience. And currently focused on Software Architecture, Cloud Computing, JavaScript Frameworks for Client and Server, Business Intelligence.\",\"sameAs\":[\"https:\/\/www.webcodegeeks.com\"],\"url\":\"https:\/\/www.webcodegeeks.com\/author\/siddharth-seth\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Bootstrap Grails Tutorial - Web Code Geeks - 2026","description":"In this article we will explore the integration of Bootstrap with the Grails web framework. After a discussion on Grails framework we look at using","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.webcodegeeks.com\/css\/bootstrap\/bootstrap-grails-tutorial\/","og_locale":"en_US","og_type":"article","og_title":"Bootstrap Grails Tutorial - Web Code Geeks - 2026","og_description":"In this article we will explore the integration of Bootstrap with the Grails web framework. After a discussion on Grails framework we look at using","og_url":"https:\/\/www.webcodegeeks.com\/css\/bootstrap\/bootstrap-grails-tutorial\/","og_site_name":"Web Code Geeks","article_publisher":"https:\/\/www.facebook.com\/webcodegeeks","article_published_time":"2017-07-20T13:15:20+00:00","article_modified_time":"2018-01-08T11:07:21+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2015\/11\/bootstrap-logo.jpg","type":"image\/jpeg"}],"author":"Siddharth Seth","twitter_card":"summary_large_image","twitter_creator":"@webcodegeeks","twitter_site":"@webcodegeeks","twitter_misc":{"Written by":"Siddharth Seth","Est. reading time":"13 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.webcodegeeks.com\/css\/bootstrap\/bootstrap-grails-tutorial\/#article","isPartOf":{"@id":"https:\/\/www.webcodegeeks.com\/css\/bootstrap\/bootstrap-grails-tutorial\/"},"author":{"name":"Siddharth Seth","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/9c939eb4c915443c7e493c813d979592"},"headline":"Bootstrap Grails Tutorial","datePublished":"2017-07-20T13:15:20+00:00","dateModified":"2018-01-08T11:07:21+00:00","mainEntityOfPage":{"@id":"https:\/\/www.webcodegeeks.com\/css\/bootstrap\/bootstrap-grails-tutorial\/"},"wordCount":1317,"commentCount":0,"publisher":{"@id":"https:\/\/www.webcodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.webcodegeeks.com\/css\/bootstrap\/bootstrap-grails-tutorial\/#primaryimage"},"thumbnailUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2015\/11\/bootstrap-logo.jpg","keywords":["bootstrap","Grails"],"articleSection":["Bootstrap"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.webcodegeeks.com\/css\/bootstrap\/bootstrap-grails-tutorial\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.webcodegeeks.com\/css\/bootstrap\/bootstrap-grails-tutorial\/","url":"https:\/\/www.webcodegeeks.com\/css\/bootstrap\/bootstrap-grails-tutorial\/","name":"Bootstrap Grails Tutorial - Web Code Geeks - 2026","isPartOf":{"@id":"https:\/\/www.webcodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.webcodegeeks.com\/css\/bootstrap\/bootstrap-grails-tutorial\/#primaryimage"},"image":{"@id":"https:\/\/www.webcodegeeks.com\/css\/bootstrap\/bootstrap-grails-tutorial\/#primaryimage"},"thumbnailUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2015\/11\/bootstrap-logo.jpg","datePublished":"2017-07-20T13:15:20+00:00","dateModified":"2018-01-08T11:07:21+00:00","description":"In this article we will explore the integration of Bootstrap with the Grails web framework. After a discussion on Grails framework we look at using","breadcrumb":{"@id":"https:\/\/www.webcodegeeks.com\/css\/bootstrap\/bootstrap-grails-tutorial\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.webcodegeeks.com\/css\/bootstrap\/bootstrap-grails-tutorial\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/css\/bootstrap\/bootstrap-grails-tutorial\/#primaryimage","url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2015\/11\/bootstrap-logo.jpg","contentUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2015\/11\/bootstrap-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.webcodegeeks.com\/css\/bootstrap\/bootstrap-grails-tutorial\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.webcodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"CSS","item":"https:\/\/www.webcodegeeks.com\/category\/css\/"},{"@type":"ListItem","position":3,"name":"Bootstrap","item":"https:\/\/www.webcodegeeks.com\/category\/css\/bootstrap\/"},{"@type":"ListItem","position":4,"name":"Bootstrap Grails Tutorial"}]},{"@type":"WebSite","@id":"https:\/\/www.webcodegeeks.com\/#website","url":"https:\/\/www.webcodegeeks.com\/","name":"Web Code Geeks","description":"Web Developers Resource Center","publisher":{"@id":"https:\/\/www.webcodegeeks.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.webcodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.webcodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.webcodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/webcodegeeks","https:\/\/x.com\/webcodegeeks"]},{"@type":"Person","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/9c939eb4c915443c7e493c813d979592","name":"Siddharth Seth","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/86a5133a5e9d79f7997e2649b1afe58e895c0d88df47b3359103ec4c1a2077d6?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/86a5133a5e9d79f7997e2649b1afe58e895c0d88df47b3359103ec4c1a2077d6?s=96&d=mm&r=g","caption":"Siddharth Seth"},"description":"Siddharth is a Software Development Professional with a Master degree in Computer Applications from IGNOU. He has over 14 years of experience. And currently focused on Software Architecture, Cloud Computing, JavaScript Frameworks for Client and Server, Business Intelligence.","sameAs":["https:\/\/www.webcodegeeks.com"],"url":"https:\/\/www.webcodegeeks.com\/author\/siddharth-seth\/"}]}},"_links":{"self":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts\/17757","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/users\/213"}],"replies":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/comments?post=17757"}],"version-history":[{"count":0,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts\/17757\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/media\/8515"}],"wp:attachment":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/media?parent=17757"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/categories?post=17757"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/tags?post=17757"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}