Grails框架的敏捷开发详解与实践

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:Grails框架基于Groovy语言,借鉴Ruby on Rails的理念,提供了强大的Web应用开发能力。它集成了GORM进行数据库操作,并使用GSP作为视图技术。本文将指导读者完成Grails的安装、应用程序创建、核心概念理解、安全性配置、插件使用以及服务部署等敏捷开发关键步骤。通过实践学习Grails,开发者能够快速提高Web开发的效率和质量。 grails

1. Grails框架概述

Grails框架是一个开源的、高度约定的全栈框架,基于Groovy语言,运行在Java平台上。它为开发者提供了一个构建具有复杂功能的、高性能的Web应用的快捷方式。Grails的构建基于“约定优于配置”的原则,简化了配置,促进了开发效率的提升。核心特点包括快速应用开发(RAD)、依赖注入、约定优于配置等,这些特性共同为现代Web应用的开发提供了强大的支撑。

接下来的章节将对Grails进行详细介绍,包括环境的配置、应用程序的创建、核心概念的理解、数据库操作的介绍、GSP页面的应用、安全性实现、插件系统应用、服务层的定义和部署等。通过深入浅出的分析和实践操作,帮助读者快速掌握Grails框架,提高开发效率和质量。

2. Grails安装与配置

2.1 Grails环境要求

在踏入Grails世界之前,了解和配置合适的环境是至关重要的。Grails构建在Groovy语言之上,是一个基于Spring和Hibernate的全栈框架。因此,对于Java虚拟机(JVM)环境的依赖是必不可少的。Grails也提供了一套简洁的命令行工具,用于应用程序的创建、管理和部署。为了充分使用Grails框架,你应当熟悉以下环境要求。

2.1.1 系统环境检查

Grails并不需要一个非常高配置的系统,但以下的最低环境要求是必须的:

  • Java 8或更高版本;
  • Maven 3.0或更高版本;
  • Git版本控制系统;
  • 网络连接用于下载依赖和插件。

你可以使用 java -version mvn -v git --version 等命令来检查你的系统是否满足这些条件。如果系统缺少相应的软件,你需要先安装它们。

2.1.2 安装SDKMAN!和Grails

接下来,我们需要安装SDKMAN!(Software Development Kit Manager),它是一个非常方便的命令行工具,用于安装和管理Java开发工具包、Maven、Gradle等多种SDK。

curl -s "***" | bash

安装SDKMAN!后,你需要重启终端或运行 source "$HOME/.sdkman/bin/sdkman-init.sh" 使安装生效。然后,你可以使用SDKMAN!来安装Grails:

sdk install grails

这样会安装最新版本的Grails。如果你需要安装特定版本,可以指定版本号:

sdk install grails 4.0.0

2.2 Grails的基本配置

2.2.1 配置项目结构

Grails项目具有特定的结构,对于新项目,这个结构会自动生成。但有时根据你的具体需求,你可能需要自定义或修改这个结构。通常,一个Grails项目有以下几个基本目录:

  • grails-app : 存放Grails的领域类、控制器、服务、标签库等。
  • src/java : 存放Java源代码。
  • src/groovy : 存放Groovy源代码。
  • src/conf : 存放配置文件。
  • web-app : 存放Web资源,如HTML、CSS、JavaScript文件。

你可以在 grails-app/init 目录中添加启动脚本(BootStrap.groovy),用于在应用启动时进行初始化操作。

2.2.2 设置运行环境

Grails默认的运行环境是开发环境,你可以通过 grails 命令行工具来设置不同的环境,例如生产环境:

grails prod run-app

对于环境的详细配置,可以在项目根目录下的 grails-app/conf 文件夹找到 application.groovy 文件进行编辑。这里你可以设置数据库连接、日志级别和其他应用相关的配置项。

2.2.3 配置插件和依赖

Grails的一个重要特性是插件系统。你可以通过在 grails-app/conf/BuildConfig.groovy 文件中添加插件依赖来安装和配置插件。下面是一个示例:

