Skip to main content

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

Posted by arungupta on April 22, 2008 at 6:58 AM PDT



After a href="http://blogs.sun.com/arungupta/entry/getting_started_with_grails_on">simple
Grails application, let's create a href="http://en.wikipedia.org/wiki/Create%2C_read%2C_update_and_delete">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 href="http://www.mortbay.org/">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 href="http://blogs.sun.com/arungupta/entry/getting_started_with_grails_on">download
      and configuration, create a new application "crud" as:


      cellpadding="2" cellspacing="2">
      ~/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:


      cellpadding="2" cellspacing="2">
      ~/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:


      cellpadding="2" cellspacing="2">
      class
      State {



      }



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


      cellpadding="2" cellspacing="2">
      class
      State {

             
      String name

             
      String abbrev

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


      cellpadding="2" cellspacing="2">
      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:


      cellpadding="2" cellspacing="2">
      ~/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:


      cellpadding="2" cellspacing="2">
      class
      StateController {



          def index = { }

      }



      Replace it with to define a scaffold:


      cellpadding="2" cellspacing="2">
      class
      StateController {



          def scaffold = State

      }
  2. Start the application using built-in href="http://www.mortbay.org/">Jetty Servlet engine
    and in-memory HSQLDB
    database as shown below:


    cellpadding="2" cellspacing="2">
    ~/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:



    src="http://blogs.sun.com/arungupta/resource/images/grails-crud-default-page.png">


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



    src="http://blogs.sun.com/arungupta/resource/images/grails-crud-list-page.png">


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



    src="http://blogs.sun.com/arungupta/resource/images/grails-crud-new-state-page.png">



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



    src="http://blogs.sun.com/arungupta/resource/images/grails-crud-created-page.png">


  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:



    src="http://blogs.sun.com/arungupta/resource/images/grails-crud-updated-list-page.png">

Please leave suggestions on other TOTD that you'd like to see.
A complete archive is available href="http://blogs.sun.com/arungupta/tags/totd">here.

Technorati: groovy
grails
glassfish
jetty href="http://technorati.com/tag/hsqldb">hsqldb
scripting  href="http://technorati.com/tag/crud">crud

Related Topics >>