Grails 快速入门

Grails 快速入门

下面就开始演示 Grails 的安装以及如何用 Grails 迅速的开发一个最简单的应用程序。

安装 Grails

首先从 Grails.org 上下载 Grails 安装程序(目前最新版本是 1.0RC1),将压缩包解压到硬盘上,并设置环境变量 GRAILS_HOME 为解压的路径。


图 1. 设置 GRAILS_HOME 环境变量
图 1. 设置 GRAILS_HOME 环境变量

然后把 %GRAIS_HOME%\bin 加到 System 的 Path 变量中。


图 2. 设置 Path 环境变量
图 2. 设置 Path 环境变量

在控制台下输入 grails help,如果能看到 Grails 的命令列表,Grails 的安装配置就算成功了。


图 3. 检验 Grails 是否安装成功
图 3. 检验 Grails 是否安装成功

创建一个 Grails 应用程序

创建 Grails 应用程序需要使用 grails create-app 命令,在控制台输入:

grails create-app Contact

Grails 会为我们创建一个名叫“Contact”文件夹,并在其中生成一个应用程序框架,生成的应用程序目录结构如下:


表 1. Contact 应用文件目录结构
Contact 
+grails-app 
 +conf存放配置信息,包含数据源、应用程序启动时自动执行的类 ApplicationBootStrap.groovy, Url 映射配置
 +controller存放控制器(“MVC”的“C”)
 +domain存放域类(“MVC”的“M“)
 +i18n存放国际化资源文件
 +services存放 service 类
 +taglib存放标签库类
 +views存放视图模版(“MVC”的 V,每个控制器对应一个文件夹并存放在 Views 中,每个文件夹中会有多个 GSP 页面)
  +layouts存放布局模板
+grails-tests存放测试代码
+hibernate存放可选的其它 Hibernate 配置文件
+lib存放其它 Jar 包(如 JDBC 驱动等)
+spring存放可选的 Spring 配置文件
+src 
 +java存放 Java 源程序
 +groovy存放 Groovy 源程序
+web-app 
 +css存放 CSS 样式表
 +images存放图片文件
 +js存放 JavaScript 文件
 +WEB-INF存放部署相关的文件
 +index.gsp应用程序的首页

从上述目录结构可以看出 Grails 的“约定优于配置”设计理念,它约定了不同层次代码存放的位置以及项目的组织方式,这既提供了一种最佳实践,同时也节省了开发人员配置项目的精力。

添加 Domain Class

接下来,为刚创建好的项目添加一些功能。首先创建两个 Domain Class。前面说过,Domain Class 实质上是数据库表映射的实体类。通过控制台,进入项目的根文件夹(注意:本文出现一切的控制台输入,除 create-app 外,都需要在项目文件夹中执行),输入 grails create-domain-class Team


图 4. 创建 Domain Class
图 4. 创建 Domain Class

新创建的 Domain 类出现在了 grails-app/domain 文件夹中,同时 Grails 还创建了相应的 Test 类。用记事本打开 grails-app\domain 文件夹中的 Team.groovy,加入如下内容:

class Team { 
    String teamName
    Date foundDate
}

这两行代码描述了 Team 所包含的属性,从代码中可以看出 Groovy 语言的一些特点:

  1. 无需“;”结尾(有“;”也不会报错);
  2. 简单数据类型,与 Java 相同;

创建 Controller

接下来为 Domain Class Team 类创建 Controller,在控制台输入 grails create-controller Team,Grails 会在 grails-app/controller 中创建一个名为 TeamController 的类。编辑 TeamController.groovy 文件。加入如下代码:

class TeamController {
    def scaffold = Team
}

不要小看这仅有的一行代码,它使 Team 表有了相应的 CRUD(增、删、查、改)功能的页面。在控制台中输入 grails run-app,运行应用以查看效果:


图 5. Team list page
图 5. Team list page

图 6. Show Team page
图 6. Show Team page

图 7. Edit team page
图 7. Edit team page

一些疑问

前面的例子演示了如何使用 Grails 快速开发一个应用。如果使用 Struts 之类的 Java Web 框架开发一个类似上述的功能可能要花几个小时的时间,而使用 Grails 只用了不到五分钟可以完成了创建。对 Grails 的“快”您应该有了一个比较直观的感受了吧?

虽然现在程序已经实现了对 Team 表的 CRUD 操作,但读者可能会有如下的几个疑问:

  1. 数据库在哪?
  2. 如何修改页面的外观?
  3. URL 与 Controller 的对应关系是什么?
  4. 表单能做验证吗?

下面,我们将对这几个问题加以解答,并给应用程序加入一些新的功能。