dependencies {
    compile "org.grails.plugins:cache:2.0.0"
    runtime "com.h2database:h2:1.3.176"
}

plugins {
    compile ":cache:2.0.0"
}

以上是对Grails安装和基本配置的概述。在这个阶段,你应当已经安装了Grails并且熟悉了如何配置和启动你的项目。接下来,我们将会看到如何使用Grails命令行工具创建我们的第一个应用程序,并深入理解项目结构。

3. 创建Grails应用程序

3.1 Grails项目的初始化

3.1.1 使用命令行创建项目

在开始编写代码之前,必须先创建一个新的Grails应用程序。Grails提供了一个命令行工具来帮助快速搭建项目结构。使用此工具,开发者可以避免手动设置项目目录和依赖配置,大幅提高开发效率。

创建一个新的Grails项目,需要使用 grails 命令行工具中的 create-app 命令,如下所示:

grails create-app my-new-app

其中 my-new-app 是新创建项目的名称,可以根据实际情况进行更改。此命令会生成一个基本的项目骨架,包含所有必须的目录结构和初始化脚本。

Initialized Grails application in /path/to/my-new-app...

上述命令执行完成后,会输出初始化成功的信息,并显示出项目的路径。接下来,进入项目目录,可以查看其结构和内容。

cd my-new-app

3.1.2 项目结构解析

Grails项目目录结构遵循一种约定优于配置的原则,因此大多数子目录和文件都有特定的用途和命名规则。下面是项目目录的主要组成部分:

  • grails-app - 包含Grails源代码的主要目录,分为多个子目录,如 controllers , domain classes , services 等。
  • conf - 包含项目的配置文件,如 grails-app/conf/Config.groovy application.yml
  • src - 除了 grails-app 目录之外,其他源代码,如 Java 源代码和资源文件。
  • web-app - Web 应用目录,包含 web.xml 和静态资源目录 images , javascripts , css 等。
  • plugins - 存放项目依赖的插件。

具体来说, grails-app 目录包含了项目的核心源代码和配置,是大多数开发活动发生的场所。 controllers 目录包含了控制器类, domain classes 目录包含了域类, services 目录包含了业务逻辑服务。

了解项目结构之后,接下来可以定义域类以及创建控制器和服务,这些组件构成了应用程序的业务逻辑和数据访问层。

class User {
    String username
    String password
    // 其他属性和方法
}

在接下来的小节中,我们将详细探讨如何在Grails中创建和管理域类,以及如何自动生成控制器和服务来加速开发进程。

3.2 Grails域类的创建与管理

3.2.1 定义域类

在Grails中,域类通常是数据库中的表对应的一个类,用于表示应用程序中要处理的数据模型。域类在 grails-app/domain 目录下定义,并遵循约定的命名规范。

class Product {
    String name
    BigDecimal price
    Date releaseDate
    static constraints = {
        name blank: false
        price min: 0.01
    }
}

在上面的例子中, Product 类定义了三个属性: name , price , releaseDate 。此外,使用了 static constraints 来定义一些验证规则。这些约束确保数据的完整性和准确性。

3.2.2 域类与数据库映射

Grails 的数据映射主要由 GORM (Grails Object-Relational Mapping) 完成。GORM 自动将 Java 或 Groovy 类映射到关系型数据库中的表,并提供了一个对象式的数据访问接口。

Product 域类中,我们定义了三个属性,GORM 会自动根据属性类型和命名生成 SQL 语句,并进行数据的 CRUD (创建、读取、更新、删除) 操作。

GORM 的默认数据库映射规则通常不需要开发者手动指定,它默认遵循 Java 类到数据库表的映射约定。如果需要定制映射,可以通过一些元注解来实现,如:

class User {
    String login
    String passwordHash

    static mapping = {
        table 'users'
        passwordHash column: 'password'
    }
}

上面的例子中,我们定制了 User 域类的映射规则,使其映射到数据库中的 users 表,并自定义了 passwordHash 属性映射到 password 列。

通过简单的域类定义,Grails 应用程序可以创建和管理复杂的数据模型,并执行基本的数据库操作。这种自动映射能力显著减少了数据库操作的手动编码工作,让开发者能够专注于业务逻辑的实现。

