Groovy&Grails理解–第2部分

ils子

Grails是基于Groovy和Java的Web框架,可以将其部署到现有的Java Web服务器中,例如Tomcat或Jetty。 它的脚手架功能使您可以在几分钟内创建一个新项目。 Grails基于“基于配置的约定”的思想,该思想允许应用程序根据命名方案(而不是使用配置文件,例如XML文件)自动连接自身。

Grails框架无需任何配置即可进行实例开发。 Grails通过在开发过程中自动提供Tomcat Web容器和HSQLDB数据库来实现此目的。 Grails使用GORM(Grails
对象关系映射)以确保域模型的持久性。 GORM基于Hibernate。 您只需更改配置文件(DataSource.groovy),即可使用HSQLDB进行测试并针对另一个数据库在生产环境中运行。 Grails使用Java EE作为架构基础,使用Spring通过依赖关系注入来构造应用程序。 Grails是基于插件的,并提供了自己的构建系统(Gant)。 Grails主页提供了几个预定义的插件,这些插件扩展了Grails框架。 Grails的开发考虑了许多目标:

  • 为Java平台提供高效的Web框架。
  • 在简单,一致的界面下重用成熟的Java技术,例如Hibernate和Spring
  • 提供一个一致的框架,减少混乱并且易于学习。
  • 提供对框架重要的用户文档。
  • 提供用户在通常复杂且不一致的领域中的期望:
    • 强大而一致的持久性框架。
  • 提供示例应用程序,以演示框架的功能。
  • 提供完整的开发模式,包括Web服务器和自动重载资源。

建筑

Grails是一个利用Groovy的开源Web应用程序框架(图2:Grails构建在Groovy之上)。 它于2005年首次开发,并于2008年发布了第一个“ 1.0”版本。

拱门1

图片:Grails构建在Groovy之上

Arch2

图片:Grails体系结构

Grails建立在几个完善的软件框架上,并通过Groovy组合了它们的功能。 这些框架包括Java Enterprise Edition(Java EE,JEE),spring,Hibernate和Quartz。 Grails将脚本语言的速度与Java的稳定性和安全性结合在一起,因此非常适合企业使用。

Grails目录结构

Grails项目结构(如下图3所示)在很大程度上依赖于约定,并为应用程序的各种工件建立了明智的组织结构。

folderStructure

图:项目结构

环境设定

需要按照以下步骤进行Grails环境设置

  • 从oracle安装JDK1.5或更高版本
  • 将JAVA_HOME环境变量指向您的JDK安装。
  • http://grails.org/Download下载最新版本的Grails。
  • 解压Grails
  • 创建一个GRAILS_HOME环境变量
  • 将GRAILS_HOME / bin添加到PATH

域类

域类是Grails应用程序的命脉。 将为每个域类自动创建一个对应的数据库表。 控制器和视图从关联的域类派生其名称。 在这里存储验证规则,定义一对多关系,等等。 下面的命令创建域类:

grails create-domain-class domain-class-name

请注意,Grails同时创建了一个域类和一个测试类。 我们将在以后使用测试类。 现在,让我们专注于域类

脚手架控制器和视图

控制器和视图完善了Grails应用程序中的“三巨头”。 大多数Web开发人员无疑都熟悉Model / View / Controller(MVC)模式。 通过在这三个要素之间建立明确的关注点分离,您的工作将获得最大的灵活性和可重复使用性。 Grails支持静态和动态脚手架。 第一个示例将展示如何使用静态脚手架。 之后,将有一个有关如何使用动态脚手架的小例子

静态脚手架

要在Grails中生成支架,需要在项目目录内的命令行中执行以下命令

静态脚手架

在此示例中,“地址”域类将被设置为脚手架。 现在将为开发人员生成Controller和View。 生成代码的方式基于可以更改的模板。 在CRUD操作旁边,Grails添加了“列表”操作。 “编辑”和“保存”功能与“更新”和“创建”一起使用。

创建 create.gsp 创建一个新地址
show.gsp 显示一个地址(基于ID)
更新资料 edit.gsp 检索一个需要更改的地址(基于ID)
删除 无视 删除一个地址(基于ID)
清单 list.gsp 列出所有地址
编辑 无视 保存更新的地址
无视 保存新创建的地址

现在,AddressController看起来像这样。 功能是不言自明的。

