第一步、新建项目:
注意选对grails的版本即可。如果你只装了一个版本的grails,那用默认的即可。
这里我们实现一个对图书的增,删,改。
2、配置数据库连接。
打开conf/DataSource.groovy,改成这样:
dataSource {
pooled = true
driverClassName = "org.h2.Driver"
username = "sa"
password = ""
}
hibernate {
cache.use_second_level_cache = true
cache.use_query_cache = false
cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory'
}
// environment specific settings
environments {
development {
dataSource {
dbCreate = "update" // one of 'create', 'create-drop', 'update', 'validate', ''
driverClassName = "org.postgresql.Driver"
//url = "jdbc:postgresql://192.168.1.203:5432/labdb"
url = "jdbc:postgresql://localhost:5432/Test"
dialect = "org.hibernate.dialect.PostgreSQLDialect"
username="root"
password="123456"
logSql = true
}
}
test {
dataSource {
dbCreate = "update"
url = "jdbc:h2:mem:testDb;MVCC=TRUE;LOCK_TIMEOUT=10000"
}
}
production {
dataSource {
dbCreate = "update"
url = "jdbc:h2:prodDb;MVCC=TRUE;LOCK_TIMEOUT=10000"
pooled = true
properties {
maxActive = -1
minEvictableIdleTimeMillis=1800000
timeBetweenEvictionRunsMillis=1800000
numTestsPerEvictionRun=3
testOnBorrow=true
testWhileIdle=true
testOnReturn=true
validationQuery="SELECT 1"
}
}
}
}
当然,不修改也可以。grails会使用自己带的数据库h2(纯java的内存数据库)。我这里用的是postgresql。所以改了。可以看到这里有3个环境变量development、test、production。在启动项目时,可以通过-Dgrails.env=xx来进行选择。程序启动命令如下:
grails [env]* run-app例子 grails -Dgrails.env=development run-app。
注意:grails run-app默认使用环境变量development。
命令行输入在这:
3、引入数据库驱动包:postgresql-9.1-902.jdbc4.jar
复制jar包到lib目录下,add to build path,右键-〉grails tools-〉Refresh Dependencies(也可以用命令refresh-dependencies来实现)。
4、新建Domain类。
两种方式:(1)通过命令:create-domain-class Book(2)右键-〉New-〉Domain Class
Book代码如下:
package xmt.test
class Book {
String title
String content
}
5、创建controller和views:两种方式(1)选中Book类,右键-〉new-〉Generate Controller and Views (2)命令grails generate-all xmt.test.Book
grails会自动创建Controller(会自动生成增、删、改、查的相关方法)和View(会自动生成增、删、改、查的相关页面)
BookController:
package xmt.test
import org.springframework.dao.DataIntegrityViolationException
class BookController {
static allowedMethods = [save: "POST", update: "POST", delete: "POST"]
def index() {
redirect(action: "list", params: params)
}
def list(Integer max) {
params.max = Math.min(max ?: 10, 100)
[bookInstanceList: Book.list(params), bookInstanceTotal: Book.count()]
}
def create() {
[bookInstance: new Book(params)]
}
def save() {
def bookInstance = new Book(params)
if (!bookInstance.save(flush: true)) {
render(view: "create", model: [bookInstance: bookInstance])
return
}
flash.message = message(code: 'default.created.message', args: [message(code: 'book.label', default: 'Book'), bookInstance.id])
redirect(action: "show", id: bookInstance.id)
}
def show(Long id) {
def bookInstance = Book.get(id)
if (!bookInstance) {
flash.message = message(code: 'default.not.found.message', args: [message(code: 'book.label', default: 'Book'), id])
redirect(action: "list")
return
}
[bookInstance: bookInstance]
}
def edit(Long id) {
def bookInstance = Book.get(id)
if (!bookInstance) {
flash.message = message(code: 'default.not.found.message', args: [message(code: 'book.label', default: 'Book'), id])
redirect(action: "list")
return
}
[bookInstance: bookInstance]
}
def update(Long id, Long version) {
def bookInstance = Book.get(id)
if (!bookInstance) {
flash.message = message(code: 'default.not.found.message', args: [message(code: 'book.label', default: 'Book'), id])
redirect(action: "list")
return
}
if (version != null) {
if (bookInstance.version > version) {
bookInstance.errors.rejectValue("version", "default.optimistic.locking.failure",
[message(code: 'book.label', default: 'Book')] as Object[],
"Another user has updated this Book while you were editing")
render(view: "edit", model: [bookInstance: bookInstance])
return
}
}
bookInstance.properties = params
if (!bookInstance.save(flush: true)) {
render(view: "edit", model: [bookInstance: bookInstance])
return
}
flash.message = message(code: 'default.updated.message', args: [message(code: 'book.label', default: 'Book'), bookInstance.id])
redirect(action: "show", id: bookInstance.id)
}
def delete(Long id) {
def bookInstance = Book.get(id)
if (!bookInstance) {
flash.message = message(code: 'default.not.found.message', args: [message(code: 'book.label', default: 'Book'), id])
redirect(action: "list")
return
}
try {
bookInstance.delete(flush: true)
flash.message = message(code: 'default.deleted.message', args: [message(code: 'book.label', default: 'Book'), id])
redirect(action: "list")
}
catch (DataIntegrityViolationException e) {
flash.message = message(code: 'default.not.deleted.message', args: [message(code: 'book.label', default: 'Book'), id])
redirect(action: "show", id: id)
}
}
}
Book views:
OK,到这里,一个图书的最基本的模块就开发完了。是不是很简单。
启动程序grails run-app。访问 http://localhost:8080/Test。点击xmt.test.BookController。Book的列表,增、删、改都有了。你可以根据自己的需要进行修改。
以上是最简单的一个例子,意在说明grails项目开发的基本流程。做j2ee的都应该有感受,项目中这种数据的增删改查操作占了很大的比例。有一些简单的项目甚至90%的功能都是这个。有了grails,你就能从这种重复,繁琐的劳动中解脱出来了。
以后我主要会记录我开发中遇到的各种问题和难点,让我费了不少时间的东西,遇到同样问题的朋友就不用再费劲了。而不会介绍如何使用grails,这些你都可以在官方文档上看到,grails的官方文档很不错,你不需要都看,用到什么看什么。官方文档在这:http://grails.org/doc/latest/guide/index.html