域类是构成Grails应用核心的数据模型。接下来,我们将讨论如何自动生成控制器和服务,进一步推动开发进度并提高效率。

4. Grails核心概念掌握

4.1 Grails的约定优于配置

4.1.1 代码约定的理解

Grails框架遵循“约定优于配置”(Convention over Configuration, CoC)的设计哲学,这意味着开发者需要遵循一套约定俗成的规则,从而减少项目的配置负担。这种设计使得开发者能够专注于业务逻辑的实现,而不是繁琐的配置工作。在Grails中,这些约定包括项目结构、文件命名、类和方法的定义等。

为了理解这些约定,开发者首先需要熟悉Grails项目的默认目录结构,包括 grails-app 目录用于存放源代码, views 目录用于存放GSP视图文件, conf 目录用于存放配置文件等。遵循这些约定,可以使得Grails能够自动地识别和加载资源,无需手动配置。

4.1.2 自定义约定规则

虽然Grails提供了丰富的默认约定,但有时候项目有特定需求,这时候就需要自定义一些规则。Grails允许开发者通过创建配置文件来修改或扩展这些约定。例如,可以通过 grails-app/conf/Config.groovy 文件来修改域类(Domain Class)和控制器(Controller)的默认命名约定。

此外,Grails允许通过编写插件来创建更高级的约定。通过插件,开发者可以为整个项目或特定项目添加新的约定,例如扩展项目结构、添加新的领域类基类或控制器基类等。创建这样的插件不仅可以使得开发更符合项目特定需求,还可以通过插件分享这些约定给其他项目或开发者。

代码块 - 自定义Grails约定配置示例

// Config.groovy
grails.databinding.dateFormats = ['yyyy-MM-dd', 'yyyy/MM/dd HH:mm:ss']

// 自定义领域类命名约定
grails.gorm.default.packages = {
    domain 'com.mycompany.project'
}

// 自定义插件结构
grails.plugin.location.'my-custom-plugin' = '../my-custom-plugin'

逻辑分析: 上述代码展示了如何在Grails的 Config.groovy 文件中自定义一些约定。第一行定义了数据绑定的日期格式。第二行设置了领域类的默认包名,使其符合项目结构。第三行则定义了一个自定义插件的位置,使Grails在启动时能够加载这个插件,并且应用该插件中的约定。

参数说明: - grails.databinding.dateFormats :定义了日期格式的约定,适用于日期类型的数据绑定。 - grails.gorm.default.packages.domain :修改了领域类的默认包结构。 - grails.plugin.location :指定了一个自定义插件的路径,这是在扩展约定时使用的一种高级特性。

通过这些自定义约定,Grails开发者可以灵活地适应各种不同的开发需求,同时保持项目的清晰和一致。

4.2 Grails的动态语言特性

4.2.1 Groovy语言基础

Grails是基于Groovy语言构建的,Groovy是一种动态类型、面向对象的语言,它运行在Java虚拟机(JVM)上,并且与Java语言完全兼容。Groovy的优势在于其简洁的语法和强大的元编程能力,这使得它特别适合用于构建脚本和快速开发应用程序。

在Grails中,Groovy的语法被广泛使用,包括使用动态方法调用、闭包(Closures)、元类操作等。例如,可以使用闭包来简化代码,而不需要编写大量的样板代码。闭包是Groovy中的第一类对象,它们可以被赋值给变量,存储在数据结构中,或者作为参数传递给其他方法。

4.2.2 动态类型与元编程

Groovy的动态类型系统允许在不声明变量类型的情况下编写代码,从而加快开发速度。在Grails中,这通常被用于更灵活的领域模型设计和数据库交互。动态类型也支持动态方法调用,这意味着可以在运行时定义和调用方法。

元编程是指编程语言自身具备编写或修改代码的能力。在Groovy中,可以通过元编程机制来扩展对象的能力。例如,可以在运行时向对象添加新的属性或方法。Grails中的一些特性,比如动态发现服务(Dynamic finders)和动态方法(Dynamic methods),就依赖于Groovy的元编程能力。

