Both sides previous revisionPrevious revisionNext revision | Previous revision |
at-m42:casestudies:cs05 [2009/04/28 07:24] – eechris | at-m42:casestudies:cs05 [2011/01/14 12:59] (current) – external edit 127.0.0.1 |
---|
We shall take the example that we have developed over the previous four case studies, and re-implement //Player// and //Item// administration for an adventure game in Grails. | We shall take the example that we have developed over the previous four case studies, and re-implement //Player// and //Item// administration for an adventure game in Grails. |
| |
* [[at-m42:labs:setup#Install Grails|Step 1: Install and Configure Grails]] -- note Grails includes the run-time files for Groovy (''groovy-all-1.6.0.jar'') so you do not need to [[at-m42:labs:setup#Install Groovy|Groovy first]]! | * [[at-m42:labs:setup#Install Grails|Step 1: Install and Configure Grails]] -- note Grails includes the run-time files for Groovy (''groovy-all-1.6.0.jar'') so you do not need to [[at-m42:labs:setup#Install Groovy|install Groovy]] first! |
* [[#Step 2: Create project]] | * [[#Step 2: Create project]] |
| * [[#Step 3: Run Application]] |
| * [[#Step 4: Create First Domain Class]] |
| * [[#Step 5: Add some properties and a Controller]] |
| * Further steps ... to be written! |
| |
An index to the source code for all the examples in this case study is [[/~eechris/at-m42/Case-Studies/case-study-05|available]]. | An index to the source code for all the examples in this case study is [[/~eechris/at-m42/Case-Studies/case-study-05|available]]. |
**Figure 2**: The files generated by ''grails create-app'' | **Figure 2**: The files generated by ''grails create-app'' |
| |
| An explanation of what all these files are is shown in Table 1. |
| |
| *Table 2*: Directory structure of the ''game'' project (reproduced from //Groovy in Action//, Table 16.1 ) |
| |
| ^ Directory ^ Content ^ |
| | ''grails-app'' | The grails-specific part of the web application | |
| | <html>––</html>''conf'' | Configuration data sources and bootstrapping | |
| | <html>––</html>''controllers'' | All Grails controllers; initially empty | |
| | <html>––</html>''domain'' | All Grails domain classes (models); initially empty | |
| | <html>––</html>''i18n'' | Message bundles for internationalization | |
| | <html>––</html>''services'' | All Grails service classes; initially empty | |
| | <html>––</html>''taglib'' | All Grails tag libraries | |
| | <html>––</html>''views'' | All Grails views (GSP or JSP); initially empty | |
| | <html>––––</html>''layouts'' | All sitemesh layouts | |
| | ''grails-tests'' | All Grails unit tests; initially empty | |
| | ''hibernate'' | Optional Hibernate configuration and mapping files | |
| | ''lib'' | Additional libraries as jar files | |
| | ''spring'' | Spring configuration file(s) | |
| | ''src'' | | |
| | <html>––</html>''groovy'' | Additional Groovy sources; initially empty | |
| | <html>––</html>''java'' | Additional Java sources; initially empty | |
| | ''web-app'' | Web application document root directory | |
| | <html>––</html>''css'' | Resource directory for Cascading Style Sheets | |
| | <html>––</html>''images'' | Resource directory for images | |
| | <html>––</html>''js'' | Resource directory for JavaScript files | |
| | <html>––</html>''WEB-INF'' | J2EE meta information (web.xml, and so on) | |
| | <html>––––</html>''classes'' | Target for compiled classes; initially empty | |
| | <html>––––</html>''tld'' | Resource directory for compiled tag libraries | |
| ==== Step 3: Run Application ==== |
| |
| <cli prompt=">"> |
| e:\dev\at-m42-2009\Case-Studies\case-study-05\game>grails run-app |
| Welcome to Grails 1.1 - http://grails.org/ |
| Licensed under Apache Standard License 2.0 |
| Grails home is set to: d:\java\applications\grails-1.1 |
| |
| Base Directory: E:\dev\at-m42-2009\Case-Studies\case-study-05\game |
| Running script d:\java\applications\grails-1.1\scripts\RunApp.groovy |
| Environment set to development |
| [mkdir] Created dir: e:\home\cpjobling\.grails\1.1\projects\game\classes |
| [groovyc] Compiling 6 source files to e:\home\cpjobling\.grails\1.1\projects\game\classes |
| [mkdir] Created dir: e:\home\cpjobling\.grails\1.1\projects\game\resources\grails-app\i18n |
| [native2ascii] Converting 11 files from E:\dev\at-m42-2009\Case-Studies\case-study-05\game\grails-app\i18n to e:\home\cpjobling\.grails\1.1\projects\game\resources\grails-app\i18n |
| [copy] Copying 1 file to e:\home\cpjobling\.grails\1.1\projects\game\classes |
| [copy] Copied 2 empty directories to 2 empty directories under e:\home\cpjobling\.grails\1.1\projects\game\resources |
| Running Grails application.. |
| Server running. Browse to http://localhost:8080/game |
| </cli> |
| |
| Now connect to http://localhost:8080/game. |
| |
| {{:at-m42:casestudies:hello-grails.png|Hello Grails page.}} |
| |
| **Figure 3**: Welcome to Grails. |
| |
| ==== Step 4: Create First Domain Class ==== |
| |
| Run command ''grails creat-domain-class Item'' |
| <cli prompt=">"> |
| e:\dev\at-m42-2009\Case-Studies\case-study-05\game>grails create-domain-class Item |
| Welcome to Grails 1.1 - http://grails.org/ |
| Licensed under Apache Standard License 2.0 |
| Grails home is set to: d:\java\applications\grails-1.1 |
| |
| Base Directory: E:\dev\at-m42-2009\Case-Studies\case-study-05\game |
| Running script d:\java\applications\grails-1.1\scripts\CreateDomainClass.groovy |
| Environment set to development |
| Created DomainClass for Item |
| Created Tests for Item |
| e:\dev\at-m42-2009\Case-Studies\case-study-05\game> |
| </cli> |
| |
| Creates a domain class ''Item.groovy'': |
| <code groovy 1|Listing 2: Domain class Item.groovy (at-m42/Case-Studies/case-study-05/game/grails-app/domain/Item.groovy)> |
| class Item { |
| |
| static constraints = { |
| } |
| } |
| </code> |
| |
| It also creates a ''GroovyTestCase'' class: |
| <code groovy 1|Listing 3: Test class for domain class Item.groovy (at-m42/Case-Studies/case-study-05/game/test/unit/ItemTests.groovy)> |
| import grails.test.* |
| |
| class ItemTests extends GrailsUnitTestCase { |
| protected void setUp() { |
| super.setUp() |
| } |
| |
| protected void tearDown() { |
| super.tearDown() |
| } |
| |
| void testSomething() { |
| |
| } |
| } |
| </code> |
| |
| Unit test and integration tests can be run automatically from the command line using ''grails test-app''. This will run unit tests //and// integration tests and report the results, formatted in HTML, in ''game/test/reports/html/index.html''. With such great support, it'd be a crime not to write unit tests! |
| |
| ==== Step 4: Add some properties and a Controller ==== |
| |
| Each domain class is simply a Plain-Old-Groovy-Object with one major difference. If we add some properties, these will be automatically persisted to a database. |
| <code groovy 1|Listing 4: Item class with properties (at-m42/Case-Studies/case-study-05/game/grails-app/domain/Item.groovy)> |
| class Item { |
| |
| static constraints = { |
| } |
| |
| String name |
| String description |
| Integer weight |
| |
| String toString() { return "${name}" } |
| } |
| </code> |
| |
| If we now add a controller, we will be able to create some objects via the web interface. |
| <cli prompt=">"> |
| e:\dev\at-m42-2009\Case-Studies\case-study-05\game>grails create-controller Item |
| |
| Welcome to Grails 1.1 - http://grails.org/ |
| Licensed under Apache Standard License 2.0 |
| Grails home is set to: d:\java\applications\grails-1.1 |
| |
| Base Directory: E:\dev\at-m42-2009\Case-Studies\case-study-05\game |
| Running script d:\java\applications\grails-1.1\scripts\CreateController.groovy |
| Environment set to development |
| Created Controller for Item |
| [mkdir] Created dir: E:\dev\at-m42-2009\Case-Studies\case-study-05\game\grails-app\views\item |
| Created Tests for Item |
| e:\dev\at-m42-2009\Case-Studies\case-study-05\game> |
| </cli> |
| |
| As you can see this creates a new controller |
| <code groovy 1|Listing 5: ItemController class (at-m42/Case-Studies/case-study-05/game/grails-app/controllers/ItemController.groovy)> |
| class ItemController { |
| |
| def index = { } |
| } |
| </code> |
| It also creates another ''GroovyTestCase'', ''ItemControllerTests'', for testing the ''ItemController'', and an empty folder for ''Item'' //views// (''game/grails-app/views/item''). |
| |
| Before we use this, we'll make Grails generate the necessary views "on-the-fly" by replacing ''def index = {}'' with ''def scaffold = Item'': |
| <code groovy 1|Listing 6: ItemController class with dynamic scaffolding (at-m42/Case-Studies/case-study-05/game/grails-app/controllers/ItemController.groovy)> |
| class ItemController { |
| |
| def scaffold = Item |
| } |
| </code> |
| |
| I found that at this step, I had to stop the running grails application, run ''grails clean'' then restart the server! |
| |
| After this runs, you will be able to browse to http://localhost:8080/game/item/list and start adding, editing and deleting items. All the necessary view code is generated automatically for you by Grails at run-time. |
---- | ---- |
| |
[[at-m42:home|Home]] | [[at-m42:lectures|Lectures]] | [[at-m42:casestudies:cs04|Previous Case Study]] | [[at-m42:casestudies|Case Studies]] | [[at-m42:home|Home]] | [[at-m42:lectures|Lectures]] | [[at-m42:casestudies:cs04|Previous Case Study]] | [[at-m42:casestudies|Case Studies]] |