blob: 015b0fe9620f2666c47816305f28420c1eb65332 [file]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<!-- Matomo -->
<script>
var _paq = window._paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
_paq.push(["setDoNotTrack", true]);
_paq.push(["disableCookies"]);
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="https://analytics.apache.org/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '79']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
</script>
<!-- End Matomo Code -->
<title>3 Upgrading from Grails 2.x 3.0.2</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<link rel="stylesheet" href="../css/main.css" type="text/css" media="screen, print" title="Style" charset="utf-8"/>
<link rel="stylesheet" href="../css/pdf.css" type="text/css" media="print" title="PDF" charset="utf-8"/>
<script type="text/javascript">
function addJsClass() {
var classes = document.body.className.split(" ");
classes.push("js");
document.body.className = classes.join(" ");
}
</script>
</head>
<body class="body" onload="addJsClass();">
<div id="navigation">
<ul>
<li>
<div id="nav-summary" onmouseover="toggleNavSummary(false)" onmouseout="toggleNavSummary(true)">
<a href="../guide/index.html" class="button">Table of contents</a>
<div id="nav-summary-childs" style="display:none;">
<div class="toc-item" style="margin-left:0"><a href="../guide/introduction.html"><strong>1</strong><span>Introduction</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/gettingStarted.html"><strong>2</strong><span>Getting Started</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/upgrading.html"><strong>3</strong><span>Upgrading from Grails 2.x</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/conf.html"><strong>4</strong><span>Configuration</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/commandLine.html"><strong>5</strong><span>The Command Line</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/GORM.html"><strong>6</strong><span>Object Relational Mapping (GORM)</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/theWebLayer.html"><strong>7</strong><span>The Web Layer</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/traits.html"><strong>8</strong><span>Traits</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/webServices.html"><strong>9</strong><span>Web Services</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/async.html"><strong>10</strong><span>Asynchronous Programming</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/validation.html"><strong>11</strong><span>Validation</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/services.html"><strong>12</strong><span>The Service Layer</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/staticTypeCheckingAndCompilation.html"><strong>13</strong><span>Static Type Checking And Compilation</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/testing.html"><strong>14</strong><span>Testing</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/i18n.html"><strong>15</strong><span>Internationalization</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/security.html"><strong>16</strong><span>Security</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/plugins.html"><strong>17</strong><span>Plugins</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/spring.html"><strong>18</strong><span>Grails and Spring</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/hibernate.html"><strong>19</strong><span>Grails and Hibernate</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/scaffolding.html"><strong>20</strong><span>Scaffolding</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/deployment.html"><strong>21</strong><span>Deployment</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/contributing.html"><strong>22</strong><span>Contributing to Grails</span></a>
</div>
</div>
</div>
</li>
<li class="separator selected">
<a id="ref-button" onclick="localToggle(); return false;" href="#">Quick Reference</a>
</li>
</ul>
</div>
<div id="header">
<div class="images clearfix">
<span id="logo"><a href="http://grails.org" target="_blank"><img alt="Grails Logo" title="The Grails Framework" src="../img/grails.png" border="0"/></a></span>
</div>
<p>See the light - agile, industrial strength, rapid web application development made easy</p>
</div>
<table id="colset" border="0" cellpadding="0" cellspacing="0">
<tr>
<td id="col1">
<div id="main" class="corner-all">
<div class="toc-item prev-left"><a href="../guide/gettingStarted.html">&lt;&lt; <strong>2</strong><span>Getting Started</span></a></div>
<span id='toggle-col1' class="toggle">(<a href="#" onclick="localToggle(); return false;">Quick Reference</a>)</span>
<div class="toc-item next-right"><a href="../guide/conf.html"><strong>4</strong><span>Configuration</span> >></a></div>
<div class="project">
<h1>3 Upgrading from Grails 2.x - Reference Documentation</h1>
<p><strong>Authors:</strong> Graeme Rocher, Peter Ledbrook, Marc Palmer, Jeff Brown, Luke Daley, Burt Beckwith, Lari Hotari</p>
<p><strong>Version:</strong> 3.0.2</p>
</div>
<div id="table-of-content">
<h2>Table of Contents</h2>
<div class="toc-item" style="margin-left:0px"><a href="#upgradingPlugins"><strong>3.1</strong><span>Upgrading Plugins</span></a>
</div>
<div class="toc-item" style="margin-left:0px"><a href="#upgradingApps"><strong>3.2</strong><span>Upgrading Applications</span></a>
</div>
</div>
<h1 id="upgrading">3 Upgrading from Grails 2.x</h1>
Grails 3.0 is a complete ground up rewrite of Grails and introduces new concepts and components for many parts of the framework.<p class="paragraph"/>When upgrading an application or plugin from Grails 3.0 there are many areas to consider including:
<ul class="star">
<li>Removal of dynamic scaffolding from Grails 3.0.0 till 3.0.4 when it was re-introduced</li>
<li>Removal of before and after interceptors</li>
<li>Project structure differences</li>
<li>File location differences</li>
<li>Configuration differences</li>
<li>Package name differences</li>
<li>Legacy Gant Scripts</li>
<li>Gradle Build System</li>
<li>Changes to Plugins</li>
<li>Source vs Binary Plugins</li>
</ul><p class="paragraph"/>The best approach to take when upgrading a plugin or application (and if your application is using several plugins the plugins will need upgrading first) is to create a new Grails 3.0 application of the same name and copy the source files into the correct locations in the new application.<p class="paragraph"/><h3>Removal of before and after interceptors</h3><p class="paragraph"/>Before and after interceptors were removed. So all <code>beforeInterceptor</code> and <code>afterInterceptor</code> need to be replaced by Stand alone interceptors.<p class="paragraph"/><h4>File Location Differences</h4><p class="paragraph"/><h4>File Location Differences</h4><p class="paragraph"/>The location of certain files have changed or been replaced with other files in Grails 3.0. The following table lists old default locations and their respective new locations:<p class="paragraph"/><table class="wiki-table" cellpadding="0" cellspacing="0" border="0"><tr><th><strong class="bold">Old Location</strong></th><th><strong class="bold">New Location</strong></th><th><strong class="bold">Description</strong></th></tr><tr class="table-odd"><td><code>grails-app/conf/BuildConfig.groovy</code></td><td><code>build.gradle</code></td><td>Build time configuration is now defined in a Gradle build file</td></tr><tr class="table-even"><td><code>grails-app/conf/Config.groovy</code></td><td><code>grails-app/conf/application.groovy</code></td><td>Renamed for consistency with Spring Boot</td></tr><tr class="table-odd"><td><code>grails-app/conf/UrlMappings.groovy</code></td><td><code>grails-app/controllers/UrlMappings.groovy</code></td><td>Moved since grails-app/conf is not a source directory anymore</td></tr><tr class="table-even"><td><code>grails-app/conf/BootStrap.groovy</code></td><td><code>grails-app/init/BootStrap.groovy</code></td><td>Moved since grails-app/conf is not a source directory anymore</td></tr><tr class="table-odd"><td><code>scripts</code></td><td><code>src/main/scripts</code></td><td>Moved for consistency with Gradle</td></tr><tr class="table-even"><td><code>src/groovy</code></td><td><code>src/main/groovy</code></td><td>Moved for consistency with Gradle</td></tr><tr class="table-odd"><td><code>src/java</code></td><td><code>src/main/groovy</code></td><td>Moved for consistency with Gradle</td></tr><tr class="table-even"><td><code>test/unit</code></td><td><code>src/test/groovy</code></td><td>Moved for consistency with Gradle</td></tr><tr class="table-odd"><td><code>test/integration</code></td><td><code>src/integration-test/groovy</code></td><td>Moved for consistency with Gradle</td></tr><tr class="table-even"><td><code>web-app</code></td><td><code>src/main/webapp</code> or <code>src/main/resources/</code></td><td>Moved for consistency with Gradle</td></tr><tr class="table-odd"><td><code>&#42;GrailsPlugin.groovy</code></td><td><code>src/main/groovy</code></td><td>The plugin descriptor moved to a source directory</td></tr></table><p class="paragraph"/><code>src/main/resources/public</code> is recommended as <code>src/main/webapp</code> only gets included in WAR packaging but not in JAR packaging.<p class="paragraph"/>For plugins the plugin descriptor (a Groovy file ending with "GrailsPlugin") which was previously located in the root of the plugin directory should be moved to the <code>src/main/groovy</code> directory under an appropriate package.<p class="paragraph"/><h4>New Files Not Present in Grails 2.x</h4><p class="paragraph"/>The reason it is best to create a new application and copy your original sources to it is because there are a number of new files that are not present in Grails 2.x by default. These include:<p class="paragraph"/><table class="wiki-table" cellpadding="0" cellspacing="0" border="0"><tr><th><strong class="bold">File</strong></th><th><strong class="bold">Description</strong></th></tr><tr class="table-odd"><td><code>build.gradle</code></td><td>The Gradle build descriptor located in the root of the project</td></tr><tr class="table-even"><td><code>gradle.properties</code></td><td>Properties file defining the Grails and Gradle versions</td></tr><tr class="table-odd"><td><code>grails-app/conf/logback.groovy</code></td><td>Logging previously defined in <code>Config.groovy</code> is now defined using Logback</td></tr><tr class="table-even"><td><code>grails-app/conf/application.yml</code></td><td>Configuration can now also be defined using YAML</td></tr><tr class="table-odd"><td><code>grails-app/init/PACKAGE_PATH/Application.groovy</code></td><td>The <code>Application</code> class used By Spring Boot to start the application</td></tr></table><p class="paragraph"/><h4>Files Not Present in Grails 3.x</h4><p class="paragraph"/>Some files that were previously created by Grails 2.x are no longer created. These have either been removed or an appropriate replacement added. The following table lists files no longer in use:<p class="paragraph"/><table class="wiki-table" cellpadding="0" cellspacing="0" border="0"><tr><th><strong class="bold">File</strong></th><th><strong class="bold">Description</strong></th></tr><tr class="table-odd"><td><code>application.properties</code></td><td>The application name and version is now defined in <code>build.gradle</code></td></tr><tr class="table-even"><td><code>grails-app/conf/DataSource.groovy</code></td><td>Merged together into <code>application.yml</code></td></tr><tr class="table-odd"><td><code>lib</code></td><td>Dependency resolution should be used to resolve JAR files</td></tr><tr class="table-even"><td><code>web-app/WEB-INF/applicationContext.xml</code></td><td>Removed, beans can be defined in <code>grails-app/conf/spring/resources.groovy</code></td></tr><tr class="table-odd"><td><code>src/templates/war/web.xml</code></td><td>Grails 3.0 no longer requires web.xml. Customizations can be done via Spring</td></tr><tr class="table-even"><td><code>web-app/WEB-INF/sitemesh.xml</code></td><td>Removed, sitemesh filter no longer present.</td></tr><tr class="table-odd"><td><code>web-app/WEB-INF/tld</code></td><td>Removed, can be restored in <code>src/main/webapp</code> or <code>src/main/resources/WEB-INF</code></td></tr></table>
<h2 id="upgradingPlugins">3.1 Upgrading Plugins</h2>
To upgrade a Grails 2.x plugin to Grails 3.x you need to make a number of different changes. This documentation will outline the steps that were taken to upgrade the Quartz plugin to Grails 3, each individual plugin may differ.<p class="paragraph"/><h4>Step 1 - Create a new Grails 3 plugin</h4><p class="paragraph"/>The first step is to create a new Grails 3 plugin using the command line:<p class="paragraph"/><div class="code"><pre>$ grails create&#45;plugin quartz</pre></div><p class="paragraph"/>This will create a Grails 3 plugin in the <code>quartz</code> directory.<p class="paragraph"/><h4>Step 2 - Copy sources from the original Grails 2 plugin</h4><p class="paragraph"/>The next step is to copy the sources from the original Grails 2 plugin to the Grails 3 plugin:<p class="paragraph"/><div class="code"><pre>&#35; first the sources
cp &#45;rf ../quartz&#45;2.x/src/groovy/ src/main/groovy
cp &#45;rf ../quartz&#45;2.x/src/java/ src/main/groovy
cp &#45;rf ../quartz&#45;2.x/grails&#45;app/ grails&#45;app
cp &#45;rf ../quartz&#45;2.x/QuartzGrailsPlugin.groovy src/main/groovy/grails/plugins/quartz<p class="paragraph"/>&#35; then the tests
cp &#45;rf ../quartz&#45;2.x/test/unit/&#42; src/test/groovy
mkdir &#45;p src/integration&#45;test/groovy
cp &#45;rf ../quartz&#45;2.x/test/integration/&#42; src/integration&#45;test/groovy<p class="paragraph"/>&#35; then templates / other resources
cp &#45;rf ../quartz&#45;2.x/src/templates/ src/main/templates</pre></div><p class="paragraph"/><h4>Step 3 - Alter the plugin descriptor</h4><p class="paragraph"/>You will need to add a package declaration to the plugin descriptor. In this case <code>QuartzGrailsPlugin</code> is modified as follows:<p class="paragraph"/><div class="code"><pre>// add <span class="java&#45;keyword">package</span> declaration
<span class="java&#45;keyword">package</span> grails.plugins.quartz
&#8230;
class QuartzGrailsPlugin &#123;
&#8230;
&#125;</pre></div><p class="paragraph"/>In addition you should remove the <code>version</code> property from the descriptor as this is now defined in <code>build.gradle</code>.<p class="paragraph"/><h4>Step 4 - Update the Gradle build with required dependencies</h4><p class="paragraph"/>The repositories and dependencies defined in <code>grails-app/conf/BuildConfig.groovy</code> of the original Grails 2.x plugin will need to be defined in <code>build.gradle</code> of the new Grails 3.x plugin:<p class="paragraph"/><div class="code"><pre>compile(<span class="java&#45;quote">"org.quartz&#45;scheduler:quartz:2.2.1"</span>) &#123;
exclude group: 'slf4j&#45;api', module: 'c3p0'
&#125;</pre></div><p class="paragraph"/><h4>Step 5 - Modify Package Imports</h4><p class="paragraph"/>In Grails 3.x all internal APIs can be found in the <code>org.grails</code> package and public facing APIs in the <code>grails</code> package. The <code>org.codehaus.groovy.grails</code> package no longer exists.<p class="paragraph"/>All package declaration in sources should be modified for the new location of the respective classes. Example <code>org.codehaus.groovy.grails.commons.GrailsApplication</code> is now <code>grails.core.GrailsApplication</code>.<p class="paragraph"/><h4>Step 5 - Migrate Plugin Specific Config to application.yml</h4><p class="paragraph"/>Some plugins define a default configuration file. For example the Quartz plugin defines a file called <code>grails-app/conf/DefaultQuartzConfig.groovy</code>. In Grails 3.x this default configuration can be migrated to <code>grails-app/conf/application.yml</code> and it will automatically be loaded by Grails without requiring manual configuration merging.<p class="paragraph"/><h4>Step 6 - Register ArtefactHandler Definitions</h4><p class="paragraph"/>In Grails 3.x <a href="http://grails.org/doc/3.0.x/api/grails/core/ArtefactHandler.html" class="api">ArtefactHandler</a> definitions written in Java need to be declared in a file called <code>src/main/resources/META-INF/grails.factories</code> since these need to be known at compile time.<p class="paragraph"/><blockquote class="note">
If the <code>ArtefactHandler</code> is written in Groovy this step can be skipped as Grails will automatically create the <code>grails.factories</code> file during compilation.
</blockquote><p class="paragraph"/>The Quartz plugin requires the following definition to register the <code>ArtrefactHandler</code>:<p class="paragraph"/><div class="code"><pre>grails.core.ArtefactHandler=grails.plugins.quartz.JobArtefactHandler</pre></div><p class="paragraph"/><h4>Step 7 - Migrate Code Generation Scripts</h4><p class="paragraph"/>Many plugins previously defined command line scripts in Gant. In Grails 3.x command line scripts have been replaced by two new features: Code generation scripts and Gradle tasks.<p class="paragraph"/>If your script is doing simple code generation then for many cases a code generation script can replace an old Gant script.<p class="paragraph"/>The <code>create-job</code> script provided by the Quartz plugin in Grails 2.x was defined in <code>scripts/CreateJob.groovy</code> as:<p class="paragraph"/><div class="code"><pre>includeTargets &#60;&#60; grailsScript(<span class="java&#45;quote">"_GrailsCreateArtifacts"</span>)<p class="paragraph"/>target(createJob: <span class="java&#45;quote">"Creates a <span class="java&#45;keyword">new</span> Quartz scheduled job"</span>) &#123;
depends(checkVersion, parseArguments)<p class="paragraph"/> def type = <span class="java&#45;quote">"Job"</span>
promptForName(type: type)<p class="paragraph"/> <span class="java&#45;keyword">for</span> (name in argsMap.params) &#123;
name = purgeRedundantArtifactSuffix(name, type)
createArtifact(name: name, suffix: type, type: type, path: <span class="java&#45;quote">"grails&#45;app/jobs"</span>)
createUnitTest(name: name, suffix: type)
&#125;
&#125;<p class="paragraph"/>setDefaultTarget 'createJob'</pre></div><p class="paragraph"/>A replacement Grails 3.x compatible script can be created using the <code>create-script</code> command:<p class="paragraph"/><div class="code"><pre>$ grails create&#45;script create&#45;job</pre></div><p class="paragraph"/>Which creates a new script called <code>src/main/scripts/create-job.groovy</code>. Using the new code generation API it is simple to implement:<p class="paragraph"/><div class="code"><pre>description(<span class="java&#45;quote">"Creates a <span class="java&#45;keyword">new</span> Quartz scheduled job"</span>) &#123;
usage <span class="java&#45;quote">"grails create&#45;job &#91;JOB NAME&#93;"</span>
argument name:'Job Name', description:<span class="java&#45;quote">"The name of the job"</span>
&#125;<p class="paragraph"/>model = model( args&#91;0&#93; )
render template:<span class="java&#45;quote">"Job.groovy"</span>,
destination: file( <span class="java&#45;quote">"grails&#45;app/jobs/$model.packagePath/$&#123;model.simpleName&#125;Job.groovy"</span>),
model: model</pre></div><p class="paragraph"/>Please refer to the documentation on <a href="../guide/single.html#creatingCustomScripts" class="guide">Creating Custom Scripts</a> for more information.<p class="paragraph"/><h4>Migrating More Complex Scripts Using Gradle Tasks</h4><p class="paragraph"/>Using the old Grails 2.x build system it was relatively common to spin up Grails inside the command line. In Grails 3.x it is not possible to load a Grails application within a code generation script created by the <a href="../ref/Command Line/create-script.html" class="commandLine">create-script</a> command.<p class="paragraph"/>Instead a new mechanism specific to plugins exists via the <a href="../ref/Command Line/create-command.html" class="commandLine">create-command</a> command. The <code>create-command</code> command will create a new <a href="http://grails.org/doc/3.0.x/api/grails/dev/commands/ApplicationCommand.html" class="api">ApplicationCommand</a>, for example the following command will execute a query:<p class="paragraph"/><div class="code"><pre><span class="java&#45;keyword">import</span> grails.dev.commands.&#42;
<span class="java&#45;keyword">import</span> javax.sql.&#42;
<span class="java&#45;keyword">import</span> groovy.sql.&#42;
<span class="java&#45;keyword">import</span> org.springframework.beans.factory.annotation.&#42;<p class="paragraph"/>class RunQueryCommand <span class="java&#45;keyword">implements</span> ApplicationCommand &#123;<p class="paragraph"/> @Autowired
DataSource dataSource<p class="paragraph"/> <span class="java&#45;object">boolean</span> handle(ExecutionContext ctx) &#123;
def sql = <span class="java&#45;keyword">new</span> Sql(dataSource)
println sql.executeQuery(<span class="java&#45;quote">"select &#42; from foo"</span>)
<span class="java&#45;keyword">return</span> <span class="java&#45;keyword">true</span>
&#125;
&#125;</pre></div><p class="paragraph"/>With this command in place once the plugin is installed into your local Maven cache you can add the plugin to both the build classpath and the runtime classpath of the application's <code>build.gradle</code> file:<p class="paragraph"/><div class="code"><pre>buildscript &#123;
&#8230;
dependencies &#123;
classpath <span class="java&#45;quote">"org.grails.plugins:myplugin:0.1&#45;SNAPSHOT"</span>
&#125;
&#125;
&#8230;
dependencies &#123;
runtime <span class="java&#45;quote">"org.grails.plugins:myplugin:0.1&#45;SNAPSHOT"</span>
&#125;</pre></div><p class="paragraph"/>Grails will automatically create a Gradle task called <code>runQuery</code> and a command named <code>run-query</code> so both the following examples will execute the command:<p class="paragraph"/><div class="code"><pre>$ grails run&#45;query
$ gradle runQuery</pre></div><p class="paragraph"/><h4>Step 8 - Delete Files that were migrated or no longer used</h4><p class="paragraph"/>You should now delete and cleanup the project of any files no longer required by Grails 3.x (<code>BuildConfig.groovy</code>, <code>Config.groovy</code>, <code>DataSource.groovy</code> etc.)
<h2 id="upgradingApps">3.2 Upgrading Applications</h2>
Upgrading applications to Grails 3.x will require that you upgrade all plugins the application uses first, hence you should follow the steps in the previous section to first upgrade your plugins.<p class="paragraph"/><h4>Step 1 - Create a New Application</h4><p class="paragraph"/>Once the plugins are Grails 3.x compatible you can upgrade the application. To upgrade an application it is again best to create a new Grails 3 application using the "web" profile:<p class="paragraph"/><div class="code"><pre>$ grails create&#45;app myapp
$ cd myapp</pre></div><p class="paragraph"/><h4>Step 2 - Migrate Sources</h4><p class="paragraph"/>The next step is to copy the sources from the original Grails 2 application to the Grails 3 application:<p class="paragraph"/><div class="code"><pre>&#35; first the sources
cp &#45;rf ../old_app/src/groovy/ src/main/groovy
cp &#45;rf ../old_app/src/java/ src/main/groovy
cp &#45;rf ../old_app/grails&#45;app/ grails&#45;app<p class="paragraph"/>&#35; then the tests
cp &#45;rf ../old_app/test/unit/ src/test/groovy
mkdir &#45;p src/integration&#45;test/groovy
cp &#45;rf ../old_app/test/integration/ src/integration&#45;test/groovy</pre></div><p class="paragraph"/><h4>Step 3 - Update the Gradle build with required dependencies</h4><p class="paragraph"/>The repositories and dependencies defined in <code>grails-app/conf/BuildConfig.groovy</code> of the original Grails 2.x application will need to be defined in <code>build.gradle</code> of the new Grails 3.x application.<p class="paragraph"/><h4>Step 4 - Modify Package Imports</h4><p class="paragraph"/>In Grails 3.x all internal APIs can be found in the <code>org.grails</code> package and public facing APIs in the <code>grails</code> package. The <code>org.codehaus.groovy.grails</code> package no longer exists.<p class="paragraph"/>All package declaration in sources should be modified for the new location of the respective classes. Example <code>org.codehaus.groovy.grails.commons.GrailsApplication</code> is now <code>grails.core.GrailsApplication</code>.<p class="paragraph"/><h4>Step 5 - Migrate Configuration</h4><p class="paragraph"/>The configuration of the application will need to be migrated, this can normally be done by simply renaming <code>grails-app/conf/Config.groovy</code> to <code>grails-app/conf/application.groovy</code> and merging the content of <code>grails-app/conf/DataSource.groovy</code> into <code>grails-app/conf/application.groovy</code>.<p class="paragraph"/>Note however that Log4j has been replaced by <code>grails-app/conf/logback.groovy</code> for logging, so any logging configuration in <code>grails-app/conf/Config.groovy</code> should be migrated to <a href="http://logback.qos.ch/manual/groovy.html" target="blank">logback format</a>.<p class="paragraph"/><h4>Step 6 - Migrate web.xml Modifications to Spring</h4><p class="paragraph"/>If you have a modified <code>web.xml</code> template then you will need to migrate this to Spring as Grails 3.x does not use a web.xml (although it is still possible to have on in <code>src/main/webapp/WEB-INF/web.xml</code>).<p class="paragraph"/>New servlets and filters can be registered as Spring beans or with <a href="http://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/context/embedded/ServletRegistrationBean.html" class="api">ServletRegistrationBean</a> and <a href="http://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/context/embedded/FilterRegistrationBean.html" class="api">FilterRegistrationBean</a> respectively.<p class="paragraph"/><h4>Step 7 - Migrate Static Assets not handled by Asset Pipeline</h4><p class="paragraph"/>If you have static assets in your <code>web-app</code> directory of your Grails 2.x application such as HTML files, TLDs etc. these need to be moved. For public assets such as static HTML pages and so on these should go in <code>src/main/resources/public</code>.<p class="paragraph"/>TLD descriptors and non public assets should go in <code>src/main/resources/WEB-INF</code>.<p class="paragraph"/>As noted earlier, <code>src/main/webapp</code> folder can also be used for this purpose but it is not recommended.<p class="paragraph"/><h4>Step 8 - Migrate Tests</h4><p class="paragraph"/>Once the package names are corrected unit tests will continue to run, however any tests that extend the deprecated and removed JUnit 3 hierarchy will need to be migrated to Spock or JUnit 4.<p class="paragraph"/>Integration tests will need to be annotated with the <a href="http://grails.org/doc/3.0.x/api/grails/test/mixin/integration/Integration.html" class="api">Integration</a> annotation and should not extend GroovyTestCase or any JUnit 3 super class.
<div style="clear:both;margin-top:15px;"></div>
<div class="toc-item prev-left"><a href="../guide/gettingStarted.html">&lt;&lt; <strong>2</strong><span>Getting Started</span></a></div>
<div class="toc-item next-right"><a href="../guide/conf.html"><strong>4</strong><span>Configuration</span> >></a></div>
<div style="clear:both"></div>
</div>
</td>
<td id="col2">
<div class="local clearfix">
<div class="local-title">
<a href="../guide/index.html" target="mainFrame">Quick Reference</a>
<span class="toggle">(<a href="#" onclick="localToggle(); return false;">hide</a>)</span>
</div>
<div class="menu">
<div class="menu-block"><h1 class="menu-title" onclick="toggleRef(this.parentNode.childNodes[1])">Command Line</h1><div class="menu-sub">
<div class="menu-item"><a href="../ref/Command%20Line/Usage.html">Usage</a></div>
<div class="menu-item"><a href="../ref/Command%20Line/bug-report.html">bug-report</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/clean.html">clean</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/compile.html">compile</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/console.html">console</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/create-app.html">create-app</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/create-command.html">create-command</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/create-controller.html">create-controller</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/create-domain-class.html">create-domain-class</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/create-functional-test.html">create-functional-test</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/create-integration-test.html">create-integration-test</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/create-interceptor.html">create-interceptor</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/create-plugin.html">create-plugin</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/create-script.html">create-script</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/create-service.html">create-service</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/create-taglib.html">create-taglib</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/create-unit-test.html">create-unit-test</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/dependency-report.html">dependency-report</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/docs.html">docs</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/generate-all.html">generate-all</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/generate-controller.html">generate-controller</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/generate-views.html">generate-views</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/help.html">help</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/install-templates.html">install-templates</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/list-plugins.html">list-plugins</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/package-plugin.html">package-plugin</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/package.html">package</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/plugin-info.html">plugin-info</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/run-app.html">run-app</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/schema-export.html">schema-export</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/shell.html">shell</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/stats.html">stats</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/stop-app.html">stop-app</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/test-app.html">test-app</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/war.html">war</a>
</div>
</div>
</div>
<div class="menu-block"><h1 class="menu-title" onclick="toggleRef(this.parentNode.childNodes[1])">Constraints</h1><div class="menu-sub">
<div class="menu-item"><a href="../ref/Constraints/Usage.html">Usage</a></div>
<div class="menu-item"><a href="../ref/Constraints/attributes.html">attributes</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/bindable.html">bindable</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/blank.html">blank</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/creditCard.html">creditCard</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/email.html">email</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/inList.html">inList</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/matches.html">matches</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/max.html">max</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/maxSize.html">maxSize</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/min.html">min</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/minSize.html">minSize</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/notEqual.html">notEqual</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/nullable.html">nullable</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/range.html">range</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/scale.html">scale</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/size.html">size</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/unique.html">unique</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/url.html">url</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/validator.html">validator</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/widget.html">widget</a>
</div>
</div>
</div>
<div class="menu-block"><h1 class="menu-title" onclick="toggleRef(this.parentNode.childNodes[1])">Controllers</h1><div class="menu-sub">
<div class="menu-item"><a href="../ref/Controllers/Usage.html">Usage</a></div>
<div class="menu-item"><a href="../ref/Controllers/actionName.html">actionName</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/afterInterceptor.html">afterInterceptor</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/allowedMethods.html">allowedMethods</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/beforeInterceptor.html">beforeInterceptor</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/bindData.html">bindData</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/chain.html">chain</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/controllerName.html">controllerName</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/defaultAction.html">defaultAction</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/errors.html">errors</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/flash.html">flash</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/forward.html">forward</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/grailsApplication.html">grailsApplication</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/hasErrors.html">hasErrors</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/namespace.html">namespace</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/params.html">params</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/redirect.html">redirect</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/render.html">render</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/request.html">request</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/respond.html">respond</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/response.html">response</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/responseFormats.html">responseFormats</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/scope.html">scope</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/servletContext.html">servletContext</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/session.html">session</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/withForm.html">withForm</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/withFormat.html">withFormat</a>
</div>
</div>
</div>
<div class="menu-block"><h1 class="menu-title" onclick="toggleRef(this.parentNode.childNodes[1])">Database Mapping</h1><div class="menu-sub">
<div class="menu-item"><a href="../ref/Database%20Mapping/Usage.html">Usage</a></div>
<div class="menu-item"><a href="../ref/Database%20Mapping/autoImport.html">autoImport</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/autoTimestamp.html">autoTimestamp</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/batchSize.html">batchSize</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/cache.html">cache</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/cascade.html">cascade</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/column.html">column</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/comment.html">comment</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/discriminator.html">discriminator</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/dynamicInsert.html">dynamicInsert</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/dynamicUpdate.html">dynamicUpdate</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/fetch.html">fetch</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/id.html">id</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/ignoreNotFound.html">ignoreNotFound</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/indexColumn.html">indexColumn</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/insertable.html">insertable</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/joinTable.html">joinTable</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/lazy.html">lazy</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/order.html">order</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/sort.html">sort</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/table.html">table</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/type.html">type</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/updateable.html">updateable</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/version.html">version</a>
</div>
</div>
</div>
<div class="menu-block"><h1 class="menu-title" onclick="toggleRef(this.parentNode.childNodes[1])">Domain Classes</h1><div class="menu-sub">
<div class="menu-item"><a href="../ref/Domain%20Classes/Usage.html">Usage</a></div>
<div class="menu-item"><a href="../ref/Domain%20Classes/addTo.html">addTo</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/attach.html">attach</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/belongsTo.html">belongsTo</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/clearErrors.html">clearErrors</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/constraints.html">constraints</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/count.html">count</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/countBy.html">countBy</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/createCriteria.html">createCriteria</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/delete.html">delete</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/discard.html">discard</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/embedded.html">embedded</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/errors.html">errors</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/executeQuery.html">executeQuery</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/executeUpdate.html">executeUpdate</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/exists.html">exists</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/fetchMode.html">fetchMode</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/find.html">find</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/findAll.html">findAll</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/findAllBy.html">findAllBy</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/findAllWhere.html">findAllWhere</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/findBy.html">findBy</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/findOrCreateBy.html">findOrCreateBy</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/findOrCreateWhere.html">findOrCreateWhere</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/findOrSaveBy.html">findOrSaveBy</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/findOrSaveWhere.html">findOrSaveWhere</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/findWhere.html">findWhere</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/first.html">first</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/get.html">get</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/getAll.html">getAll</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/getDirtyPropertyNames.html">getDirtyPropertyNames</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/getPersistentValue.html">getPersistentValue</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/hasErrors.html">hasErrors</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/hasMany.html">hasMany</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/hasOne.html">hasOne</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/ident.html">ident</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/instanceOf.html">instanceOf</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/isAttached.html">isAttached</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/isDirty.html">isDirty</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/last.html">last</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/list.html">list</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/listOrderBy.html">listOrderBy</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/load.html">load</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/lock.html">lock</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/mapWith.html">mapWith</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/mappedBy.html">mappedBy</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/mapping.html">mapping</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/merge.html">merge</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/namedQueries.html">namedQueries</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/properties.html">properties</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/read.html">read</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/refresh.html">refresh</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/removeFrom.html">removeFrom</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/save.html">save</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/transients.html">transients</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/validate.html">validate</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/where.html">where</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/whereAny.html">whereAny</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/withCriteria.html">withCriteria</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/withNewSession.html">withNewSession</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/withSession.html">withSession</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/withTransaction.html">withTransaction</a>
</div>
</div>
</div>
<div class="menu-block"><h1 class="menu-title" onclick="toggleRef(this.parentNode.childNodes[1])">Plug-ins</h1><div class="menu-sub">
<div class="menu-item"><a href="../ref/Plug-ins/Usage.html">Usage</a></div>
<div class="menu-item"><a href="../ref/Plug-ins/URL%20mappings.html">URL mappings</a>
</div>
<div class="menu-item"><a href="../ref/Plug-ins/codecs.html">codecs</a>
</div>
<div class="menu-item"><a href="../ref/Plug-ins/controllers.html">controllers</a>
</div>
<div class="menu-item"><a href="../ref/Plug-ins/core.html">core</a>
</div>
<div class="menu-item"><a href="../ref/Plug-ins/dataSource.html">dataSource</a>
</div>
<div class="menu-item"><a href="../ref/Plug-ins/domainClasses.html">domainClasses</a>
</div>
<div class="menu-item"><a href="../ref/Plug-ins/hibernate.html">hibernate</a>
</div>
<div class="menu-item"><a href="../ref/Plug-ins/i18n.html">i18n</a>
</div>
<div class="menu-item"><a href="../ref/Plug-ins/logging.html">logging</a>
</div>
<div class="menu-item"><a href="../ref/Plug-ins/scaffolding.html">scaffolding</a>
</div>
<div class="menu-item"><a href="../ref/Plug-ins/services.html">services</a>
</div>
<div class="menu-item"><a href="../ref/Plug-ins/servlets.html">servlets</a>
</div>
</div>
</div>
<div class="menu-block"><h1 class="menu-title" onclick="toggleRef(this.parentNode.childNodes[1])">Services</h1><div class="menu-sub">
<div class="menu-item"><a href="../ref/Services/Usage.html">Usage</a></div>
<div class="menu-item"><a href="../ref/Services/scope.html">scope</a>
</div>
<div class="menu-item"><a href="../ref/Services/transactional.html">transactional</a>
</div>
</div>
</div>
<div class="menu-block"><h1 class="menu-title" onclick="toggleRef(this.parentNode.childNodes[1])">Servlet API</h1><div class="menu-sub">
<div class="menu-item"><a href="../ref/Servlet%20API/request.html">request</a>
</div>
<div class="menu-item"><a href="../ref/Servlet%20API/response.html">response</a>
</div>
<div class="menu-item"><a href="../ref/Servlet%20API/servletContext.html">servletContext</a>
</div>
<div class="menu-item"><a href="../ref/Servlet%20API/session.html">session</a>
</div>
</div>
</div>
<div class="menu-block"><h1 class="menu-title" onclick="toggleRef(this.parentNode.childNodes[1])">Tag Libraries</h1><div class="menu-sub">
<div class="menu-item"><a href="../ref/Tag%20Libraries/Usage.html">Usage</a></div>
<div class="menu-item"><a href="../ref/Tag%20Libraries/actionName.html">actionName</a>
</div>
<div class="menu-item"><a href="../ref/Tag%20Libraries/controllerName.html">controllerName</a>
</div>
<div class="menu-item"><a href="../ref/Tag%20Libraries/flash.html">flash</a>
</div>
<div class="menu-item"><a href="../ref/Tag%20Libraries/pageScope.html">pageScope</a>
</div>
<div class="menu-item"><a href="../ref/Tag%20Libraries/params.html">params</a>
</div>
<div class="menu-item"><a href="../ref/Tag%20Libraries/request.html">request</a>
</div>
<div class="menu-item"><a href="../ref/Tag%20Libraries/response.html">response</a>
</div>
<div class="menu-item"><a href="../ref/Tag%20Libraries/servletContext.html">servletContext</a>
</div>
<div class="menu-item"><a href="../ref/Tag%20Libraries/session.html">session</a>
</div>
</div>
</div>
<div class="menu-block"><h1 class="menu-title" onclick="toggleRef(this.parentNode.childNodes[1])">Tags</h1><div class="menu-sub">
<div class="menu-item"><a href="../ref/Tags/actionSubmit.html">actionSubmit</a>
</div>
<div class="menu-item"><a href="../ref/Tags/actionSubmitImage.html">actionSubmitImage</a>
</div>
<div class="menu-item"><a href="../ref/Tags/applyLayout.html">applyLayout</a>
</div>
<div class="menu-item"><a href="../ref/Tags/checkBox.html">checkBox</a>
</div>
<div class="menu-item"><a href="../ref/Tags/collect.html">collect</a>
</div>
<div class="menu-item"><a href="../ref/Tags/cookie.html">cookie</a>
</div>
<div class="menu-item"><a href="../ref/Tags/country.html">country</a>
</div>
<div class="menu-item"><a href="../ref/Tags/countrySelect.html">countrySelect</a>
</div>
<div class="menu-item"><a href="../ref/Tags/createLink.html">createLink</a>
</div>
<div class="menu-item"><a href="../ref/Tags/createLinkTo.html">createLinkTo</a>
</div>
<div class="menu-item"><a href="../ref/Tags/currencySelect.html">currencySelect</a>
</div>
<div class="menu-item"><a href="../ref/Tags/datePicker.html">datePicker</a>
</div>
<div class="menu-item"><a href="../ref/Tags/each.html">each</a>
</div>
<div class="menu-item"><a href="../ref/Tags/eachError.html">eachError</a>
</div>
<div class="menu-item"><a href="../ref/Tags/else.html">else</a>
</div>
<div class="menu-item"><a href="../ref/Tags/elseif.html">elseif</a>
</div>
<div class="menu-item"><a href="../ref/Tags/external.html">external</a>
</div>
<div class="menu-item"><a href="../ref/Tags/field.html">field</a>
</div>
<div class="menu-item"><a href="../ref/Tags/fieldValue.html">fieldValue</a>
</div>
<div class="menu-item"><a href="../ref/Tags/findAll.html">findAll</a>
</div>
<div class="menu-item"><a href="../ref/Tags/form.html">form</a>
</div>
<div class="menu-item"><a href="../ref/Tags/formatBoolean.html">formatBoolean</a>
</div>
<div class="menu-item"><a href="../ref/Tags/formatDate.html">formatDate</a>
</div>
<div class="menu-item"><a href="../ref/Tags/formatNumber.html">formatNumber</a>
</div>
<div class="menu-item"><a href="../ref/Tags/grep.html">grep</a>
</div>
<div class="menu-item"><a href="../ref/Tags/hasErrors.html">hasErrors</a>
</div>
<div class="menu-item"><a href="../ref/Tags/header.html">header</a>
</div>
<div class="menu-item"><a href="../ref/Tags/hiddenField.html">hiddenField</a>
</div>
<div class="menu-item"><a href="../ref/Tags/if.html">if</a>
</div>
<div class="menu-item"><a href="../ref/Tags/img.html">img</a>
</div>
<div class="menu-item"><a href="../ref/Tags/include.html">include</a>
</div>
<div class="menu-item"><a href="../ref/Tags/isAvailable.html">isAvailable</a>
</div>
<div class="menu-item"><a href="../ref/Tags/isNotAvailable.html">isNotAvailable</a>
</div>
<div class="menu-item"><a href="../ref/Tags/javascript.html">javascript</a>
</div>
<div class="menu-item"><a href="../ref/Tags/join.html">join</a>
</div>
<div class="menu-item"><a href="../ref/Tags/layoutBody.html">layoutBody</a>
</div>
<div class="menu-item"><a href="../ref/Tags/layoutHead.html">layoutHead</a>
</div>
<div class="menu-item"><a href="../ref/Tags/layoutTitle.html">layoutTitle</a>
</div>
<div class="menu-item"><a href="../ref/Tags/link.html">link</a>
</div>
<div class="menu-item"><a href="../ref/Tags/localeSelect.html">localeSelect</a>
</div>
<div class="menu-item"><a href="../ref/Tags/message.html">message</a>
</div>
<div class="menu-item"><a href="../ref/Tags/meta.html">meta</a>
</div>
<div class="menu-item"><a href="../ref/Tags/pageProperty.html">pageProperty</a>
</div>
<div class="menu-item"><a href="../ref/Tags/paginate.html">paginate</a>
</div>
<div class="menu-item"><a href="../ref/Tags/passwordField.html">passwordField</a>
</div>
<div class="menu-item"><a href="../ref/Tags/radio.html">radio</a>
</div>
<div class="menu-item"><a href="../ref/Tags/radioGroup.html">radioGroup</a>
</div>
<div class="menu-item"><a href="../ref/Tags/render.html">render</a>
</div>
<div class="menu-item"><a href="../ref/Tags/renderErrors.html">renderErrors</a>
</div>
<div class="menu-item"><a href="../ref/Tags/resource.html">resource</a>
</div>
<div class="menu-item"><a href="../ref/Tags/select.html">select</a>
</div>
<div class="menu-item"><a href="../ref/Tags/set.html">set</a>
</div>
<div class="menu-item"><a href="../ref/Tags/sortableColumn.html">sortableColumn</a>
</div>
<div class="menu-item"><a href="../ref/Tags/submitButton.html">submitButton</a>
</div>
<div class="menu-item"><a href="../ref/Tags/textArea.html">textArea</a>
</div>
<div class="menu-item"><a href="../ref/Tags/textField.html">textField</a>
</div>
<div class="menu-item"><a href="../ref/Tags/timeZoneSelect.html">timeZoneSelect</a>
</div>
<div class="menu-item"><a href="../ref/Tags/unless.html">unless</a>
</div>
<div class="menu-item"><a href="../ref/Tags/uploadForm.html">uploadForm</a>
</div>
<div class="menu-item"><a href="../ref/Tags/while.html">while</a>
</div>
</div>
</div>
</div>
</div>
</td>
</tr>
</table>
<div id="footer">
Copies of this document may be made for your own use and for distribution to others, provided that you do not charge any fee for such copies and further provided that each copy contains this Copyright Notice, whether distributed in print or electronically.
</div>
<script type="text/javascript" src="../js/docs.js"></script>
</body>
</html>