groovy grails
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”版本。
Grails建立在几个完善的软件框架上,并通过Groovy组合了它们的功能。 这些框架包括Java Enterprise Edition(Java EE,JEE),spring,Hibernate和Quartz。 Grails将脚本语言的速度与Java的稳定性和安全性结合在一起,因此非常适合企业使用。
Grails目录结构
Grails项目结构(如下图3所示)在很大程度上依赖于约定,并为应用程序的各种工件建立了明智的组织结构。
环境设定
需要按照以下步骤进行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”
}
}
}
控制器
View和Controller将基于Model生成,并将自动实施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中有四个作用域:请求,闪存,会话和应用程序。 每个人都有不同的寿命
- 放置在请求范围内的变量的持续时间足够长,足以在响应中显示,然后被丢弃。
- Flash作用域中的值(通常用于Grails中的错误消息)可以在单个重定向中保留下来。
- 会话作用域用于应保留多个请求但仅限于当前用户的值。
- 放置在应用程序范围内的值是“全局”的,它们在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的用法和最佳实践。
资源资源
- http://groovy.codehaus.org/- Groovy
- http://en.wikipedia.org/wiki/Groovy_%28programming_language%29 – Groovy
- http://grails.org/ – Grails
- http://en.wikipedia.org/wiki/Grails_(框架)
- http://www.ibm.com/developerworks/views/java/libraryview.jsp?search_by=mastering+grails
- Codehaus的测试指南: http : //groovy.codehaus.org/Testing+Guide
- IBM的资料: http : //www.ibm.com/developerworks/java/library/j-pg11094/
翻译自: https://www.javacodegeeks.com/2013/04/groovy-grails-understanding-part2.html
groovy grails