代码块 - 使用Groovy动态特性

class Book {
    String title
    String author
}

// 使用动态方法
def book = new Book(title: 'Grails Documentation')
book.save(failOnError: true)

// 使用闭包
Book.withTransaction {
    book.title = 'Updated Grails Documentation'
    book.save(failOnError: true)
}

// 动态方法调用
def newTitle = book.callAt('setTitle', 'The Grails Framework')

逻辑分析: 在这个代码块中,首先定义了一个简单的 Book 类。然后展示了如何使用Groovy的动态方法 callAt 来调用一个实例方法。接着,使用闭包和 withTransaction 方法来进行数据库事务处理,这说明了Groovy闭包的使用和事务管理的简洁性。最后,演示了如何使用动态方法保存书籍数据。

参数说明: - callAt :这是Groovy中的一个动态方法调用操作符,允许在运行时根据字符串名称调用实例方法。 - withTransaction :这是Grails提供的一个便捷方法,用于执行包含数据库操作的代码块,确保事务的完整性。

Groovy的这些动态特性是Grails框架强大灵活性和生产力的基础,开发者可以利用这些特性来编写简洁、可读性强的代码,并在项目中实现复杂的业务逻辑。

4.3 Grails的依赖注入

4.3.1 依赖注入的概念

依赖注入(Dependency Injection, DI)是一种设计模式,用于实现控制反转(Inversion of Control, IoC),它在Grails中扮演着核心角色。依赖注入允许对象定义它们所依赖的其他对象,而不是自己创建这些依赖。这样做的好处是提高了代码的模块化和可测试性,因为对象不需要知道其依赖项的实现细节。

在Grails中,依赖注入通过Spring框架实现。Spring的依赖注入容器负责管理应用程序中对象的创建和生命周期,并提供依赖项。这种设计也允许在不同的环境和测试中使用不同的实现,而不需要修改代码。

4.3.2 实现依赖注入的方法

Grails中实现依赖注入的方法有多种,最常用的是使用构造函数注入。在Grails控制器、服务或领域类中,可以定义一个或多个依赖项作为构造函数的参数。Spring容器在创建对象时会识别这些依赖并注入相应的对象。

另一种方法是通过属性注入,它允许通过setter方法为对象注入依赖项。这种注入方式通常用于初始化后不需要修改依赖的场景。此外,Grails还支持字段注入和方法注入,但这些使用得相对较少。

代码块 - Grails中的依赖注入示例

class MyService {
    def myDependency

    MyService(MyDependency myDependency) {
        this.myDependency = myDependency
    }

    void myMethod() {
        myDependency.doSomething()
    }
}

class MyDependency {
    void doSomething() {
        println "Doing something important."
    }
}

// 在Spring配置文件中声明依赖
beans = {
    myDependency(MyDependency)
    myService(MyService)
}

逻辑分析: 这个示例展示了如何在Grails应用中实现依赖注入。首先定义了一个 MyService 服务类,它依赖于 MyDependency 。通过构造函数注入, MyService 接受一个 MyDependency 实例作为参数。然后,在Spring的配置文件中声明了这两个类的实例,配置了它们之间的依赖关系。这样,Spring容器在创建 MyService 实例时,会自动注入 MyDependency 的实例。

参数说明: - MyService :服务类,依赖于 MyDependency 。 - MyDependency :被注入的依赖类,拥有一个 doSomething 方法。 - beans :这是在Grails应用中配置依赖关系的方式。

通过这种方式,Grails应用实现了松耦合的依赖管理,增强了代码的可维护性和可测试性。

5. GORM数据库操作介绍

在构建动态Web应用程序时,数据库操作是不可或缺的一部分。Grails框架通过其对象关系映射(ORM)层,即GORM(Grails Object Relational Mapping),简化了数据库访问和数据建模。GORM提供了接近自然语言的API,让开发者可以以对象的方式操作数据库,极大提升了开发效率和代码的可读性。本章将介绍GORM的基础使用、高级特性和实践案例分析。

