Tuesday Apr 22, 2008

TOTD #31: CRUD Application using Grails - Hosted on GlassFish and MySQL


TOTD #30 explained how to create CRUD application using Grails and hosted using in-built Jetty servlet engine and in-memory HSQLDB database. Jetty and HSQLDB are built into Grails and allows to start easily. You can also use GlassFish and MySQL for deploying your applications in production environment.

This blog entry walks you through the steps of deploying a Grails application on GlassFish and MySQL.
  1. If MySQL is already installed, then download GlassFish v2 UR1. Otherwise you can also Download GlassFish v2 UR1 and MySQL co-bundle from usual Download Page (instructions).
  2. Configure MySQL database
    1. Download MySQL Connector/J 5.1.6 from here.
    2. Extract the bundle and copy "mysql-connector-java-5.1.6-bin.jar" to the "lib" directory of Grails application.
    3. Start MySQL database as:

      ~/testbed/grails-1.0.2/samples/crud >sudo /usr/local/mysql/bin/mysqld_safe --user root --console
      Starting mysqld daemon with databases from /usr/local/mysql/data
    4. Create database by giving the following command:

      ~/testbed/grails-1.0.2/samples/crud >/usr/local/mysql/bin/mysqladmin create crudProd --user root
  3. Configure the Application
    1. Edit "grails-app/conf/DataSource.groovy" to specify MySQL configuration. The updated file looks like (changes highlighted in bold):

      dataSource {
              pooled = false
              driverClassName = "com.mysql.jdbc.Driver"
              username = "root"
              password = ""
              dialect = "org.hibernate.dialect.MySQL5InnoDBDialect"
      }
      hibernate {
          cache.use_second_level_cache=true
          cache.use_query_cache=true
          cache.provider_class='org.hibernate.cache.EhCacheProvider'
      }
      // environment specific settings
      environments {
              development {
                      dataSource {
                              dbCreate = "create-drop" // one of 'create', 'create-drop','update'
                              url = "jdbc:hsqldb:mem:devDB"
                      }
              }
              test {
                      dataSource {
                              dbCreate = "update"
                              url = "jdbc:hsqldb:mem:testDb"
                      }
              }
              production {
                      dataSource {
                              dbCreate = "update"
                              url = "jdbc:mysql://localhost/crudProd"
                      }
              }
      }

    2. Being in production, it's recommended to use InnoDB tables instead of MyISAM tables. This can be easily specified by using the dialect as explained here. More details about the contents of "DataSource.groovy" can be found here.
    3. Create a WAR by giving the following command:

      ~/testbed/grails-1.0.2/samples/crud >grails war

      Welcome to Grails 1.0.2 - http://grails.org/
      Licensed under Apache Standard License 2.0
      Grails home is set to: /Users/arungupta/testbed/grails-1.0.2

      Base Directory: /Users/arungupta/testbed/grails-1.0.2/samples/crud
      Note: No plugin scripts found
      Running script /Users/arungupta/testbed/grails-1.0.2/scripts/War.groovy
      Environment set to production
         [delete] Deleting: /Users/arungupta/.grails/1.0.2/projects/crud/resources/web.xml
         [delete] Deleting directory /Users/arungupta/.grails/1.0.2/projects/crud/classes
      . . .
      [propertyfile] Updating property file: /Users/arungupta/testbed/grails-1.0.2/samples/crud/staging/WEB-INF/classes/application.properties
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/crud/staging/WEB-INF/plugins
           [copy] Warning: /Users/arungupta/testbed/grails-1.0.2/samples/crud/plugins not found.
            [jar] Building jar: /Users/arungupta/testbed/grails-1.0.2/samples/crud/crud-0.1.war
         [delete] Deleting directory /Users/arungupta/testbed/grails-1.0.2/samples/crud/staging
      Done creating WAR /Users/arungupta/testbed/grails-1.0.2/samples/crud/crud-0.1.war
  4. Deploy the WAR file as:

    ~/testbed/grails-1.0.2/samples/crud >~/testbed/glassfish/v3/p2b9/glassfish/bin/asadmin deploy crud-0.1.war
    crud-0.1 deployed successfully
    Command deploy executed successfully.

    The application is now accessible at "http://localhost:8080/crud-0.1" and looks like:


  5. READ - Click on "StateController" and the following page is shown:

  6. CREATE - Click on "New State" and enter the values as shown below:



    and click on "Create" to see the following page:

  7. UPDATE & DELETE - You can click on "Edit" or "Delete" to perform U or D of CRUD or click on "State List" to view the updated list.