Class AddressController {
Def index = { redirect (action:list, param:param)}
//delete , save and update actions only accept post requests
def allowedMethods =[delete: ‘POST’ , save:’POST’ , update: ‘POST’]
def list = {//…….}
def show = {//…….}
def delete = {//…….}
def edit = {//…….}
def update = {//…….}
def create = {//…….}
def save = {//…….}
动态脚手架

Grails中的动态脚手架非常简单。 这可以通过在需要安装支架的控制器内添加以下行来实现。

def scaffold =true

CRUD动作和视图将在运行时自动为先前定义的模型生成

数据库– GORM

Grails对象关系映射API使我们能够直截了当地地关注对象框架-不会陷入与关系数据库相关的SQL的困扰。 GORM是Hibernate上的Groovy外立面。 在创建应用程序时,Grails自动创建一个数据源类,可以在其中定义不同环境的配置。 这样可以在项目的开发,测试和生产阶段之间轻松切换。 可以在grailsapp / conf / DataSource.groovy上配置GORM数据源

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 = ‘com.opensymphony.oscace.hibernate.OSCachePovider’
}
Environment {
Development {
dataSource {
// one of ‘create’, create-drop’ , ‘update’
dbCreate= “create-drop”
urk = “jdbc:hsqldb:main:devDB”
}
}
Production {
dataSource {
dbCreate = “update”
url = “jdbc:hsqldb:file:prodDB;shutdown=true”
}
}
}

控制器

视图和控制器将基于模型生成,并将自动实施CRUD操作。 在这里,我们将公开默认的脚手架控制器代码,以便控制器和URL之间的动作以及它们之间的关系。 它还将使我们看到动作与相应的Groovy服务器页面(GSP)之间的关系。

创建控制器与生成控制器

将使用脚手架生成控制器,不仅会生成控制器,还会使用def scaffold = true生成GSP视图。 通常我会在这一点上输入“ grails create-controller User”。 回想一下create- *命令会创建一个空的,残缺的类。 而是键入grails generate-all User。 generate-all命令写出一个完全实现的控制器和一组相应的GSP视图。 (您也可以键入generate-views来仅查看GSP,或键入generate-controller来仅创建Controller。)现在,您将看到100行Groovy代码,而不是习惯于看到的单行Controller。

网址和控制器
Class UserController {
Static allowedMethods = {save: “POST”, update : “POST” , delete: “POST”|
def index = {
redirect {action: “lisy” , params}
}
def list = {
params.max = Math.mi(params.max ?
                        params.int(‘max’) :10,100)
def create = {
def userInstance =new User ()
userInstance.properties = paams
return { userInstance : userInstance}
def save = {//…….}
def show = {//…….}
def delete = {//…….}
def edit = {//…….}
def update = {//…….}
}

考虑一下在处理应用程序时看到的URL类型: http:// localhost:9090 / application / user / show / 2 URL的每个组件在Grails约定中都起着重要的作用。 通过遵守该约定,我们(非常感谢)使自己不必将我们的URL,控制器和视图连接到外部配置文件中

乌尔斯·林克

URL的第一部分是应用程序名称或应用程序上下文根。 URL的下一部分是控制器名称。 请注意,UserController的Controller部分已下线,并且第一个字母更改为小写。 在控制器名称之后,您将看到一个可选的动作名称。 该名称直接对应于Controller中的操作。

如果在Web浏览器中尝试“ http:// localhost:9090 / application / user” ,则最终将得到一个空用户列表。 由于未指定任何操作,因此Grails将请求路由到索引操作。 反过来,索引动作将请求重定向到列表动作,同时也传递查询字符串。 重定向方法中使用的name:value结构在整个Controller中都使用。

普惠制

Grails将GSP用于表示层。 Groovy Server Pages中的Groovy不仅标识了底层技术,而且还标识了您要编写一两个快速脚本时可以使用的语言。 Groovy Taglib和部分模板为您提供了一种更复杂的跨Web页面共享代码和行为的方式。 GSP是Grails以页面为中心的MVC世界观的基础。 该页面是基本度量单位。 “列表”页面提供了指向“显示”页面的链接。 显示页面允许您单击进入编辑页面,依此类推。 无论您是经验丰富的Struts开发人员还是新近的Rails爱好者,您都已经熟悉这种类型的Web生命周期。

如下所示的示例GSP页面(list.gsp):

<g:each in=”${userInstanceList}”
Satus=”i” var=”userInstance”>
<tr class=”${(i%2)==0?’odd’ : ‘event’}”>
<td>
<g:link action=”show” id=”${userInstance.id}”>
${fieldValue{bean:userInstance, field:’id’)}
</g:link>
</td>
<td>${fieldValue(bean:userInstance, field:’login’)}</td>
<td>${fieldValue(bean:userInstance, field:’password’)}</td>

<td>${fieldValue(bean:userInstance, field:’role’)}</td>
Grails中的范围

Grails中有四个作用域:请求,闪存,会话和应用程序。 每个人都有不同的寿命

  1. 放置在请求范围内的变量的持续时间足够长,足以显示在响应中,然后将其丢弃。
  2. Flash作用域中的值(通常用于Grails中的错误消息)可以在单个重定向中保留下来。
  3. 会话作用域用于应保留多个请求但仅限于当前用户的值。
  4. 放置在应用程序范围内的值是“全局”的-它们在Grails运行时一直存在,并且在所有用户之间共享。

服务

Grails Service用于将您的业务逻辑与其他层或组件分开。 服务以SomeNameService.groovy格式命名,并放置在目录/ grails-app / services /中。 服务可以利用依赖注入功能,并且您可以轻松地从控制器内部调用这些服务。

Class SearchableService {
Booleab transactional =true
def compass
def compassGps
def searchableMethodFactory
def search (Object[] args){
searcgableMethodFactory.getMethod(“searcg”).invoke(*args)
}

上面描述了SearchableService。 在Controller的类声明之后,使用单行def searchableService自动将SearchableService(存储在grailsapp / services中)添加到SearchableController中。 这就是Grails使用依赖项注入(简称“ DI”)的方式。 单元测试控制器

插入

Grails插件类似于类固醇上的JAR。 它们不仅可以包括一个或多个JAR,还可以包括GSP,控制器,TagLib,编解码器等。 从本质上讲,它们是Mini Grails应用程序,明确打算与其他Grails应用程序合并。

单元测试

GrailsUnitTestCase和GroovyTestCase都扩展了JUnit 3.x TestCase.MVC单元测试用例将扩展GrailsUNitTest用例并将测试用例控件委派给ControllerUnitTestCase和TagLibUnitTestCase

单元测试

GrailsUnitTestCase及其后代提供了模拟服务,这些服务可复制集成测试中可用的服务,而不会产生运行实际服务的开销。 GrailsUnitTestCase提供了三种方便的方法:mockForConstraintsTests(),mockDomain()和mockLogging()。 通常,您必须创建一个集成测试来针对此功能编写断言。 如果愿意,您仍然可以。 但是,由于知道单元测试的运行速度比集成测试快得多,因此能够模拟这种行为真是太好了。

Import grails.test.*
Class UserTests extends GrailsUnitTestCase {
Void testsimpleConstraints {
Def user = new User ( login: “someone”, password: “xxx”, role :”admin”)
assertFals user.validate()
}}

例如,假设您要在User类上测试验证。

部署方式

我们可以轻松生成WAR文件并将其部署到Tomcat,JBoss,GlassFish或您选择的应用程序服务器。 命令“ grails clean”将进行清理,并确保没有任何缠结的开发模式工件。 在干净的命令执行grails战争以后。 您应该最终得到一个正版JEE WAR文件,该文件适合于部署到任何Java应用程序服务器。

Import grails.test.*
Class UserTests extends GrailsUnitTestCase {
Void testsimpleConstraints {
Def user = new User ( login: “someone”, password: “xxx”, role :”admin”)
assertFals user.validate()
}}

部署WAR不需要其他服务器配置–它包括Groovy JAR,支持JAR的Grails以及添加到lib目录中的所有其他内容。

摘要

Grails的主要目标是以敏捷方式快速开发Web应用程序。 Grails基于约定优于配置和DRY(不要重复自己),并且不仅可以在Grails中重新使用现有的Java代码,而且还可以以快速的方式构建强大而稳定的Web应用程序。 本文解释了Groovy和Grails的用法和最佳实践。

资源资源

参考:《 Groovy&Grails理解–第2部分》,来自我们的JCG合作伙伴 Nitin Kumar,位于Tech My Talk博客上。

翻译自: https://www.javacodegeeks.com/2013/04/groovy-grails-understanding-part2.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值