5.1 GORM基础使用

GORM是Grails框架中的核心组件之一,提供了丰富的方法来实现数据持久化。它允许开发者使用Groovy语言编程,将对象映射到数据库表,进行增删改查操作。

5.1.1 GORM与数据库交互

GORM对多种数据库系统提供了良好的支持。开发者可以在Grails应用中通过简单的配置来连接MySQL、PostgreSQL、Oracle等不同的数据库系统。在Grails项目中,这一过程通常在 application.yml application.groovy 配置文件中完成。

grails {
    profile = 'web'
    codegen {
        defaultPackage = 'com.example.app'
    }
    gorm {
        reactor {
            // 启用响应式GORM特性
        }
    }
}

在上述配置中,Grails默认的GORM设置已经被调整,包括指定生成代码的默认包。同时,也展示了如何启用响应式GORM特性,这在使用现代微服务架构时特别有用。

5.1.2 GORM的CRUD操作

GORM提供了一整套的CRUD(创建、读取、更新、删除)操作方法。以下是使用GORM进行CRUD操作的简单示例:

class Book {
    String title
    Date dateCreated
    static mapping = {
        title_sqltype 'VARCHAR(100)'
    }
}

// 创建
def book = new Book(title: 'Grails 5 by Example')
book.save()

// 读取
Book book = Book.get(1)

// 更新
book.title = 'Updated Book Title'
book.save(flush: true)

// 删除
book.delete()

在本示例中,我们定义了一个 Book 类映射到数据库表。通过调用不同的方法如 save() , get() , delete() 来实现基本的数据库操作。 save(flush: true) 表示在内存中修改后的对象状态将被立即同步到数据库。

5.2 GORM高级特性

随着应用复杂度的增加,GORM也提供了更多高级特性来处理复杂的数据库操作需求。

5.2.1 关联映射与事务管理

GORM支持多种关联映射,比如一对多、多对多、一对一等关系,使得定义对象间的关系变得简单直观。同时,GORM的事务管理功能保证了数据的一致性和完整性。

class Author {
    String name
    static hasMany = [books: Book]
}

class Book {
    String title
    Author author
    static belongsTo = [author: Author]
}

在上面的例子中,我们定义了作者和书籍之间的“一对多”关系。每个 Author 可以有多个 Book ,而每本 Book 属于一个 Author

5.2.2 GORM查询语言(Groovy SQL)

除了GORM的高级查询API,Grails也提供了直接使用Groovy SQL的能力,这为复杂查询和数据库原生操作提供了灵活性。

def sql = new Sql(dataSource)
def books = sql.rows("SELECT * FROM book WHERE title = ?", ["Grails 5 by Example"])
books.each {
    println "${it.title}"
}

在这个例子中,我们直接使用 Sql 类执行了一个SQL查询,返回了一个包含查询结果的列表。这样的操作使得开发者可以利用自己对SQL语言的熟悉来执行复杂的查询操作。

5.3 GORM实践案例分析

为了更好地理解GORM的实际应用,下面通过两个案例进行详细分析。

5.3.1 实体关系映射案例

一个典型的实体关系映射案例是用户(User)和订单(Order)之间的“一对多”关系。在这个案例中,一个用户可以有多个订单。

class User {
    String username
    static hasMany = [orders: Order]
}

class Order {
    Date orderDate
    static belongsTo = [user: User]
}

通过这种映射,GORM帮助开发者轻松处理订单数据与用户数据之间的关联,并允许开发者通过简单的API进行复杂的数据操作。

5.3.2 数据库迁移与版本控制

随着应用的发展,数据库结构也会发生变化。GORM支持数据库迁移(migrations),允许开发者通过定义迁移脚本来管理数据库版本。

class V1__Create_Book {
    def向上兼容= 1
    def向下兼容= 0
    def description = "Create table for books"
    void change() {
        createTable {
            id column: 'id', type: 'INTEGER', primaryKey: true
            title column: 'title', type: 'VARCHAR(100)'
        }
    }
}