Please leave suggestions on other TOTD that you'd like to see. A complete archive is available here.


Technorati: groovy grails glassfish mysql scripting netbeans

Monday Apr 21, 2008

TOTD #30: CRUD Application using Grails - Hosted on Jetty and HSQLDB


After a simple Grails application, let's create a CRUD application. Such an application allows to perform basic database operations to read table rows from the database, create new rows, and edit and delete existing rows. This blog shows how such an application can be created using Grails, hosted on built-in Jetty servlet engine and use in-memory HSQLDB database for persistence.

A follow-up entry will show how this application can be deployed in production mode on GlassFish and using MySQL database.
  1. Create a Grails application
    1. After Grails download and configuration, create a new application "crud" as:

      ~/testbed/grails-1.0.2/samples >grails create-app crud

      Welcome to Grails 1.0.2 - http://grails.org/
      Licensed under Apache Standard License 2.0
      Grails home is set to: /Users/arungupta/testbed/grails-1.0.2

      Base Directory: /Users/arungupta/testbed/grails-1.0.2/samples
      Note: No plugin scripts found
      Running script /Users/arungupta/testbed/grails-1.0.2/scripts/CreateApp.groovy
      Environment set to development
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/crud/src
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/crud/src/java
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/crud/src/groovy
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/crud/grails-app
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/crud/grails-app/controllers
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/crud/grails-app/services
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/crud/grails-app/domain
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/crud/grails-app/taglib
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/crud/grails-app/utils
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/crud/grails-app/views
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/crud/grails-app/views/layouts
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/crud/grails-app/i18n
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/crud/grails-app/conf
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/crud/test
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/crud/test/unit
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/crud/test/integration
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/crud/scripts
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/crud/web-app
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/crud/web-app/js
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/crud/web-app/css
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/crud/web-app/images
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/crud/web-app/META-INF
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/crud/lib
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/crud/grails-app/conf/spring
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/crud/grails-app/conf/hibernate
      [propertyfile] Creating new property file: /Users/arungupta/testbed/grails-1.0.2/samples/crud/application.properties
           [copy] Copying 2 files to /Users/arungupta/testbed/grails-1.0.2/samples/crud
           [copy] Copying 2 files to /Users/arungupta/testbed/grails-1.0.2/samples/crud/web-app/WEB-INF
           [copy] Copying 5 files to /Users/arungupta/testbed/grails-1.0.2/samples/crud/web-app/WEB-INF/tld
           [copy] Copying 87 files to /Users/arungupta/testbed/grails-1.0.2/samples/crud/web-app
           [copy] Copying 17 files to /Users/arungupta/testbed/grails-1.0.2/samples/crud/grails-app
           [copy] Copying 1 file to /Users/arungupta/testbed/grails-1.0.2/samples/crud
           [copy] Copying 1 file to /Users/arungupta/testbed/grails-1.0.2/samples/crud
           [copy] Copying 1 file to /Users/arungupta/testbed/grails-1.0.2/samples/crud
      [propertyfile] Updating property file: /Users/arungupta/testbed/grails-1.0.2/samples/crud/application.properties
      Created Grails Application at /Users/arungupta/testbed/grails-1.0.2/samples/crud
    2. In your project directory, create a domain class as:

      ~/testbed/grails-1.0.2/samples/crud >grails create-domain-class state

      Welcome to Grails 1.0.2 - http://grails.org/
      Licensed under Apache Standard License 2.0
      Grails home is set to: /Users/arungupta/testbed/grails-1.0.2

      Base Directory: /Users/arungupta/testbed/grails-1.0.2/samples/crud
      Note: No plugin scripts found
      Running script /Users/arungupta/testbed/grails-1.0.2/scripts/CreateDomainClass.groovy
      Environment set to development
           [copy] Copying 1 file to /Users/arungupta/testbed/grails-1.0.2/samples/crud/grails-app/domain
      Created  for State
           [copy] Copying 1 file to /Users/arungupta/testbed/grails-1.0.2/samples/crud/test/integration
      Created Tests for State

      This creates "State.groovy" class in "grails-app/domain" directory and looks like:

      class State {

      }

      Add two fields to store state name and the corresponding abbreviation as shown below:

      class State {
              String name
              String abbrev
      }
    3. Change "grails-app/conf/BootStrap.groovy" class to initialize the domain with sample data as shown below:

      class BootStrap {

           def init = { servletContext ->
                new State(name:"California", abbrev:"CA").save()
                new State(name:"New York", abbrev:"NY").save()
                new State(name:"Texas", abbrev:"TX").save()
                new State(name:"Wisconsin", abbrev:"WI").save()
           }
           def destroy = {
           }
    4. Create a new controller as:

      ~/testbed/grails-1.0.2/samples/crud >grails create-controller state

      Welcome to Grails 1.0.2 - http://grails.org/
      Licensed under Apache Standard License 2.0
      Grails home is set to: /Users/arungupta/testbed/grails-1.0.2

      Base Directory: /Users/arungupta/testbed/grails-1.0.2/samples/crud
      Note: No plugin scripts found
      Running script /Users/arungupta/testbed/grails-1.0.2/scripts/CreateController.groovy
      Environment set to development
           [copy] Copying 1 file to /Users/arungupta/testbed/grails-1.0.2/samples/crud/grails-app/controllers
      Created Controller for State
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/crud/grails-app/views/state
           [copy] Copying 1 file to /Users/arungupta/testbed/grails-1.0.2/samples/crud/test/integration
      Created ControllerTests for State

      This generates "grails-app/controllers/StateController.groovy" with the following content:

      class StateController {

          def index = { }
      }

      Replace it with to define a scaffold:

      class StateController {

          def scaffold = State
      }
  2. Start the application using built-in Jetty Servlet engine and in-memory HSQLDB database as shown below:

    ~/testbed/grails-1.0.2/samples/crud >grails run-app

    Welcome to Grails 1.0.2 - http://grails.org/
    Licensed under Apache Standard License 2.0
    Grails home is set to: /Users/arungupta/testbed/grails-1.0.2

    Base Directory: /Users/arungupta/testbed/grails-1.0.2/samples/crud
    Note: No plugin scripts found
    Running script /Users/arungupta/testbed/grails-1.0.2/scripts/RunApp.groovy
    Environment set to development
    Running Grails application..
    2008-04-18 17:26:29.962::INFO:  Logging to STDERR via org.mortbay.log.StdErrLog
    2008-04-18 17:26:29.075::INFO:  jetty-6.1.4
    2008-04-18 17:26:29.155::INFO:  No Transaction manager found - if your webapp requires one, please configure one.
    2008-04-18 17:26:30.886:/crud:INFO:  Set web app root system property: 'crud' = [/Users/arungupta/testbed/grails-1.0.2/samples/crud/web-app/]
    2008-04-18 17:26:30.886:/crud:INFO:  Initializing Log4J from [file:/Users/arungupta/.grails/1.0.2/projects/crud/resources/log4j.properties]
    2008-04-18 17:26:30.945:/crud:INFO:  Initializing Spring root WebApplicationContext
    [0] spring.GrailsWebApplicationContext Refreshing org.codehaus.groovy.grails.commons.spring.GrailsWebApplicationContext@848dfb: display name [org.codehaus.groovy.grails.commons.spring.GrailsWebApplicationContext@848dfb]; startup date [Fri Apr 18 17:26:32 PDT 2008]; parent: org.springframework.web.context.support.XmlWebApplicationContext@cddcc3
    [1] spring.GrailsWebApplicationContext Bean factory for application context [org.codehaus.groovy.grails.commons.spring.GrailsWebApplicationContext@848dfb]: org.springframework.beans.factory.support.DefaultListableBeanFactory@11f136
    2008-04-18 17:26:34.655:/crud:INFO:  Initializing Spring FrameworkServlet 'grails'
    2008-04-18 17:26:35.716::INFO:  Started SelectChannelConnector@0.0.0.0:8080
    Server running. Browse to http://localhost:8080/crud

    The application is now accessible at "http://localhost:8080/crud" and looks like:



  3. READ - Click on "StateController" and the following page is shown:



  4. CREATE - Click on "New State" and enter the values as shown below:



    and click on "Create" to see the following page:



  5. UPDATE & DELETE - You can click on "Edit" or "Delete" to perform U or D of CRUD or click on "State List" to view the updated list as shown below:

Please leave suggestions on other TOTD that you'd like to see. A complete archive is available here.

Technorati: groovy grails glassfish jetty hsqldb scripting crud

Thursday Apr 10, 2008

Getting Started with Grails on GlassFish


This blog has published good amount of content on how Ruby-on-Rails applications can be deployed on GlassFish. Grails is another popular MVC-based framework that leverages the Groovy language. Basically, Grails : Groovy :: Rails : Ruby.

Starting today, I plan to start publishing content on Grails and talk about how GlassFish v3 is turning out to be a home for several scripting languages - Ruby/JRuby/Rails, JavaScript/Phobos, Groovy/Grails and more to be added.

This blog shows how to get started with Grails and deploy a simple application on GlassFish v3. Lets go!
  1. Download Grails 1.0.2 (docs, release notes, other builds) and unzip.

    ~/testbed/grails-1.0.2 >export GRAILS_HOME=`pwd`
    ~/testbed/grails-1.0.2 >export PATH=$GRAILS_HOME/bin:$PATH

    On MacOS 10.5, I had to manually set the executable permissions using "chmod +x grails" and then saw the following:

    ~/testbed/grails-1.0.2 >grails

    Welcome to Grails 1.0.2 - http://grails.org/
    Licensed under Apache Standard License 2.0
    Grails home is set to: /Users/arungupta/testbed/grails-1.0.2

    No script name specified. Use 'grails help' for more info

  2. Create & Deploy a Grails HelloWorld:
    1. Create a Grails app "helloworld" as:

      ~/testbed/grails-1.0.2/samples >grails create-app helloworld

      Welcome to Grails 1.0.2 - http://grails.org/
      Licensed under Apache Standard License 2.0
      Grails home is set to: /Users/arungupta/testbed/grails-1.0.2

      Base Directory: /Users/arungupta/testbed/grails-1.0.2/samples
      Note: No plugin scripts found
      Running script /Users/arungupta/testbed/grails-1.0.2/scripts/CreateApp.groovy
      Environment set to development
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/src
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/src/java
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/src/groovy
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/grails-app
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/grails-app/controllers
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/grails-app/services
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/grails-app/domain
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/grails-app/taglib
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/grails-app/utils
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/grails-app/views
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/grails-app/views/layouts
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/grails-app/i18n
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/grails-app/conf
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/test
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/test/unit
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/test/integration
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/scripts
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/web-app
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/web-app/js
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/web-app/css
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/web-app/images
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/web-app/META-INF
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/lib
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/grails-app/conf/spring
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/grails-app/conf/hibernate
      [propertyfile] Creating new property file: /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/application.properties
           [copy] Copying 2 files to /Users/arungupta/testbed/grails-1.0.2/samples/helloworld
           [copy] Copying 2 files to /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/web-app/WEB-INF
           [copy] Copying 5 files to /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/web-app/WEB-INF/tld
           [copy] Copying 87 files to /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/web-app
           [copy] Copying 17 files to /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/grails-app
           [copy] Copying 1 file to /Users/arungupta/testbed/grails-1.0.2/samples/helloworld
           [copy] Copying 1 file to /Users/arungupta/testbed/grails-1.0.2/samples/helloworld
           [copy] Copying 1 file to /Users/arungupta/testbed/grails-1.0.2/samples/helloworld
      [propertyfile] Updating property file: /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/application.properties
      Created Grails Application at /Users/arungupta/testbed/grails-1.0.2/samples/helloworld

      The top-level directory structure is:

      total 56
      drwxr-xr-x  14 arungupta  arungupta   476 Apr 10 10:44 .
      drwxr-xr-x   3 arungupta  arungupta   102 Apr 10 10:44 ..
      -rw-r--r--   1 arungupta  arungupta  5911 Apr 10 10:44 .classpath
      -rw-r--r--   1 arungupta  arungupta   553 Apr 10 10:44 .project
      -rw-r--r--   1 arungupta  arungupta   115 Apr 10 10:44 application.properties
      -rw-r--r--   1 arungupta  arungupta  1464 Apr 10 10:44 build.xml
      drwxr-xr-x  10 arungupta  arungupta   340 Apr 10 10:44 grails-app
      -rw-r--r--   1 arungupta  arungupta  1805 Apr 10 10:44 helloworld.launch
      -rw-r--r--   1 arungupta  arungupta  2287 Apr 10 10:44 helloworld.tmproj
      drwxr-xr-x   2 arungupta  arungupta    68 Apr 10 10:44 lib
      drwxr-xr-x   2 arungupta  arungupta    68 Apr 10 10:44 scripts
      drwxr-xr-x   4 arungupta  arungupta   136 Apr 10 10:44 src
      drwxr-xr-x   4 arungupta  arungupta   136 Apr 10 10:44 test
      drwxr-xr-x   8 arungupta  arungupta   272 Apr 10 10:44 web-app

      This directory is created using Convention over Configuation and the purpose of each directory is explained here.
    2. The app can be started as:

      ~/testbed/grails-1.0.2/samples/helloworld >grails run-app

      Welcome to Grails 1.0.2 - http://grails.org/
      Licensed under Apache Standard License 2.0
      Grails home is set to: /Users/arungupta/testbed/grails-1.0.2

      Base Directory: /Users/arungupta/testbed/grails-1.0.2/samples/helloworld
      Note: No plugin scripts found
      Running script /Users/arungupta/testbed/grails-1.0.2/scripts/RunApp.groovy
      Environment set to development
          [mkdir] Created dir: /Users/arungupta/.grails/1.0.2/projects/helloworld/classes
        [groovyc] Compiling 6 source files to /Users/arungupta/.grails/1.0.2/projects/helloworld/classes
          [mkdir] Created dir: /Users/arungupta/.grails/1.0.2/projects/helloworld/resources/grails-app/i18n
      [native2ascii] Converting 10 files from /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/grails-app/i18n to /Users/arungupta/.grails/1.0.2/projects/helloworld/resources/grails-app/i18n
           [copy] Copying 1 file to /Users/arungupta/.grails/1.0.2/projects/helloworld/classes
           [copy] Copying 1 file to /Users/arungupta/.grails/1.0.2/projects/helloworld/resources
           [copy] Copying 1 file to /Users/arungupta/.grails/1.0.2/projects/helloworld
      Running Grails application..
      2008-04-10 10:47:51.501::INFO:  Logging to STDERR via org.mortbay.log.StdErrLog
      2008-04-10 10:47:51.603::INFO:  jetty-6.1.4
      2008-04-10 10:47:51.755::INFO:  No Transaction manager found - if your webapp requires one, please configure one.
      2008-04-10 10:47:52.503:/helloworld:INFO:  Set web app root system property: 'helloworld' = [/Users/arungupta/testbed/grails-1.0.2/samples/helloworld/web-app/]
      2008-04-10 10:47:52.503:/helloworld:INFO:  Initializing Log4J from [file:/Users/arungupta/.grails/1.0.2/projects/helloworld/resources/log4j.properties]
      2008-04-10 10:47:52.582:/helloworld:INFO:  Initializing Spring root WebApplicationContext
      [0] spring.GrailsWebApplicationContext Refreshing org.codehaus.groovy.grails.commons.spring.GrailsWebApplicationContext@dccb42: display name [org.codehaus.groovy.grails.commons.spring.GrailsWebApplicationContext@dccb42]; startup date [Thu Apr 10 10:47:53 PDT 2008]; parent: org.springframework.web.context.support.XmlWebApplicationContext@188af2
      [0] spring.GrailsWebApplicationContext Bean factory for application context [org.codehaus.groovy.grails.commons.spring.GrailsWebApplicationContext@dccb42]: org.springframework.beans.factory.support.DefaultListableBeanFactory@413ebc
      2008-04-10 10:47:55.602:/helloworld:INFO:  Initializing Spring FrameworkServlet 'grails'
      2008-04-10 10:47:55.652::INFO:  Started SelectChannelConnector@0.0.0.0:8080
      Server running. Browse to http://localhost:8080/helloworld
      2008-04-10 10:48:15.133:/helloworld:INFO:  GSP servlet initialized

      The output in the browser looks like:


      Jetty is used as the development environment server but soon GlassFish v3 can be used, stay tuned on that!

      Anyway, the WAR format is used for deployment. Lets see how this app can be easily deployed as a WAR file on GlassFish v3.
  3. Download GlassFish v3 Preview 2 b08 and unzip.
  4. Create and Deploy WAR
    1. GlassFish certainly supports WAR-based deployment of Grails apps but direct deployment (aka native or directory-based deployment) of Grails applications will be supported soon as well. Anyway, for now, create a WAR file of the application as:

      ~/testbed/grails-1.0.2/samples/helloworld >grails war

      Welcome to Grails 1.0.2 - http://grails.org/
      Licensed under Apache Standard License 2.0
      Grails home is set to: /Users/arungupta/testbed/grails-1.0.2

      Base Directory: /Users/arungupta/testbed/grails-1.0.2/samples/helloworld
      Note: No plugin scripts found
      Running script /Users/arungupta/testbed/grails-1.0.2/scripts/War.groovy
      Environment set to production
         [delete] Deleting: /Users/arungupta/.grails/1.0.2/projects/helloworld/resources/web.xml
         [delete] Deleting directory /Users/arungupta/.grails/1.0.2/projects/helloworld/classes
         [delete] Deleting directory /Users/arungupta/.grails/1.0.2/projects/helloworld/resources
          [mkdir] Created dir: /Users/arungupta/.grails/1.0.2/projects/helloworld/classes
        [groovyc] Compiling 6 source files to /Users/arungupta/.grails/1.0.2/projects/helloworld/classes
          [mkdir] Created dir: /Users/arungupta/.grails/1.0.2/projects/helloworld/resources/grails-app/i18n
      [native2ascii] Converting 10 files from /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/grails-app/i18n to /Users/arungupta/.grails/1.0.2/projects/helloworld/resources/grails-app/i18n
           [copy] Copying 1 file to /Users/arungupta/.grails/1.0.2/projects/helloworld/classes
           [copy] Copying 1 file to /Users/arungupta/.grails/1.0.2/projects/helloworld/resources
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/staging
           [copy] Copying 93 files to /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/staging
           [copy] Copied 19 empty directories to 1 empty directory under /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/staging
           [copy] Copying 12 files to /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/staging/WEB-INF/grails-app
           [copy] Copying 26 files to /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/staging/WEB-INF/classes
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/staging/WEB-INF/spring
           [copy] Copying 1 file to /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/staging/WEB-INF/classes
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/staging/WEB-INF/templates/scaffolding
           [copy] Copying 6 files to /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/staging/WEB-INF/templates/scaffolding
           [copy] Copying 49 files to /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/staging/WEB-INF/lib
           [copy] Copying 1 file to /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/staging/WEB-INF
         [delete] Deleting: /Users/arungupta/.grails/1.0.2/projects/helloworld/resources/web.xml
           [copy] Warning: /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/plugins not found.
      [propertyfile] Updating property file: /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/staging/WEB-INF/classes/application.properties
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/staging/WEB-INF/plugins
           [copy] Warning: /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/plugins not found.
            [jar] Building jar: /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/helloworld-0.1.war
         [delete] Deleting directory /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/staging
      Done creating WAR /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/helloworld-0.1.war

      The create WAR file is 18,012,069 bytes.
    2. Start the GlassFish container as:

      ~/testbed/glassfish/v3/p2-b08/glassfish >bin/startserv --verbose
      Apr 10, 2008 11:03:28 AM com.sun.enterprise.admin.launcher.GFLauncherLogger info
      INFO: JVM invocation command line:
      /System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home/bin/java
      -cp
      /Users/arungupta/testbed/glassfish/v3/p2-b08/glassfish/modules/glassfish-10.0-SNAPSHOT.jar
      . . .
      INFO: Listening on port 8080
      Apr 10, 2008 11:03:29 AM com.sun.enterprise.v3.services.impl.GrizzlyEmbeddedHttpConfigurator configureSSL
      WARNING: HTTP listener on port: 8181 is secured, but SSL configuration is not found!
      Apr 10, 2008 11:03:29 AM com.sun.enterprise.v3.services.impl.GrizzlyProxy start
      INFO: Listening on port 8181
      Apr 10, 2008 11:03:29 AM com.sun.enterprise.v3.services.impl.GrizzlyProxy start
      INFO: Listening on port 4848
      Apr 10, 2008 11:03:29 AM com.sun.enterprise.v3.admin.adapter.AdminConsoleAdapter setContextRoot
      INFO: Admin Console Adapter: context root: /admin
      Apr 10, 2008 11:03:29 AM com.sun.enterprise.v3.server.AppServerStartup run
      INFO: com.sun.enterprise.v3.services.impl.GrizzlyService@b24c9a startup done in 681 ms
      Apr 10, 2008 11:03:29 AM com.sun.enterprise.v3.services.impl.ApplicationLoaderService postConstruct
      INFO: loader service postConstruct started at 1207850609785
      Apr 10, 2008 11:03:29 AM com.sun.enterprise.v3.server.AppServerStartup run
      INFO: Application Loader startup done in 717 ms
      Apr 10, 2008 11:03:29 AM com.sun.enterprise.v3.server.AppServerStartup run
      INFO: Glassfish v3 started in 717 ms
      Apr 10, 2008 11:03:29 AM com.sun.enterprise.v3.admin.adapter.AdminConsoleAdapter ready
      INFO: AdminConsoleAdapter is ready ...
    3. Deploy the WAR file as:

      ~/testbed/grails-1.0.2/samples/helloworld >~/testbed/glassfish/v3/p2-b08/glassfish/bin/asadmin deploy helloworld-0.1.war
      helloworld-0.1 deployed successfully
      properties=(name=helloworld-0.1)
      Command deploy executed successfully.

      The output in the browser now looks like:


  5. Add Controller and Re-deploy
    1. Create a new controller as:

      C~/testbed/grails-1.0.2/samples/helloworld >grails create-controller hello

      Welcome to Grails 1.0.2 - http://grails.org/
      Licensed under Apache Standard License 2.0
      Grails home is set to: /Users/arungupta/testbed/grails-1.0.2

      Base Directory: /Users/arungupta/testbed/grails-1.0.2/samples/helloworld
      Note: No plugin scripts found
      Running script /Users/arungupta/testbed/grails-1.0.2/scripts/CreateController.groovy
      Environment set to development
           [copy] Copying 1 file to /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/grails-app/controllers
      Created Controller for Hello
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/grails-app/views/hello
           [copy] Copying 1 file to /Users/arungupta/testbed/grails-1.0.2/samples/helloworld/test/integration
      Created ControllerTests for Hello

      and change the controller as shown:

      ~/testbed/grails-1.0.2/samples/helloworld >vi grails-app/controllers/HelloController.groovy

      class HelloController {

             def world = {
                      render "Hello World!"
              }
          //def index = { }
      }
    2. Re-create & re-deploy the WAR as described in bullet # 4. And now "http://localhost:8080/helloworld-0.1" shows the output as shown:



      and clicking on "HelloController" shows the output as:



      The same view is also available at "http://localhost:8080/helloworld-0.1/hello/world" as shown below:


So we deployed a simple Grails application as a WAR on GlassFish v3. Here are some tasks that we are working on:
  • Deploy Grails app on GlassFish v3 using "grails" command (in development environment)
  • Deploy Grails app directly on GlassFish v3 without creating a WAR (in production environment)
  • Seamless integration with NetBeans to provide direct development/deployment to GlassFish
And there is much more, stay tuned!

If you have questions, ask them at GlassFish forum or Users Alias.

Technorati: groovy grails glassfish v3 scripting netbeans
About

profile image
Arun Gupta is a technology enthusiast, a passionate runner, author, and a community guy who works for Oracle Corp.


Java EE 7 Samples

Stay Connected

Search

Archives
« April 2014
SunMonTueWedThuFriSat
  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
   
       
Today