`

Groovy语言 Grails框架入门

阅读更多
掌握基本的 Grails 开发技术,并能够进一步独立学习 Grails 的高级功能。

Grails 是搭建在动态语言 Groovy 之上的一个开源 MVC Web 开发框架,Grails 的一个显著特点在于“快”,这主要得益于 Groovy 脚本语言的动态特性,也得益于其“一栈式”的设计。与传统的 Java/C# Web 开发框架相比,它可以使用极少的代码和配置实现诸如表单提交、数据库读写等常见的 Web 应用功能,实现了开发效率的成倍提高。

与它的老师 Ruby on Rails 相比,Grails 的优势在于 Groovy 语言与 Java 平台的紧密集成。一方面 Groovy 在语法上与 Java 十分相似,降低了众多的 Java 程序员学习 Grails 的门槛。另一方面,Groovy 本身运行于 JVM 之上,可以直接调用 Java 代码,实现了与 Java 平台的完美整合,因此可以将 Grails Web 应用运行在成熟可靠的 Java EE 应用服务器之上。

Grails 是一个遵循 MVC 设计模式的 Web 开发框架。它分别用 Domain Class、View、Controller 对应于 MVC 的模型、视图和控制器。可以简单的把一个 Domain Class 理解为数据库中的一张表,Grails 在底层通过 Hibernate 将 Domain Class 和数据库的表进行了映射。View 在 Grails 中指的是 GSP 页面(注意是 GSP 不是 JSP),它用于显示用户界面。GSP 与 JSP 类似,既可以编写静态网页的元素,也可以嵌入 Groovy 代码实现动态内容。Controller 在 Grails 中充当着重要的角色:它可以响应用户的请求,可以接收用户提交的表单,还可以访问模型的数据,并传递给 View。Grails 在 MVC 三方面的具体内容,将在后面的例子中做详细介绍。


学习Grails应该具备的预备知识:
1:    熟练使用常见的 HTML 标签;
2:    有一定的 Web 开发基础(理解表单提交 POST/GET 、理解会话);
3:    Java 语言或者 Groovy 语言的基础;
4:    Hibernate(非必需);

1:首先从http://www.grails.org/  上下载 Grails 安装程序(目前最新版本是 grails-1.3.7),将压缩包解压到硬盘上,并设置环境变量 GRAILS_HOME 为解压的路径。
2:设置 GRAILS_HOME 环境变量,然后把 %GRAIS_HOME%\bin 加到 System 的 Path 变量中。
3:在控制台下输入 grails help,如果能看到 Grails 的命令列表,Grails 的安装配置就算成功了。

Groovy 语言的一些特点:
1:   无需“;”结尾(有“;”也不会报错);
2:   简单数据类型,与 Java 相同;

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

表 1. Contactsyc 应用文件目录结构
Contactsyc  
+ 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 应用程序的首页


2:添加 Domain Class (Team.groovy)
前面说过,Domain Class 实质上是数据库表映射的实体类。
domain 文件夹中的 Team.groovy,加入如下内容:
class Team {
    String teamName
    Date foundDate
}
这两行代码描述了 Team 所包含的属性,从代码中可以看出 Groovy 语言的一些特点:

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

3:创建 Controller

接下来为 Domain Class Team 类创建 Controller,在 grails-app/controller 中创建一个名为 TeamController 的类。
加入如下代码:

class TeamController {
    def scaffold = Team
}

4:不要小看这仅有的一行代码,它使 Team 表有了相应的 CRUD(增、删、查、改)功能的页面。 运行contractsyc,就可以看到效果。


练习过程中可能会有如下的几个疑问:
    1:    数据库在哪?
    2:    如何修改页面的外观?
    3:    URL 与 Controller 的对应关系是什么?
    4:    表单能做验证吗?
下面,将对这几个问题加以解答,并给应用程序加入一些新的功能。

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

首先修改 grails-app\conf\DataSource.groovy:
修改前(默认):
dataSource {
    pooled = true
    driverClassName = "org.hsqldb.jdbcDriver"
    username = "sa"
    password = ""
}
hibernate {
    cache.use_second_level_cache = true
    cache.use_query_cache = true
    cache.provider_class = 'net.sf.ehcache.hibernate.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:hsqldb:file:prodDb;shutdown=true"
        }
    }
}

修改后(mysql):
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 中,可以为指定的 Domain Class 创建实现 CRUD 操作的 Controller 和 View。

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


URL 与 Controller 的命名约定:
1:打开 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,会发现验证逻辑已经可以工作了.

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














    List result = null;
        List paramList = new ArrayList();
        StringBuffer sql = new StringBuffer();
        String overallQuery = generateQuery(productList.get(0));
        sql.append(overallQuery);
        sql.append("(" + NEWLINE);


URL 与 Controller 的命名约定:
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 传递过来的数据。
分享到:
评论
1 楼 xyq1558 2012-03-30  
刚刚接触grails,学习了

相关推荐

    Grails入门指南-中文版

    Grails框架的代码贡献人Jason Rudolph为您带来这一用于快速Web开发的开源框架的介绍。该框架基于Groovy编程语言,并构建于Spring、Hibernate和其它标准Java框架之上,从而使之成为一套能带来超高生产力的一站式框架...

    Grails-开源框架---使用指南.pdf与Groovy入门经典(中文).pdf(2合一)

    Grails-开源框架---使用指南.pdf与Groovy入门经典(中文) ,2本书生成Grails代码骨架,用Groovy开发,同时兼容JAVA语言

    Grails1.1中文文档

    当今的Java Web开发技术显得过于复杂,相对于它本身的需要来说。现在主流的Java Web框架也是异常复杂,而且没有很好的遵循 Don't Repeat ...本文档将带你从Grails入门开始,最终能够使用Grails框架建设Web应用程序。

    Grails入门指南 中文版

    Grails是一套用于快速Web应用开发的开源框架,它基于Groovy编程语言,并构建于Spring、Hibernate和其它标准Java框架之上,从而为大家带来一套能实现超高生产力的一站式框架。 本书作者 Jason Rudolph 译者 陈俊 林...

    Getting-Started-with-Grails-Chinese.rar_Getting Started_grails

    基于java的动态语言Groovy 构建的敏捷web开发框架grails经典入门教程

    Grails入门指南 gswg_source

    Grails是一套用于快速开发Web应用系统的框架,基于Groovy动态语言。并构建在开源技术如:Spring,Hibernate和SiteMesh之上。

    Grails入门指南_源代码_part2

    Grails入门指南_源代码_part2 http://download.csdn.net/source/309290

    Grails入门指南_源代码_part1

    Grails入门指南_源代码_part1 http://download.csdn.net/source/309290

    grails-data-mapping:GORM-Groovy对象映射

    [Grails] [Grails]是用于使用[Groovy] [Groovy]编程语言构建Web应用程序的框架。 该项目为Hibernate和NoSQL数据存储上的GORM的新实现提供了GORM API管道。 [Grails]: : [Groovy]: : 入门 有关更多信息,请参见...

    grails-core:Grails Web应用程序框架

    是用于使用编程语言构建Web应用程序的框架。 核心框架是非常可扩展的,并且有许多可用的,可以轻松集成附加功能。 Grails由位于密苏里州圣路易斯的赞助。 请联系以获取支持查询。 入门 您需要安装Java开发工具包...

    LittleGoblin:用Grails编写的浏览器游戏框架

    Little Goblin v 0.5.2的发行说明Little Goblin是一个使用Graovy,Java和JavaScript用Grails框架编写的浏览器游戏框架。 它包括一个用于测试和演示的参考实现,它将创建一个基本的可用游戏环境,如上的测试服务器所...

    gmock:自动从code.google.compgmock导出

    Gmock是Groovy语言的模拟框架。 Gmock只是关于测试的简单语法和可读性,因此您可以花更少的时间学习框架,而可以花更多的时间编写代码。 要使用Gmock,只需将gmock jar文件放在类路径中即可。 当前版本是gmock-...

    micro:使用由 Spring Boot 提供支持的经过身份验证、Angular 可调用的 JSON REST 微服务

    我不想提前拆散我的应用程序,而是想尝试 Spring Boot 的一些特性,我认为它是微服务开发的一个很好的框架。 这个入门项目就是尝试这样做的。 愿望清单 这是我想开发的微服务类型: 常规代码 休息API JSON 格式 ...

Global site tag (gtag.js) - Google Analytics