以上迁移脚本定义了如何创建一个新的 Book 表。每次数据库结构变化,只需添加新的迁移脚本即可。

通过GORM,Grails应用能够以极高的效率管理数据库交互,无论是简单的CRUD操作,还是复杂的事务管理和数据库迁移,GORM都能够提供强大的支持。

在本章中,我们对GORM的使用进行了全面的介绍,从基础的CRUD操作到高级的关联映射,再到实践案例的分析,每一部分都充分展示了GORM强大的功能和便捷性。作为Grails框架的核心组件,GORM无疑大大提升了开发者的生产力,使得数据库操作变得简单而高效。

6. 控制器与GSP应用

6.1 控制器的作用与实现

控制器是MVC架构中的核心组件之一,它是处理应用程序请求并返回响应给用户的中介。理解控制器的工作方式和生命周期是构建Grails应用程序的关键。

6.1.1 控制器的生命周期

在Grails中,控制器的生命周期由一系列预定义的方法组成,这些方法定义了从接收到请求到返回响应的整个过程。

class BookController {

    def index() {
        // 处理首页请求
    }

    def show() {
        // 处理显示单一书籍的请求
    }

    def create() {
        // 处理创建新书籍的请求
    }

    // 其他动作方法...
}

在上述代码中,我们定义了几个动作方法,例如 index show 。每个动作方法都代表了控制器对特定请求的响应。这些方法将在请求匹配时被调用,并且可以在其内部使用 params 对象来访问请求参数。

6.1.2 控制器中的动作方法

动作方法是处理用户请求的核心。在Grails控制器中,可以定义多个动作方法,每个方法对应一组逻辑以响应特定的请求。

def search() {
    def books = Book.where {
        title LIKE "%${params.searchTerm}%"
    }.list()

    [books: books]
}

search 动作方法中,我们使用了Groovy的闭包和动态查询功能来过滤 Book 域类中的记录。最后,我们通过模型传递找到的书籍列表到GSP页面。

6.2 GSP页面的设计与开发

GSP(Groovy Server Pages)是Grails中用于创建动态网页的技术,类似于JSP或***。

6.2.1 GSP标签库的使用

GSP标签库为页面开发提供了丰富的组件,这些组件可以简化页面的构建过程。

<html>
<head>
    <title>Book List</title>
</head>
<body>
    <g:each var="book" in="${books}">
        <p>${book.title} - ${book.author}</p>
    </g:each>
</body>
</html>

在上述GSP页面中,我们使用 <g:each> 标签来遍历 books 模型数据并显示每本书的标题和作者。

6.2.2 动态数据绑定与展示

GSP允许你在页面中使用Grails的动态方法,这样就可以更加灵活地将控制器中的数据展示在页面上。

<g:textField name="bookTitle" value="${bookInstance?.title}" />

在上面的代码中, <g:textField> 是一个标准的HTML文本输入框,它的值是由控制器传递过来的书籍标题。

6.3 控制器与GSP的协同工作

控制器与GSP之间的协同工作是通过模型数据完成的。控制器负责准备数据,然后将其传递给GSP页面进行展示。

6.3.1 请求处理流程

当一个请求到达Grails应用程序时,Grails会根据请求的URL确定调用哪个控制器和动作方法。动作方法执行完毕后,将模型数据和视图名称传递给Grails的响应机制。

6.3.2 表单数据处理与验证

控制器还负责处理来自表单的输入数据,包括数据验证。

def save() {
    def bookInstance = new Book(params)
    if(bookInstance.save(flush: true)) {
        redirect(action: "show", id: bookInstance.id)
    } else {
        render(view: "create", model: [bookInstance: bookInstance])
    }
}

save 动作方法中,我们尝试保存一个新的 Book 实例。如果保存成功,我们重定向到 show 动作方法。如果失败,我们重新渲染 create 视图,并带有模型数据,以便用户可以更正错误并重新提交。