配置数据库

实现了 CRUD,为什么没有配置数据库呢?

Grails 为用户提供的一个内置的轻量级数据库 hsqldb,虽然在性能和功能上难以满足要求,但是对于演示 scaffold 还是绰绰有余的。当然,我们可以用 MySQL 去替换它,下面就来演示这个过程(如果读者不想使用 MySQL 去替换 hsqldb,可以跳过下面的内容)。

首先修改 grails-app\conf\DataSource.groovy:

dataSource {
    pooled = false
    driverClassName = "com.mysql.jdbc.Driver"
    username = "root"
    password = "***"
}
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 = "update" // one of 'create', 'create-drop','update'
            url = "jdbc:mysql://localhost:3306/Contact_dev"
        }
    }
    test {
        dataSource {
            dbCreate = "update"
            url = "jdbc:mysql://localhost:3306/Contact_test"
        }
    }
    production {
        dataSource {
            dbCreate = "update"
            url = "jdbc:mysql://localhost:3306/Contact_prod"
        }
    }
}

Grails 默认要求提供三个数据库,分别用于开发、测试和产品环境。修改连接的 Driver 名称、用户名密码以及三个数据库的URL,保存。接下来分别创建上述三个数据库,并把 MySQL 的 JDBC 驱动程序拷贝到 lib 文件夹中。

接下来,重新运行项目(grails run-app),Grails 会自动为 Domain Class 创建相应的数据库表。至此,Team 的 CRUD 程序就运行在 MySQL 之上了。


修改页面外观

使用 scaffold 实现的 CRUD 实际上并没有创建 GSP 页面,所以无法定制 View 内容。在 Grails 中,可以使用 grails generate-all 命令为指定的 Domain Class 创建实现 CRUD 操作的 Controller 和 View。所以,在控制台运行(如果提示 TeamController 已存在,是否覆盖?请选"是"):

grails generate-all Team

Grails 会在 grails-app\views\ 目录中创建一个名叫 team 的文件夹,文件夹的名称刚好和 controller 一一对应。team 文件夹中包含了 4 个 GSP 文件,分别是 create.gsp、list.gsp、edit.gsp 和 show.gsp。这几个页面和之前 scaffold 实现的功能是一致的。修改这几个页面的代码,即可以定制页面的外观。


URL 与 Controller 的命名约定

打开 generate-all 命令产生的 Controller 即 TeamController.groovy 文件,可以看到如下内容:

 class TeamController {
    
    def index = { redirect(action:list,params:params) }

    // the delete, save and update actions only accept POST requests
    def allowedMethods = [delete:'POST', save:'POST', update:'POST']

    def list = {
        if(!params.max) params.max = 10
        [ teamList: Team.list( params ) ]
    }

    def show = {
        [ team : Team.get( params.id ) ]
    }
…
 

其中 def xxx = {xxx} 的结构在 Groovy 语言中叫闭包(Closure),在 Controller 中,每个闭包对应为一个 Action,即处理一个特定的 Web 请求。然后看看 Grails URL 的命名原则:

http(s)://host:pot/ProjectName/ControllerName/ActionName/Parameters

如果请求的 URL 是 http://localhost:8080/Contact/team/list,即调用了 team 控制器的 list Action,对应将会触发 TeamController 的 list 闭包的执行。每个 Action 被执行完毕后,会默认跳转去执行它在 View 中同名的 GSP 页面。并把 Action 返回的数据传递给 GSP。比如这个例子中,list Action 执行完毕后,会跳转到 grails-app\views\team\list.gsp 视图,并把 Team.list(params) 的结果传递给 list.gsp,在 list.gsp 中可以通过 teamList 访问到 Controller 传递过来的数据。


表单的验证

Grails 对表单的验证提供了强大的支持,可以使用 Domain Class 的验证来实现表单的验证。修改 Team.groovy 文件:

class Team { 
    String teamName
    Date foundDate
    static constraints = {
        teamName(size:3..50,blank:false,unique:true)
    }
}

Team 类中加入个名叫 constraints 的静态 Closure,并在其中描述验证逻辑:team 的字符串长度在 3~50 之间、不能为空、而且是唯一的。(注意早期版本的 Grails 使用 length 限定字符串的长度,在 V0.5 以后改为了 size

保存 Team.groovy,重新运行 Contact,会发现验证逻辑已经可以工作了:


图 8. 表单验证
图 8. 表单验证

但验证失败后报出的错误信息对用户来说并不友好。想要修改这些内容,需要编辑 grails-app\i18n 中的资源文件,这在后面还会做详细介绍。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值