通过上述章节的内容,我们看到了控制器与GSP协同工作的强大能力,以及如何通过Grails提供的工具和概念来实现复杂的Web应用功能。在下一章,我们将深入了解Grails的安全性实现,包括安全框架的选择、用户认证、权限控制及数据保护等关键话题。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:Grails框架基于Groovy语言,借鉴Ruby on Rails的理念,提供了强大的Web应用开发能力。它集成了GORM进行数据库操作,并使用GSP作为视图技术。本文将指导读者完成Grails的安装、应用程序创建、核心概念理解、安全性配置、插件使用以及服务部署等敏捷开发关键步骤。通过实践学习Grails,开发者能够快速提高Web开发的效率和质量。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

Grails 技术精解与Web开发实践【源码+样章】----下载不扣分,回帖加1分,欢迎下载,童叟无欺 第1章 导论 1 1.1 RoR的革命与Web开发的新时代 1 1.2 RoR并不完美 2 1.2.1 Ruby语言方面的不足 2 1.2.2 对历史遗留项目的支持较为困难 2 1.3 Grails的诞生解决了一些遗憾 3 1.3.1 Groovy语言 3 1.3.2 Grails站在了巨人的肩膀之上 3 1.3.3 Grails有良好的扩展性 3 1.4 对Grails的一些误解 3 1.5 本书的使用说明 4 1.6 本章小结 4 第一篇 入门篇 第2章 Hello Grails 6 2.1 Grails的安装 6 2.1.1 JDK的安装与配置 6 2.1.2 Grails的安装 7 2.2 创建Grails工程 8 2.3 Grails的MVC架构 11 2.4 Scaffold应用程序 14 2.5 开发工具的使用 17 2.6 本章小结 19 第3章 Groovy VS Java 20 3.1 Groovy的基本类型与运算符 21 3.1.1 字符串 21 3.1.2 数字 22 3.1.3 Groovy的类 23 3.1.4 运算符 24 3.2 Groovy的控制结构 25 3.3 Groovy的集合 27 3.3.1 列表 27 3.3.2 映射 28 3.3.3 区间 29 3.4 Groovy的闭包 30 3.4.1 闭包的定义 30 3.4.2 闭包的代表 31 3.4.3 闭包在GDK中的使用 31 3.5 本章小结 33 第二篇 实际应用 第4章 商品维护 36 4.1 准备工作 36 4.2 查看商品列表 40 4.3 创建和编辑商品 44 4.4 本章小结 48 第5章 商品搜索 49 5.1 构造查询表单 49 5.2 复杂的数据库查询 50 5.2.1 HibernateCriteriaBuilder 的初窥 51 5.2.2 数据库的分页查询 54 5.2.3 将查询改造为inner join 59 5.3 显示分页导航 60 5.4 本章小结 62 第6章 用户注册与登录 63 6.1 表单验证与资源文件 63 6.2 用户注册 69 6.3 用户登录 73 6.3.1 登录的数据库查询 73 6.3.2 使用Session维持会话 74 6.3.3 自定义Codec实现对 密码加密 75 6.4 登录保护 76 6.5 本章小结 79 第7章 购物车与订单 80 7.1 购物车的查看与管理 80 7.1.1 定义购物车的Domain类 80 7.1.2 定义OrderService类 82 7.1.3 显示购物车 84 7.1.4 维护购物车 85 7.2 订单的提交 90 7.2.1 定义订单的Domain类 90 7.2.2 提交订单的表单页面 90 7.2.3 订单的保存 94 7.3 订单的查看 95 7.4 本章小结 99 第8章 系统后台管理 100 8.1 页面布局的使用 100 8.1.1 Grails Layout的基础知识 100 8.1.2 为系统后台管理创建 统一的decorator 103 8.2 文件上传的实现 107 8.2.1 开发表单页面 107 8.2.2 在Controller中接收文件 108 8.3 修改订单状态 109 8.4 本章小结 110 第9章 Grails的自动化测试 111 9.1 Grails自动化测试基础知识 111 9.2 编写测试用例 113 9.2.1 对Domain类进行测试 113 9.2.2 对Service类进行测试 116 9.2.3 对Controller进行测试 118 9.2.4 对Taglib进行测试 120 9.3 本章小结 121 第10章 部署应用 122 10.1 Grails对部署的支持 122 10.2 配置应用程序 124 10.3 本章小结 127 第三篇 深入了解Grails 第11章 深入GORM 130 11.1 自定义映射 130 11.1.1 基本映射 130 11.1.2 配置主键 131 11.1.3 “锁”与Version 133 11.1.4 事件与自动时间戳 134 11.1.5 映射Blob字段 134 11.1.6 定义非持久化属性 135 11.2 深入理解Domain间的关系 136 11.2.1 一对一关系 136 11.2.2 一对多关系 137 11.2.3 多对多关系 139 11.2.4 继承关系 141 11.2.5 合成关系 143 11.3 数据库查询小结 143 11.3.1 GORM提供了便捷的 查询方法 143 11.3.2 基于HQL的查询 145 11.4 对GORM进行性能优化 146 11.4.1 设置抓取模式 147 11.4.2 使用二级缓存 147 11.5 使用GRAG工具生成Domain 151 11.6 本章小结 154 第12章 与Spring整合 155 12.1 依赖注入与Spring容器基础 155 12.1.1 依赖注入 155 12.1.2 Spring容器基础 157 12.2 在Grails中使用Spring 158 12.3 本章小结 160 第13章 深入Controller 161 13.1 Controller中常用的属性与方法 161 13.2 自定义URL Mapping 164 13.3 Web Flow 167 13.4 本章小结 172 第14章 深入Groovy Server Page 174 14.1 GSP基础知识 174 14.1.1 GSP输出表达式 174 14.1.2 GSP中预定义的变量 与作用域 175 14.2 GSP标签库 175 14.2.1 常用的内置标签 176 14.2.2 开发自定义标签 179 14.3 Grails对Ajax的支持 182 14.4 本章小结 184 第15章 实现Web Service 185 15.1 REST风格的Web Service 185 15.1.1 什么是REST 185 15.1.2 在Grails中实现REST 185 15.1.3 在Client端调用服务 187 15.2 基于SOAP的传统Web Service 188 15.3 本章小结 189 第16章 使用Grails插件 190 16.1 插件的安装 190 16.2 插件的组织结构 196 16.3 插件的使用 197 16.3.1 Acegi插件 197 16.3.2 Debug插件 204 16.4 本章小结 205 第四篇 Grails解密 第17章 高级Groovy特性 208 17.1 动态方法调用与属性访问 208 17.1.1 动态方法调用 208 17.1.2 动态属性访问 208 17.2 invokeMethod和getProperty 209 17.3 MOP动态基础 211 17.3.1 遍历方法和属性 211 17.3.2 动态添加方法 213 17.3.3 动态添加属性 215 17.3.4 使用方法对象 216 17.3.5 为某一特定的实例 添加方法 217 17.4 本章小结 218 第18章 Grails插件开发 219 18.1 创建与发布插件 219 18.2 插件能做什么 221 18.2.1 添加Spring配置信息 223 18.2.2 与Spring容器交互 224 18.2.3 修改web.xml 224 18.2.4 添加动态方法 226 18.2.5 捕获变更 227 18.3 插件的依赖关系 229 18.4 在安装或升级时执行附加操作 230 18.5 本章小结 230 第19章 浅析Grails的源程序 231 19.1 准备工作 231 19.1.1 下载源码 231 19.1.2 编译Grails源码 231 19.2 HibernateCriteriaBuilder的原理 233 19.3 开启Hibernate Query Cache 237 19.4 本章小结 241 第20章 未来Grails版本的新特性 242 20.1 GORM的新特性 242 20.1.1 更多的GORM事件 242 20.1.2 映射基本类型的集合 243 20.1.3 对Domain的只读访问 243 20.1.4 定义默认排序字段 243 20.1.5 改进的findBy 245 20.2 对插件系统的改进 245 20.3 数据绑定 245 20.4 在GSP中使用JSP的标签 246 20.5 加密配置文件中的数据库密码 246 20.6 本章小结 246 参考文献 247 索引 248 Grails技术精解与Web开发实践 目录 XII XI
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>