显示导航

创建您的第一个365bet地区应用程序

365bet地区了解如何创建您的第一个365bet地区应用

s扎卡里·克莱因(Zachary Klein)

365bet地区版本 4.0.1

365bet地区培训

365bet地区培训由创建并积极维护365bet地区框架的人们开发和交付

入门

365bet地区在本指南中,您将创建第一个365bet地区应用程序。您将学习有关域类控制器服务GSP和单元集成测试的信息。该指南针对的是不熟悉365bet地区或希望在框架上进行复习的开发人员

您将需要什么

要完成本指南,您将需要以下内容

  • 花些时间在你手上

  • 体面的文本编辑器或IDE

  • 安装了JDK或更高版本JAVA首页适当配置

如何完成指南

要开始,请执行以下操作

要么

365bet地区指南存储库包含两个文件夹

  • 初始初始项目通常是一个简单的365bet地区应用程序,其中包含一些其他代码,可以帮助您快速入门

  • 完成一个完整的示例它是按照指南中介绍的步骤进行操作并将这些更改应用于文档的结果。初始

要完成指南,请转到初始

  • 光盘进入grails引导您创建第一个grails应用程序的初始

并按照下一节中的说明进行操作

您可以直接前往完成的例子如果你光盘进入grails创建第一个grails应用程序的指南已完成

创建您的365bet地区应用

对于本指南,您可以自己创建起始项目,也可以使用初始如果您选择使用初始专案,您可以放心跳过此部分,并继续运行App365bet地区如果您想在计算机上安装365bet地区,请遵循以下选项之一

365bet地区安装365bet地区

安装365bet地区

SDKMan

sdkman是一个流行的命令行实用程序,用于安装和管理365bet地区安装以及其他JVM框架和语言Installsdkman通过在Unix终端上运行以下命令

curl s https获取sdkman io bash

安装完成后,安装本指南使用的最新版本的365bet地区

SDK安装365bet地区

sdkman将提示您选择是否将此版本设置为默认版本,请选择是

365bet地区grails版本365bet地区版本JVM版本
如果您运行的是Windows,则存在一个克隆项目sdkman遵循相同约定的可用软件您可以从以下网站下载https github com flofreud posh gvm

从365bet地区 org下载

365bet地区这不是推荐的安装365bet地区的方法,但是如果上述方法失败,这是手动安装步骤

365bet地区从下载365bet地区二进制包https grails org将软件包解压缩到方便的目录中

解压下载grails zip

编辑你的巴什尔大多数Linux版本或bash个人资料具有以下环境变量的文件将其添加到文件末尾

设置网格首页环境变量到您提取zip的位置

将GRAILS HOME导出到grails

在Windows上,您可以在以下位置创建环境变量我的计算机高级环境变量

365bet地区现在添加365bet地区我是目录到您的路径变量

将GRAILS HOME路径导出到grails导出PATH PATH GRAILS HOME bin

再次在Windows上,您需要修改路径下的环境变量我的计算机高级环境变量

365bet地区现在,您应该能够在终端窗口中键入grails版本,并验证365bet地区是否已成功安装。

grails版本365bet地区版本JVM版本

365bet地区365bet地区应用伪造

365bet地区您知道您可以下载完整的365bet地区项目而无需安装任何其他工具吗?开始grails org并使用365bet地区应用伪造生成365bet地区项目您可以选择项目类型“应用程序”或“插件”,选择一个365bet地区版本并选择一个Profile,然后单击“ Generate Project”下载一个ZIP文件,无需安装365bet地区

您甚至可以使用HTTP工具从命令行下载项目,例如卷曲看到开始grails org用于API文档

curl O start grails org myapp zip d版本

创建应用

创建365bet地区应用程序几乎就像安装365bet地区一样简单,只需运行创建应用命令

grails创建应用程序myApp

如果您未指定软件包,则应用名称将用作该应用的默认软件包。myapp您可以在以下位置编辑默认软件包grails应用配置会议应用yml您可以选择为应用程序指定默认软件包

grails创建应用组织org grails指导myApp

应用资料

您可以选择指定一个轮廓365bet地区为您的365bet地区应用程序配置文件可用于许多常见的应用程序类型,包括休息api, 角度的, 反应和其他人,甚至可以创建自己的

要查看可用配置文件的列表,请使用列出个人资料命令

365bet地区grails列表配置文件可用的配置文件angular用于使用AngularJS rest api REST API应用程序配置文件创建应用程序的配置文件由其他配置文件扩展的基本配置文件angular用于创建带有Angular插件的365bet地区应用程序的配置文件用于设计用于所有配置文件的插件的配置文件用于创建新的365bet地区配置文件react的配置文件,用于使用React前端rest api插件创建365bet地区应用程序REST API插件的配置文件Web应用程序的Web配置文件Web插件用于Web应用程序的插件配置文件webpack用于使用webpack创建具有基于节点的前端的应用程序的配置文件

要使用配置文件,请在其名称前加上轮廓

grails创建应用程序myApp个人资料其余api

您可以选择指定软件包,版本默认为org grails的个人资料和配置文件的当前版本

grails创建应用程序myApp配置文件org grails配置文件反应

要获取有关配置文件的详细信息,请使用个人资料信息命令

365bet地区grails概要文件信息插件概要文件插件用于在所有概要文件中工作的插件的概要文件提供的命令错误加载命令时发生错误错误grails dev命令ApplicationContextCommandRegistry使用stacktrace查看完整的跟踪错误加载命令时发生了错误错误grails dev命令ApplicationContextCommandRegistry使用stacktrace查看完整的跟踪包插件将插件打包到一个JAR文件中。 365bet地区应用程序创建命令创建应用程序命令创建域类创建域类创建服务创建服务创建单元测试创​​建单元测试安装安装Grail的应用程序或插件到本地Maven缓存组合中创建用于生产部署错误报告的JAR或WAR归档文件创建可附加到当前项目控制台的发布报告的zip文件运行365bet地区交互式控制台创建脚本创建365bet地区脚本依赖性报告打印出365bet地区应用程序的依赖项列表插件从插件存储库中列出可用插件的插件信息打印有关给定插件运行应用程序的信息运行365bet地区应用程序运行命令执行365bet地区命令运行脚本在365bet地区上下文外壳中执行Groovy脚本运行365bet地区交互式外壳stats打印有关项目停止应用程序的统计信息停止正在运行的365bet地区应用程序测试应用程序运行应用程序测试提供的功能资产管道将资产管道添加到365bet地区项目中休眠将Hibernate的GORM添加到项目中休眠添加GOR M for Hibernate到项目json视图中添加对JSON视图的支持到项目中,更少的资产管道将LESS Transpiler Asset Pipeline添加到365bet地区项目标记视图中将对Markup视图的支持添加到项目中mongodb将MongoDB的GORM添加到项目中neo j添加GORM用于Neo j的项目rx mongodb将用于MongoDB的RxGORM添加到项目资产管道插件中将资产管道添加到365bet地区插件中进行打包
当您创建一个没有轮廓使用的默认配置文件是网络轮廓

运行应用

365bet地区现在您已经创建或下载了365bet地区项目,现在该运行它了,看看365bet地区已经给了您什么

365bet地区如果您在本地安装了365bet地区,则可以使用运行应用在项目中执行命令

cd myApp

在未安装365bet地区的情况下运行应用

感谢谷物包装365bet地区从365bet地区版本或更高版本开始,您可以运行任何365bet地区命令而无需安装365bet地区。365bet地区应用伪造365bet地区也包括365bet地区包装器

grailsw运行应用程序

365bet地区使用365bet地区运行应用

如果您的计算机中安装了365bet地区,只需键入

grails运行应用

使用365bet地区互动模式运行应用

365bet地区您也可以使用365bet地区互动模式365bet地区运行365bet地区运行时,您可以从中发出任何365bet地区命令,而无需等待运行时为每个任务启动

365bet地区在本指南中,我们将首选365bet地区包装器来执行大多数命令

输入要运行的命令名称使用TAB进行完成grails运行应用程序,可以使用stop app命令关闭该应用程序

使用Gradle运行应用

365bet地区最后,因为365bet地区建立在春季靴摇篮您还可以使用Spring Boot命令,例如bootRun365bet地区与365bet地区应用程序进行交互这些命令可作为Gradle任务使用,就像365bet地区本身一样,不需要在您的机器上安装Gradle。使用Gradle Wrapper时,它将自动下载Gradlew)

gradlew bootRun

运行以上任何命令后,365bet地区将使用嵌入式Tomcat服务器启动您的应用程序,并在默认情况下将其设置为可用HTTP本地主机.

365bet地区grailsw运行应用程序运行应用程序365bet地区应用程序在环境开发中的http localhost运行

更改默认端口

如果您想更改端口号,只需编辑yml应用程序文件下grails应用程序配置并添加以下行

服务器:
    港口: 8090

您可以在命令调用中直接提供端口号

365bet地区grailsw运行应用程序端口运行应用程序365bet地区应用程序在环境开发中的http localhost运行

自动重装

当前,该应用仅显示一个默认索引页面,其中包含有关该应用的一些信息。该默认索引页面位于365bet地区应用程序观看次数索引gsp.

继续编辑该文件并更改页面上的某些内容,如下行所示

    <> ID="内容" 角色="主要">
        <> ="行紧身衣">
            

365bet地区欢迎来到我的第一个365bet地区项目 (1)
1 更改文字

标签

365bet地区保存更改并在浏览器中刷新页面您应该在主页上看到更改,365bet地区会在检测到更改时自动将更改重新加载到视图控制器域类和其他工件,因此您无需在每次更改时都重新启动应用程序

域类关联重命名类的重大更改以及其他影响应用程序连接的操作可能无法成功重新加载

域类

365bet地区365bet地区是一个模型视图控制器基于Spring Boot项目的MVC框架通常,MVC应用程序将应用程序的职责分为三类

  1. 定义和管理数据的模型代码

  2. 查看管理数据表示的代码,例如HTML页面

  3. 控制器代码,定义Web应用程序的逻辑并管理模型与视图之间的通信控制器响应请求,从模型中获取数据并将其传递给视图

通常,面向对象的MVC框架要求开发人员配置与上述三个类别中的每个类别相对应的类。约定优于配置开发方法这意味着对于365bet地区控制器视图等中的许多工件类型,您只需在项目中的特定目录中创建一个文件,365bet地区就会自动将其连接到您的应用程序中,而无需您进行任何其他配置

处理域类到数据库表和其他持久性存储的映射是365bet地区365bet地区对象关系映射器GORM是365bet地区框架中的强大工具,甚至可以在365bet地区项目之外独立使用。它通过Hibernate以及MongoDb Neo j Redis和Cassandra数据源支持关系数据库。蓝色文档了解更多信息

365bet地区在构建MVC应用程序时,通常以M模型(也称为领域模型)开始。在365bet地区中,您的领域模型是使用Groovy类在下面定义的365bet地区应用程序域让我们创建一个域类

创建域类

365bet地区365bet地区可以生成域类,在这种情况下,365bet地区会自动创建单元测试,或者您可以自己创建文件

grailsw创建域类Vehicle创建了grails应用程序域org grails指南Vehicle groovy创建了src test groovy org grails引导VehicleSpec groovy

这将生成两个Groovy文件,一个是我们的域类,另一个是单元测试,让我们看看我们的域类是什么样子

org grails指南 车辆 {

    静态的约束

现在,我们的域类没有属性且没有约束,虽然不是很有趣,但是值得注意的是,这是在我们的应用程序中连接持久性域类所需要的全部。默认情况下,Hibernate将用于在内部配置数据源。默认情况下,存储H数据库,并为下面的所有Groovy类创建表和关联365bet地区应用程序域让我们向此域类添加一些属性

org grails指南 车辆 {

    那么(1)

    使模型静态的约束(2)那么maxSize: 255使inList: ['福特汽车', '雪佛兰', '日产'模型可为空: 真正
    }
}
1 假设使用关系数据库,将使用属性在数据库中创建列
2 365bet地区约束用于强制每个字段中的有效数据365bet地区为常见方案提供了丰富的约束集,您也可以定义自定义约束

365bet地区请参阅365bet地区文档以获取有关如何使用的完整列表和文档域类约束

数据库控制台

如果再次运行该应用程序,则应该看到与以前相同的页面。但是,您可以登录数据库控制台并查看新的数据库表

浏览到http本地主机dbconsole并登录默认用户名是她的没有密码默认的JDBC URL是jdbc h mem devDb MVCC TRUE LOCK TIMEOUT DB EXIT FALSE关闭

数据库控制台
您可以在中查看JDBC URLyml应用程序环境 发展 数据源 网址

登录数据库控制台后,您应该会看到新的汽车左侧边栏中的表格,点击+图标以展开表格,您应该会看到包括三列的列的列表我们刚刚定义的字段那么, 使模型.

数据库控制台

扩展领域模型

为了我们车辆上课没有任何意义使模型是纯字符串,因为模型实际上应该与make关联,让我们更新域模型以使其更健壮

创建两个新的域类

grailsw创建域类创建365bet地区应用程序域org grails指南创建Groovy创建src测试groovy org grails指南groovy grailsw创建域类Model创建365bet地区应用程序域org grails指南模型groovy创建src test groovy org grails指南模型groovy

使用以下内容编辑这两个文件

grails应用程序域组织grails指南
org grails指南 使 {

    那么静态的约束toString名称
grails应用程序域组织grails指南模型groovy
org grails指南 模型 {

    那么静态的属于使使静态的约束toString名称
属于属性是GORM用于确定域类之间的关联的几种属性之一,其他包括有很多hasOne有关更多信息,请参见蓝色文档.

现在更新车辆槽使用新的使模型类而不是.

grails应用程序域组织grails引导车辆
org grails指南禁止警告('365bet地区365bet地区DomainReservedSqlKeywordName')
 车辆 {

    整数名称型号型号品牌静态的约束年: 1900那么maxSize: 255
    }
}

365bet地区通过GORM的365bet地区现在将在我们的数据库中为我们的三个域类创建三个表,并在表之间创建必要的关联。再次运行该应用程序并打开数据库控制台以查看新表

引导数据

365bet地区每个365bet地区项目都包含一个BootStrap常规文件下365bet地区应用初始化该文件可用于您想要在应用程序启动期间发生的任何自定义逻辑,该文件的一个绝佳用途是将一些数据预加载到我们的数据库中,让我们为这三个域类创建一些实例

编辑grails应用程序初始化组织grails引导BootStrap常规如下所示

grails应用程序初始化组织grails引导BootStrap常规
org grails指南进口 常规转换CompileStatic

静态编译
 引导带MakeService makeService ModelService modelService VehicleService vehicleService定义初始化servletContext使nissan makeService保存'日产'使福特makeService保存'福特汽车'模型泰坦模型服务保存'Titan'尼桑Model Leaf modelService保存''日产模型windstar模型服务保存'风星'福特车辆服务保存'拾起'日产泰坦2012保存车辆服务保存'经济'日产叶子2014保存车辆服务保存'小型货车'福特风之星1990保存定义破坏

现在重新启动应用程序并浏览到DBConsole,您应该能够展开三个表并查看我们新创建的数据

数据源

365bet地区默认情况下,365bet地区配置一个内存中的H数据库,该数据库在每次重新启动应用程序时都会删除并重新创建。这足以满足我们在本指南中的目的,但是您可以通过配置自己的数据源轻松地将其更改为本地数据库实例。举个例子

配置MySQL数据源

编辑建立gradle

建立gradle
依存关系//...运行'MySQL连接器' (1)
1 添加MySQL JDBC驱动程序作为依赖项
确保将依赖项添加到依存关系的部分建立gradle文件而不是构建脚本/依存关系前一部分是针对编译时运行时或测试所需的应用程序依赖关系,而构建脚本 依存关系适用于那些在Gradle构建过程中需要管理静态资产的人

编辑yml应用程序

grails应用配置会议应用yml
数据源:
    派对: 真正
    jmxExport: 真正
    driverClassName: com mysql jdbc驱动程序(1)
    方言: org休眠方言MySQL InnoDBDialect
    用户名: 她的
    密码: 测试
环境:
    发展:
        数据源:
            dbCreate: 更新
            网址: jdbc mysql myapp (2)
1 改变driverClassName方言到MySQL设置
2 假设您有一个本地MySQL实例,其数据库名为myapp

365bet地区365bet地区控制台

目前,我们没有设置任何控制器或视图来使用我们的域模型。我们将很快到达那里,但现在让我们来启动365bet地区控制台365bet地区因此我们可以探索365bet地区和GORM提供的服务

365bet地区如果应用程序仍在运行,请使用kbd Ctrl C或在互动模式停止应用命令

365bet地区启动365bet地区控制台

grailsw控制台

365bet地区365bet地区控制台应用程序将启动。此应用程序基于Groovy控制台365bet地区但是还有一个额外的好处,就是整个365bet地区应用程序都在后台启动并运行,因此我们可以访问域类,甚至可以从控制台将其持久化到数据库中

尝试从控制台中使用我们的新域模型。这是一个简单的脚本,可让您再次开始使用。蓝色文档有关查询持久性配置的更多详细信息,以及更多

docs groovy控制台
进口 org grails指南

定义车辆车辆清单println车辆尺寸定义皮卡车findByName"拾起"println拾音器名称println拾音器品牌名称println拾音器型号名称定义日产Make findByName"日产")

定义尼桑的车辆findAll由尼桑println尼桑大小

控制器

本节将重点介绍创建控制器和定义操作的基础

365bet地区虽然不属于MVC三合会,但365bet地区也提供了对服务365bet地区在任何复杂的365bet地区应用程序中,将核心应用程序逻辑保留在服务中被认为是最佳实践,我们将在本指南的后面部分介绍服务。

365bet地区遵循约定优于配置原则,365bet地区将在下面配置任何Groovy类。365bet地区应用程序控制器作为控制器而无需任何其他配置,您可以自己创建Groovy类,也可以使用创建控制器生成控制器和相关测试规范的命令

grailsw创建控制器org grails指南主页创建的grails应用程序控制器org grails指南HomeController groovy创建src测试groovy org grails指南HomeControllerSpec groovy
365bet地区请注意,365bet地区添加了控制者自动后缀

让我们来看看我们的新控制器

grails应用程序控制器组织grails指南HomeController groovy
org grails指南 家庭控制器 {

    定义 指数() { }
}

365bet地区创建了一个具有单个控制器的控制器行动动作是控制器中可以响应请求的公共方法,通常,控制器动作将接收请求,以使用参数或请求正文(如果存在)来获取一些数据,并将结果呈现给浏览器(例如网页)控制器动作也可以重定向请求转发呼叫服务方法并返回HTTP响应代码,请参见365bet地区文档有关控制器动作的更多信息

我们在此特定操作中尚无逻辑需求,但我们希望它呈现页面。我们将在GSP页面中更详细地介绍GSP页面。观看次数部分,但现在让我们为我们创建一个非常简单的GSP页面HomeController索引显示动作

创建文件索引gsp在下面grails应用程式检视首页目录

grails应用程式检视首页索引gsp



    "布局"内容"主要"/>
    365bet地区主页span类regexp span类分隔符span类内容title span类span类错误span类Regexp类regexp span类分隔符span类内容head span类Span类错误span body div id类class类字符串span类分隔符span类内容内容跨度类分隔符跨度角色跨度类字符串跨度类分隔器跨度类内容主跨度类分隔器跨度部分跨度类类型类跨度跨度类字符串跨度类分隔符跨度类内容行紧身胸衣其跨度跨度类分隔符跨度跨度class span h h span欢迎来到我们的首页span span regexp span class定界符span span class content h span span span错误error span span class regexp span class delimiter span span class content content section span跨度类错误跨度类regexp跨度类regexp跨度类分隔符跨度类内容div跨度跨度类错误span跨度类regexp跨度类分隔符跨度类内容body跨度跨度误差跨度类regexp跨度类分隔符跨度类内容html span跨度代码pre div div div类段p再次运行应用程序,并浏览器为http localhost主页代码编码您应该会看到新页面p div div类段p按照约定Grails会将控制器操作映射到代码中具有相同名称的视图grails应用程序视图控制器名称代码目录您可以覆盖此视图并指定一个特定视图或完全呈现其他内容p div div类段落p我们将在下一部分中更详细地介绍视图和GSP,但现在您应该注意我们的代码索引gsp代码文件基本上是一个H带有两个不寻常标签的TML页面随时修改此新主页,但是您希望p div h id urlMappings URL映射h div类贡献btn按钮类型按钮类btn btn默认onclick窗口位置href https github com grails指导创建您的第一个grails应用程序编辑主src主要文档指南urlMappings adoc i类fa fa铅笔平方oi改进此doc按钮div div类类p现在我们有了新的主页,如果它是应用程序的登录页面而不是Grails,那就太好了默认情况下,我们需要更改代码UrlMappings groovy代码文件p div div类段落p Grails使用代码UrlMappings groovy代码文件将请求路由到适当的控制器和操作,它们可以像重定向到URI字符串的URI字符串一样简单。控制器和/或动作,或者它们可以包含通配符和约束,并且变得非常复杂div div类admonitionblock技巧表tr td类别图标i类fa图标技巧标题技巧i td td类别内容从a href http docs grails org最新指南theWebLayer html urlmappings Grails文档了解更多关于URL映射的信息td tr表div div div类段落p让我们看一下默认代码URLMappings groovy代码文件p div div类listingblock div类title grails应用控制器org grails指南UrlMappings groovy div div类内容pre class CodeRay高亮代码数据lang groovy span class关键字package span org grails guides span类类型类跨度跨度类类UrlMappings跨度跨度指令静态跨度映射跨度类字符串跨度分隔符跨度内容跨度类别跨度内联跨度类别内联定界符跨度控制器跨度跨度类别nline span类inline定界符span操作action span类内容span类class inline span类inline定界符span id id span类content span类class inline span类inline定界符span format span类类内容span类class定界符span span i类conum数据值ibb约束跨度类注释在此处应用约束跨度类字符串跨度类分隔符跨度类内容跨度类定界符跨度关键类视图跨度类字符串跨度类定界符跨度内容索引跨度类定界符跨度i类conum数据值ibb跨度类字符串跨度类分隔符跨度类内容跨度类分隔符跨度类关键视图跨度类字符串跨度类分隔符跨度类别内容错误跨度类别分隔符跨度跨度类别字符串跨度类别分隔符跨度类别内容跨度类别分隔符跨度类别跨度关键视图跨度类别字符串跨度类别分隔符跨度类别内容notFound跨度跨度类分隔符跨度跨度代码pre div div div div class colist arabic table tr td i类conum数据值ibb td td Grails默认URL映射,此规则导致请求被映射到控制器和操作,并可选地基于名称映射ID和/或格式,因此代码本地索引代码将映射到代码HomeController代码代码索引代码操作td tr tr td i类conum数据值ibb td td此URL映射将根URI代码代码指向特定视图td tr表div div类类段落p让我们更改代码规则,使其指向我们的新代码HomeController代码,按如下所示编辑该行p div div类清单blockdiv div类标题grails应用控制器org grails指南UrlMappings groovy div div类内容pre class CodeRay高亮代码数据lang groovy span类关键字包span org grails指南span class类型class span span class class UrlMappings span span class指令static span mappings span class comment span span class string string span class delimiter span span content content span class class delimiter span span span class key controller span span class字符串跨度类分隔符跨度类别内容主页跨度类别分隔符跨度i我类别数据值ibb跨度类注释跨度代码pre div div div div colist阿拉伯语表tr td i类conum数据值ibb td td将代码视图索引代码更改为代码控制器主代码td tr表div div类段落p按照惯例,对不带操作名称的控制器的请求将转到代码索引代码操作(如果不存在)。错误将引发错误如果需要,可以通过在控制器中指定代码defaultAction代码属性来更改此行为。p div div类listingblock div类标题grails应用控制器org grails指南HomeController groovy div div类内容pre class CodeRay高亮代码数据lang groovy跨度类关键字包跨度org grails指南跨度类类型类跨度类类HomeController跨度类指令静态跨度defaultAction跨度类字符串跨度类定界符跨度类内容homePage跨度类定界符跨度跨度类关键字def spa n span class function homePage span i class conum数据值ibb code pre div div div class colist阿拉伯语表tr td i类conum数据值ibb td td请勿进行此更改,仅用于演示目的td tr table div div类段p现在,您已经更改了代码规则,以指向新的代码HomeController代码(如果您重新启动应用程序和浏览器以对href http localhost类裸http localhost进行编码),则应该在新主页上显示代码p div id id脚手架h div类贡献btn按钮类型btn btn默认onclick窗口位置href https github com grails指南创建您的第一个grails应用程序编辑主src主要文档指南脚手架adoc i类fa fa铅笔平方oi改进此doc按钮div div div类段落p我们希望有一些动作允许我们创建新的域类实例并将其持久化到数据库中。此外,我们希望能够编辑现有实例甚至删除它们,通常,所有这些功能都需要大量编码,但是Grails为我们提供了脚手架的先机p div div类admonitionblock提示表tr td类图标i类fa图标提示标题提示i td td类内容在a href http docs grails org最新指南中了解有关脚手架的更多信息html脚手架html Grails文档a td tr table div h id dynamicScaffolding动态脚手架h div类贡献btn按钮类型按钮类btn btn默认onclick窗口位置href https github com grails指南创建您的第一个grails应用程序编辑主src主要文档指南guide dynamicScaffolding adoc i类fa fa铅笔平方oi改进此文档按钮div div类段p现在我们有了主页,我们可以创建控制器来管理我们先前创建的域模型为每个域类代码创建新控制器代码车辆代码代码制作代码和代码模型代码p div div div class listingblock div class content pre类CodeRay高亮代码数据lang bash grailsw创建控制器Vehicle创建的grails应用程序控制器org grails指南VehicleController groovy创建的src test groovy org grails指南VehicleControllerSpec groovy grailsw的创建控制器Make创建的grails应用程序控制器org grails指南MakeController groovy创建的src测试groovy orgSpecs groovy grailsw创建控制器模型创建的grails应用程序控制器org grails指南ModelController groovy创建的src测试groovy org grails指南ModelControllerSpec groovy代码pre div div div类段p要使用脚手架,请编辑三个我们刚刚创建的控制器,并将默认代码索引代码操作替换为代码脚手架代码属性,如以下示例中所示:p div div类listingblockdiv div类title grails应用控制器org grails指南VehicleController groovy div div类内容课前CodeRay高亮代码数据lang groovy span class关键字package span org grails指南span class type类span span class class VehicleController span span class指令static span scaffold车辆代码pre div div div class listingblock div class标题grails应用控制器org grails指南MakeControler groovy div div class内容pre class CodeRay高亮代码数据lang groovy span class关键字package span org grails指南span class type class span span class class MakeControler span span class指令static span scaffold使代码pre div div div class listingblock div类标题grails应用控制器org grails指南ModelController groovy div div类内容pre class类别CodeRay高亮代码数据lang groovy span class关键字package span org grails指南span类类型class span span class class ModelController span span class指令static span scaffold Model代码pre div div div类段落p设置了代码支架代码属性后,Grails现在将为相应的域类生成所有必要的CRUD创建读取更新删除操作,还将使用我们的域属性和列表创建显示和编辑页面来动态生成视图。关联当将应用程序的开头放在一起时,这可以给您很大帮助p div div类段落p重新启动应用程序并浏览以编码href http localhost车辆类裸http localhost车辆您应该看到的代码我们添加到代码BootStrap代码中的车辆代码实例列表尝试新视图并创建视图编辑和删除某些实例您也可以对代码进行相同操作模型代码和代码使代码控制器p div h id staticScaffolding Static脚手架h div类贡献btn按钮类型btn btn默认onclick窗口位置href https github com grails指南创建您的第一个grails应用程序编辑主src主要文档指南staticscaffolding adoc i类fa fa铅笔平方oi改进此doc按钮div div div类段落p动态脚手架功能强大,有时会提供您所需的所有功能,特别是对于数据访问比演示更重要的管理站点,但是很有可能您会需要自定义生成的视图和控制器,以改变其外观或添加自定义逻辑和功能Grails满足了这一需求,并提供了一组代码生成代码命令,这些命令可以生成您刚刚看到的控制器和/或视图,从而允许您对其进行修改以适应您的需求p div div类段落p生成视图并继续使用动态脚手架p div div类listingblock div类内容pre类CodeRay高亮代码数据lang bash grailsw生成视图车辆代码pre div div div类段落p要生成控制器并继续使用动态GSP视图p div div类listingblock div类内容预类CodeRay高亮代码数据lang bash grailsw生成控制器车辆代码pre div div div类段落p到视图和控制器,绕过所有动态生成p div div类listingblock div类内容预类CodeRay高亮代码数据lang bash grailsw g使所有车辆代码pre div div div类段落p生成的控制器将放置在grails应用程序控制器代码下,并且生成的视图将放置在grails应用程序视图下。车辆代码p div div类admonitionblock提示表tr td类图标i类fa图标提示标题提示i td td类内容要覆盖现有文件,请使用代码强制代码标记以及代码生成代码命令代码grailsw生成所有com示例车辆强制代码td tr表div div类段p让我们生成控制器并代码代码视图,并查看生成的控制器p div div类列表listdiv div类内容pre类CodeRay高亮代码数据lang bash grailsw生成所有Vehicle力代码pre div div div类段p在以下位置打开代码VehicleController groovy代码文件代码grails应用程序c ontrollers org grails指南代码p div div div class listingblock div class content pre class CodeRay高亮代码数据lang groovy span class关键字import span span class include static span span class include org springframework http HttpStatus NOT FOUND span span class关键字import span span class include static span span class include org springframework http HttpStatus OK span span class关键字import span span class include静态span span class include org springframework http HttpStatus CREATED span span class keyword import span span class include org grails指南Vehicle span span class keyword import span span class include grails gorm Transactions事务性span跨度类注释SuppressWarnings span跨度类字符串跨度类定界符span跨度类内容LineLength span跨度类定界符span跨度类注释ReadOnl y span i类conum数据值ibb span类类型class span类class VehicleController span类类指令static span名称空间span类字符串span类类分隔符span类类内容scaffolding span类类定界符span类span类指令static span allowed方法Methods类类键保存范围跨度类字符串跨度类分隔符跨度类内容POST跨度类分隔符跨度类关键字更新跨度类字符串跨度类分隔符跨度类内容PUT跨度类分隔符跨度类间距跨度类关键字删除跨度类别跨度类分隔符span跨度class内容DELETE span跨度class分隔符span跨度class关键字def span跨度class function index span跨度class预定义类型Integer span max par ams最大跨度类预定义类型数学跨度最小最大跨度类整数跨度跨度类整数跨度i类消耗数据值ibb响应车辆列表参数跨度类关键模型跨度类关键VehicleCount跨度车辆计数i类消耗数据值ibb跨度类关键字def span span class function show span车辆车辆响应车辆i class消耗数据值ibb span class注解SuppressWarnings span span类字符串span类分隔符span类内容FactoryMethodName span span类分隔符span类span类字符串span类分隔符span类内容GrailsMassAssignment span跨度类定界符跨度跨度类关键字def跨度类函数创建跨度响应跨度类关键字新跨度车辆参数i类conum数据值ibb跨度类批注事务性跨度i类conum数据值ibb跨度类关键字def span跨度类函数保存跨度如果跨度车辆跨度类预定义常数null跨度transactionStatus setRollbackOnly notFound跨度类关键字返回跨度跨度类关键字,如果跨度车辆hasErrors transactionStatus setRollbackOnly响应车辆错误跨度类关键字视图跨度类字符串跨度类定界符跨度类内容创建跨度类定界符跨度i类conum数据值ibb跨度类关键字return跨度车辆保存跨度类关键字刷新范围跨度类预定义常量真实跨度请求withFormat i类conum数据值ibb表单multipartForm i类conum数据值ibb flash消息消息跨度类键代码span跨度class字符串span类定界符span跨度类内容默认创建的message span跨度class delimiter span span跨度类key args span消息跨度类别关键代码跨度跨度类字符串跨度类分隔符跨度类别内容车辆标签跨度类别分隔符跨度跨度类关键字默认跨度类别字符串跨度类分隔器跨度类别内容跨度类别字符串跨度类分隔符跨度类内容跨度类别分隔符跨度响应车辆跨度类键状态跨度已创建i类消费类数据值ibb跨度类关键字def span跨度类功能编辑跨度车辆响应车辆i类别的conum数据值ibb跨度类注释事务性跨度车辆跨度类关键字是否跨度车辆跨度类预定义常数null跨度transactionStatus setRollbackOnly notFound跨度类关键字返回跨度类关键字,如果跨度车辆hasErrors transactionStatus setRollbackOnly响应车辆错误跨度类关键视图跨度类字符串跨度类分隔符跨度类内容编辑跨度跨度类分隔符跨度i类conum数据值ibb跨度类关键字返回跨度车辆保存跨度类关键字刷新跨度类预定义常数true跨度请求withFormat形式multipartForm i类conum数据值ibb flash消息消息跨度类关键代码跨度类字符串跨度类分隔符跨度类内容默认更新消息跨度跨度类分隔符跨度跨度类关键字args跨度消息跨度类别关键码跨度类字符串跨度类别分隔符跨度类内容车辆标签跨度类别分隔符跨度跨度类关键字默认跨度类别字符串跨度类分隔器跨度类内容车辆跨度跨度类分隔符跨度跨度车辆ID重定向车辆i类消耗数据值跨度类字符串跨度类定界符跨度类内容跨度类定界符跨度响应车辆跨度类键状态跨度OK i类消费数据值ibb跨度类注释事务性跨度i类消费数据值ibb跨度类关键字def跨度类功能删除跨度车辆跨度类关键字,如果跨度车辆跨度类预定义常量空跨度transactionStatus setRollbackOnly notFound跨度类关键字返回跨度车辆删除跨度类键刷新跨度类预定义常量真跨度请求withFormat格式multipartForm i类conum数据值ibb flash message消息跨度类关键码span span class s tring span class delimiter span span class content默认删除的消息span span class delimiter span span span class key args span message span class key code span span class string string span class delimiter span span class content车辆标签span span class delimiter span span span class关键字default跨度类字符串跨度类分隔符跨度类内容跨度范围跨度类内容跨度车辆类跨度类分隔符跨度车辆ID重定向跨度类关键动作跨度类字符串跨度类分隔符跨度类内容索引跨度类分隔符跨度类跨度类关键字方法跨度类跨度类字符串跨度类定界符span span class content GET span跨度类定界符span span i类别conum数据值ibb span class字符串跨度类定界符span span cla ss内容span跨度类定界符span跨度呈示span类键状态span否CONTENT i类conum数据值ibb span class指令保护span跨类类型void span notFound请求withFormat form multipartForm i类conum数据值ibb flash message消息跨度class键代码跨度跨度类别字符串跨度类别分隔符跨度类别内容默认未找到跨度跨度类别关键字参数跨度跨度类别内容车辆标签跨度类别分隔符跨度跨度类别跨度类关键字默认跨度类字符串跨度类定界符跨度类内容车辆跨度类定界符跨度参数代码pre div div div类共列表阿拉伯​​语表tr td i类conum数据值ibb td td a href http gorm grails org最新api grails gorm transaction事务性html代码事务性代码注释配置了控制器或方法的事务性行为。管理持久性和其他复杂的操作,这些操作应一起完成,如果任何一个步骤失败,则有可能回滚。有关事务的更多信息,请参见a href http docs grails org最新指南单个html declarativeTransactions Grails文档td tr tr td i类conum数据值ibb td td代码参数代码对象可用于所有控制器,并且包含请求上任何URL参数的映射。可以按名称引用任何参数以检索值代码参数myCustomParameter代码将与此URL参数代码url匹配myCusto mParameter hello代码有关更多详细信息,请参见a href https docs grails org最新的org引用Controllers params html Grails文档a更多信息td tr tr td i类conum数据值ibb td td代码响应代码方法使用href将对象返回给请求者https docs grails org最新指南theWebLayer html contentNegotiation内容协商a以选择正确的类型,例如请求的代码接受代码标头可以指定JSON或XML代码响应代码还可以接受参数映射,例如定义模型方式的代码模型代码数据已加载到页面上有关如何使用代码响应代码方法的更多信息,请参见a href https docs grails org最新的引用控制器响应html Grails文档td tr tr td i类conum数据值ibb td td代码请求代码为在所有控制器上都可用,并且是Servlet API的实例sa href https do您可以访问请求标头将属性存储在请求范围内,并使用此对象获取有关请求者的信息。有关更多信息,请参见a href https docs grails org最新的ref控制器请求html Grails文档代码请求代码a td tr tr td i类conum数据值ibb td td代码Flash代码是一个映射,用于在会话中存储强下一个强请求的对象,该对象在下一个请求完成后自动清除它们,这对于传递错误消息很有用或您希望下一个请求访问的其他数据有关更多信息,请参见a href https docs grails org最新的参考Controllers flash html Grails文档上的代码flash代码a td tr tr td i类conum数据值ibb td td代码重定向代码方法是一个简单的操作,它允许操作重定向请求到另一个动作控制器或URI您也可以通过重定向传递参数。请参阅a href https docs grails org最新的参考控制器重定向html有关代码重定向代码a的Grails文档,以获取更多td tr tr td i类conum数据值ibb td td代码渲染代码方法是代码响应代码的一种较不复杂的版本,它不执行内容协商,因此您必须准确指定要渲染的内容。您可以在视图或模板中将纯文本渲染为HTTP响应代码或任何对象,具有String表示形式参见a href https docs grails org最新的ref控制器呈现html Grails文档td tr表div div类段p大量代码生成和修改脚手架控制器是一种很好的学习方法,因此可以随意尝试并修改此代码后,您随时可以恢复到已完成代码中的版本本指南的项目p div h id响应呈现响应h div类贡献btn按钮类型按钮类btn btn默认onclick窗口位置href https github com grails指南创建您的第一个grails应用程序编辑主src主要文档指南响应adoc i类fa fa修改这个doc按钮div div div类段落p让我们修改代码HomeController代码以在我们的主页上呈现一些自定义内容编辑代码grails应用控制器org grails指南HomeController groovy代码p div div类listblock div类标题grails应用控制器org grails指南HomeController groovy div div div类内容pre class CodeRay高亮代码数据lang groovy span class关键字package span org grails guide span class type class span span class class HomeController span span class class def def span class function index span response span class key name span session name span class string span class class delimiter span span class content用户span span class delimiter span span span class key vehicleTotal span车辆计数i class conum数据值ibb span class关键字def span span class function updateName span span class



<> ID="内容" 角色="主要">
    <> ="行紧身衣">
        

欢迎词 (1)

即时消息 (2)

数据库中有车辆总数 (1) <> 行动="主页updateName" 方法="发布" 样式="余量: 0 汽车; 宽度:像素"> (3) <> 类型="文本" 那么="那么" ="" ID="那么"> <> 类型="提交" 那么="更新名称" ="更新名称" ID="更新名称"> 形成
1 我们可以使用Groovy字符串表达式在GSP页面中按名称引用模型中的任何值那么 车辆总数
2 在这里,我们重新访问我们的即时消息属性,如果它为null,那么这里什么都不会渲染
3 这是纯HTML表单,将提交那么文本字段updateName我们刚刚创建的动作

运行该应用程序,您应该在

标头Welcome User以及当前的总数车辆数据库中的实例

尝试在表单中输入您自己的名称并提交,您应该会看到页面重新加载,并且您自己的名称将替换用户刷新页面几次,因为我们存储了那么在会话中,只要会话有效,它将持续存在

内容协商

请记住,我们使用了响应方法而不是更简单渲染将模型发送到页面的方法这意味着我们可以使用HTML页面之外的其他格式(例如JSON或XML)来获取模型

在应用程序运行时在终端中运行以下命令

curl i H接受应用程序json http本地主机主页索引HTTP X应用程序上下文应用程序开发设置Cookie JSESSIONID B AAA A CE C FDC D F路径HttpOnly内容类型应用程序json字符集UTF传输编码块化日期日期星期三一月GMT名称用户vehicleTotal

我们用过卷曲打电话给我们指数行动,但我们改变了我们的接受标头应用程序json现在,我们用JSON接收了相同的数据,而不是HTML页面

您也可以在浏览器中请求不同的内容类型,这要归功于下面显示的G​​rails默认URL映射

grails应用控制器org grails指南UrlMappings groovy
        "/$控制者/$行动?/$ID?(.$格式)?"约束在此处应用约束
            }
        }

注意格式映射中的令牌。这将匹配我们URL上的后缀,例如json要么XML文件在浏览器中进行测试

浏览到http本地主机首页索引json您应该看到我们使用检索到的相同JSON正文卷曲.

尝试改变jsonXML文件您应该看到模型的XML表示内容协商允许您的控制器非常灵活,并可以通过相同的操作将适当的数据返回给不同的客户端

观看次数

视图是MVC模式的第三个组件。视图负责向用户呈现数据,该数据可能是浏览器页面,API端点或其他类型的使用者。在许多应用程序中,视图是设计为在浏览器中加载的HTML页面。根据请求该视图的客户端类型,将视图作为XML或JSON文档是完全合理的

365bet地区的主要视图技术是Groovy服务器页面它遵循JSP和ASP的许多约定,但是自然地它基于Groovy语言GSP页面本质上是HTML文档,但它们支持许多特殊标记,通常以G允许对视图进行程序控制您甚至可以在GSP页面中编写任意Groovy代码,但这是强烈地理想情况下,建议不要在GSP页面中包含与视图相关的逻辑和内容,而在呈现视图之前,控制器或服务中应进行任何类型的数据操作或处理

您已经在本指南中使用过GSP视图,但让我们快速介绍一下基础知识

版面

365bet地区应用程序中的GSP视图通常需要共享一些常规结构,也许某些共享资产(例如JavaScript文件)可以在365bet地区中使用的sitemesh模板技术以支持布局的想法,布局实际上是GSP页面可以继承的GSP模板文件

按照惯例,布局位于grails应用程序视图布局365bet地区365bet地区包含一个主要gsp365bet地区模板是默认项目中的模板,它是365bet地区脚手架使用的模板以及默认主页。我们也要使用它。要使用GSP布局,只需使用标签




    <> 那么="布局" 内容="主要"/>

您也可以创建自己的布局,让我们为主页创建新的布局

vim grails应用程序视图布局公共gsp

编辑您的新布局我们将复制现有布局主要gsp首先,我们将添加自定义徽标图片,并删除一些页面上不需要的布局代码

grails应用程序视图布局公共gsp

<> ="" ="没有js">

    <> http等值="内容类型" 内容="文本html字符集UTF"/>
    <> http等值="兼容X UA" 内容="不不"/>
    跨度类标签g标题跨度类属性名称默认跨度类字符串跨度类分隔符跨度类内容自动目录跨度类分隔符跨度类标签跨度类标签
    <> 那么="视口" 内容="宽度装置宽度初始刻度"/>

    <> src="应用程序css"/>

    <>/>



<> ="导航栏导航栏默认导航栏静态顶部" 角色="导航">
    <> ="容器">
        <> ="导航栏标题">
            <> ="导航栏品牌" href="/#">
                <> ="fa grails图标">
                    <> src="徽标png"/>
                自动目录
        
<> ="导航栏崩溃崩溃" 咏叹调扩大="" 样式="高度: 像素;"> <> ="导航导航栏导航导航右"> <> 那么="页面导航" />
<>/> <> ="页脚" 角色="ContentInfo">

这种布局的重点是标签这些标签由SiteMesh替换为使用布局的任何GSP页面的各个部分

随意提供自己的徽标png图片或使用已完成项目或在此链接下载将图像放在365bet地区应用程式资产图片365bet地区目录和布局应呈现它而不是365bet地区徽标
不用担心新版式中的标签,不过我们很快就会介绍

现在编辑家庭索引gsp查看使用新的上市布局

grails应用程式检视首页索引gsp


    <> 那么="布局" 内容="上市"/> (1)
    span主页span类标签
1 将主要更改为公开

刷新页面或重新启动应用程序,您应该会看到新的布局,随时可以修改公共gsp如果您愿意,可以进一步布置

观看分辨率

365bet地区365bet地区如何选择按惯例渲染哪个视图365bet地区在grails应用程序视图目录它将尝试通过将控制器名称与目录下的目录进行匹配来解析对控制器操作的视图。意见目录E g家庭控制器将解决grails应用程式检视首页365bet地区然后365bet地区将动作映射到具有相同名称E g的GSP页面指数将解决索引gsp.

您还可以使用以下命令从覆盖365bet地区约定的控制器操作中呈现特定视图:渲染方法

 SomeController {
    定义 someAction渲染视图: 'anotherView'
    }
}

这将尝试解决anotherView gsp下页grails应用程序的观看次数如果要解析不在控制器自己的视图目录下的视图,请使用前导/指定从的绝对路径grails应用程序视图:

 SomeController {
    定义 someAction渲染视图: '另一种观点'
    }
}

这将解决查看gspgrails应用程序查看其他.

普遍优惠制

365bet地区GSP页面可以访问丰富的标签集我们已经看到了一些实际的操作您可以在可用的GSP标签上获得更多详细信息,包括如何从365bet地区文档中定义自己的自定义标签

让我们上汤吧索引gsp带有一些GSP标签的页面

编辑grails应用程式检视首页索引gsp

grails应用程式检视首页索引gsp
<页面导入车辆>


    <> 那么="布局" 内容="上市"/>
    span主页span类标签



<> ID="内容" 角色="主要">
    <> ="行紧身衣">
        

欢迎词 <> 测试="即时消息"> (1) <> ="信息" 角色="状态">即时消息

数据库中有车辆总数 <> ="车辆清单" ="车辆">
  • <> 控制者="车辆" 行动="节目" ID="车辆编号">车辆名称车辆年份车辆品牌名称车辆型号名称 <> 行动="updateName" 样式="余量: 0 汽车; 宽度:像素"> (2) <> 那么="那么" ="" /> <> 那么="更新名称" />
    1 而不是渲染即时消息不管它是否存在,我们都使用标记以测试是否有消息,然后使用某些自定义样式呈现消息
    2 替换纯HTML
    标签及其等效的GSP

    让我们仔细看看.

        <> 测试="这是真的>一些内容

    GSP标签可以选择接受以下属性:测试在此示例中,不同的标记需要使用不同类型的属性,但是通常您最终将像在此示例中一样,通过Groovy表达式传递两个之间的Groovy代码。${}将在服务器上评估,结果将在呈现的页面上替换

    您可以在GSP页面上的任意位置使用Groovy表达式,而不仅仅是在标签中使用。即时消息在我们的索引gsp

    其他标签属性可能接受纯字符串或数字E g

    GSP标签还可以选择包含主体仅当测试表达式在时髦真相约定其他GSP标签,例如只需将正文包含在结果HTML输出中

    GSP标签迭代

    迭代

    有用于迭代的GSP标签,一个非常有用的标签是让我们尝试一下

    grails应用程式检视首页索引gsp
    <页面导入车辆> (1)
    
    
            

    数据库中有车辆总数
      <> ="车辆清单" ="车辆"> (2)
    • <! -- ... -->

      标签会遍历由属性365bet地区设置集合中每个对象的名称365bet地区将遍历集合,在这种情况下,汽车由...返回车辆清单并渲染标记每个项目

      1 这是一个JSP样式表达式,允许执行任意Groovy代码而无需呈现结果。我们在这里使用它来导入我们的车辆这个是高度灰心丧气,我们会尽快解释原因
      2 直接从视图访问Domain模型的错误做法
      这种代码是馊主意我们正在访问我们的域模型车辆直接从我们的角度来看,它将应用程序的两个独立部分紧密地结合在一起,通常会导致代码非常混乱。要实现此功能,更好的方法是获取车辆列出HomeController索引动作,并将列表添加到要传递给我们的模型对象中响应然后,我们可以使用与访问列表相同的方式来引用列表那么车辆总数继续更改控制器,并查看使用此更好的方法,如果您需要帮助,则已完成的项目已进行了此更改

      让我们来看看另一种常见的GSP标签

      grails应用程式检视首页索引gsp
      车辆名称车辆年份车辆品牌名称车辆型号名称
      

      呈现HTML365bet地区标记,但它的优点在于,您可以按照365bet地区约定(例如本示例)使用365bet地区约定来指定链接目标控制者, 行动ID属性也足够聪明,可以遵循我们的网址映射,因此,如果我们更改以下网址的网址映射,车展标记仍会呈现正确的URL。看到365bet地区文档更多

      资产管道

      您可能已经注意到了一些GSP页面中的标记这些标记由Asset Pipeline插件提供,这是365bet地区用于管理静态资产图像CSS JavaScript文件等的默认工具。Asset Pipeline插件提供了一组自定义GSP标记,但与我们一直在探索的标记不同,它使用了资产前缀或名称空间

      最常见的标签在下面列出

      <> src="myscript js" /> (1)
      
      <> src="myimage png" /> (2)
      
      <> src="mystyles CSS" /> (3)
      1 该标签从grails应用程序资产javascript
      2 该标签从365bet地区应用程式资产图片
      3 这个标签从加载CSS文件grails应用程序资产样式表

      365bet地区如您所见,Asset Pipeline遵循365bet地区的先例,遵循了配置方法上的约定。然而Asset Pipeline是一个非常强大的框架,并且包含丰富的插件生态系统,您可以找到用于呈现LESS和SASS文件的插件CoffeeScript Ember Angular JSX React等

      资产管道还支持资产的压缩和压缩等等

      访问资产管道公司有关使用资产管道的更多信息,包括目录可用插件.

      添加JavaScript资产

      365bet地区让我们使用Asset Pipeline插件将jQuery添加到我们的页面中365bet地区默认包含jQuery本指南中使用的365bet地区版本默认包含jQuery

      grails应用程序资产javascripts jquery min js

      但是让我们下载最新版本,从下载jQueryhttps代码jquery com jquery js

      保存jQuery的JSgrails应用程序资产javascript.

      编辑grails应用程式检视首页索引gsp在中添加以下代码段

      grails应用程式检视首页索引gsp
      <> src="jQuery的JS" />
      
      <> 类型="文字javascript">
        $准备好文件功能控制台日志"jQuery已加载" );
        });
      

      刷新页面并打开浏览器的开发人员控制台,您应该看到字符串jQuery已加载在控制台日志中

      服务

      365bet地区提供了一个服务层,这些服务层是封装业务逻辑的类,并使用依赖注入到应用程序上下文中,以便任何控制器都可以注入和使用它们对于大多数应用程序逻辑,服务是首选工具控制器

      如果您对此感到困惑,则可以使用这种方式来使控制器响应请求并返回响应:服务可以在许多控制器之间以及在域类和其他服务中重用。服务更加通用,可以帮助您保持控制器的清洁并防止业务逻辑重复通常,针对服务方法编写单元测试要比针对控制器操作编写单元测试容易得多。

      控制器用于业务逻辑的Web逻辑服务

      365bet地区再次按照惯例,365bet地区将在365bet地区应用程序服务目录作为服务服务将被连接为春豆365bet地区在365bet地区应用程序上下文中,这意味着您可以通过名称从任何其他Spring bean中简单地引用它们,包括控制器和域类

      让我们添加一个功能以生成一个估计值车辆根据品牌模型和年份,我们将这个逻辑放入服务中,并从我们的应用程序代码中调用它

      使用创建新服务创建服务365bet地区365bet地区命令

      grailsw创建服务ValueEstimateService创建grails应用程序服务org grails指南ValueEstimateService groovy创建src测试groovy org grails指南ValueEstimateServiceSpec groovy

      编辑grails应用程序服务组织grails指南ValueEstimateService groovy

      grails应用程序服务组织grails指南ValueEstimateService groovy
      org grails指南进口 grails gorm Transactions事务性
      
      交易性
       ValueEstimateService {
      
          定义 serviceMethod() {
      
          }
      }

      365bet地区提供了一个serviceMethod以存根为例,将其删除并替换为以下内容

      grails应用程序服务组织grails指南ValueEstimateService groovy
      org grails指南进口 grails gorm Transactions事务性
      
      交易性
       ValueEstimateService {
      
          定义 getEstimate车辆车辆日志信息'估算车辆价值'
      
              TODO Call第三方评估API
              数学圆形车辆名称大小车辆型号名称大小车辆年份2
          }
      }

      显然,这种估算车辆价值的方法是非常虚构的。实际上,您可能会调用第三方Web服务来获取估值,或者可能对自己的数据库运行查询。但是,此示例的目的是说明那种业务逻辑可以放在服务中,而不是在控制器或视图中计算

      现在让我们使用我们的新服务

      编辑grails应用控制器org grails指南VehicleController groovy我们之前生成的脚手架控制器,并添加如下所示的属性

      grails应用控制器org grails指南VehicleController groovy
      静态的命名空间'脚手架'
      1 通过简单地在控制器中定义一个与我们的服务类同名的属性,365bet地区将为我们注入对该服务的引用

      现在仍在编辑VehicleController常规修改节目动作如下

      grails应用控制器org grails指南VehicleController groovy
      }
      
      定义 节目车辆

      我们已经在模型估计的价值此属性的值是调用我们的服务方法的结果getEstimate我们传递给车辆我们将要渲染的属性

      现在在节目我们可以访问的页面估计的价值属性并将其显示在页面上Editgrails应用程式浏览车辆显示gsp如下所示

      grails应用程式浏览车辆显示gsp
      "表演车" ="内容支架展示" 角色="主要">

      <G讯息码"默认显示标签"args"实体名称" /></H

      估计的: <G格式编号编号"${估计的价值}"类型"货币"货币代码"美元" /></H

      重新启动应用程序并浏览到显示页面以获取车辆http localhost车展您应该在页面上看到估计值

      测试您的应用

      365bet地区测试是Web应用程序开发的重要组成部分365bet地区支持三种类型的测试单元测试,集成测试和功能测试。单元测试通常是最简单的类型,专注于特定的代码段,而不依赖于应用程序的其他部分整合测试365bet地区需要365bet地区环境启动并运行,并用于测试依赖于数据库或网络资源的功能功能测试要求应用程序正在运行,并且旨在通过向应用程序发出HTTP请求来使其几乎像用户一样行使应用程序。这些往往是编写最复杂的测试

      365bet地区365bet地区使用的测试框架是斯波克365bet地区Spock提供了一种表达性的语法,用于基于Groovy语言编写测试用例,因此非常适合365bet地区。它包含一个JUnit运行器,这意味着IDE支持实际上是通用的,任何可以运行JUnit测试的IDE都可以运行Spock测试

      365bet地区即使在365bet地区应用程序之外,Spock还是一个丰富的框架,如果您还没有掌握Spock的话,那非常值得您花些时间来掌握。详尽的文件了解Spock

      365bet地区365bet地区测试按照惯例存储在src测试目录单元测试和src集成测试groovy目录集成功能测试

      365bet地区您可以使用以下命令运行365bet地区测试测试应用命令

      grailsw测试应用

      如果只想运行单元测试或集成功能测试,则可以传递命令行标志来选择一个或另一个

      grailsw测试应用程序单元grailsw测试应用程序集成

      您还可以通过将测试类作为参数来运行特定的测试

      grailsw test app org grails指南MyTestSpec

      编写测试是一个非常广泛的主题,值得一读。在实践中,最简单且通常最有用的测试是单元测试,因此让我们编写一个简单的单元测试来练习ValueEstimateService.

      365bet地区365bet地区会自动为使用以下工具创建的服务创建测试规范创建服务命令打开src测试groovy组织grails指南ValueEstimateServiceSpec.

      src测试groovy组织grails指南ValueEstimateServiceSpec
      org grails指南进口 grails测试gorm DataTest
      进口 免费测试服务ServiceUnitTest
      进口 spock lang规格
      
       ValueEstimateServiceSpec 延伸规格实施ServiceUnitTest数据测试定义 设定() {
          }
      
          定义 清理() {
          }
      
          虚空 "测试一些"() {
              期望:"整我"
                  真正 == 
          }
      }

      目前我们的测试规格有一项测试测试一些断言真假365bet地区365bet地区通过测试失败来帮助您鼓励做正确的事情

      尝试运行测试只是为了确认它失败

      grailsw test应用程序组织org grails指南ValueEstimateServiceSpec发生测试失败查看文件中的报告用户开发项目创建了第一个grails应用程序完整的构建报告测试报告html创建失败总时间(秒)测试失败测试执行失败

      既然我们已经确认测试失败了,我们就可以编辑该测试用例来执行getEstimate方法编辑src测试groovy组织grails指南ValueEstimateServiceSpec.

      src test groovy org grails指导ValueEstimateServiceSpec groovy
      org grails指南进口 grails测试gorm DataTest
      进口 免费测试服务ServiceUnitTest
      进口 spock lang规格
      
       ValueEstimateServiceSpec 延伸规格实施ServiceUnitTest数据测试虚空setupSpec(1)模拟域使模拟域模型模拟域车辆虚空testEstimateRetrieval给定: '一辆车'
              定义使使那么: '测试')
              定义模型模型那么: '测试', 使使定义车辆车辆: 2000, 使使模型模型那么: '试验车')
      
              什么时候: '服务被称为'
              定义估算服务获取估算车辆然后: '返回非零结果'估计0
      
              : '估计不是太大'估计1000000
          }
      }
      1 当使用365bet地区中更新的测试框架模拟多个对象时,我们现在在设置过程中执行模拟,并且不再需要Mock注释

      由于我们没有非常复杂的逻辑要测试,因此我们在此测试中保持了非常简单的状态,因此您可以专注于Spock测试用例的基本公式Spock提供了一组关键字,可让您将测试布局在易于阅读的形式

      如果一切顺利,请继续进行此测试,然后再进行测试

      grailsw test应用程式组织grails指南ValueEstimateServiceSpec建立成功的测试通过

      部署您的应用

      365bet地区开发365bet地区应用程序的最后一步是将完成的项目构建到可部署的程序包中。通常,将Java Web应用程序部署为WAR文件,而365bet地区通过使用战争命令

      grailsw war BUILD SUCCESSFUL使用环境生产构建用于构建库的应用程序

      我们没有涉及组态365bet地区在本指南中,尽管我们确实对配置文件进行了一些编辑,但是值得一提的是365bet地区支持环境的概念,例如开发测试和生产。每个环境可以有自己的配置属性和值,因此您可以在自己的配置之间进行不同的设置开发和生产系统默认情况下,战争命令使用生产环境,您可以使用Dgrails约像这样标记

      grailsw war Dgrails env开发内置成功使用环境开发来构建库的内置应用程序

      有了WAR文件后,我们可以将其部署到任何JEE容器中,例如雄猫.

      365bet地区恭喜,您已经构建了第一个365bet地区应用程序

      365bet地区您需要365bet地区帮助吗

      OCI赞助了本指南的创建OCI提供了几种365bet地区服务:

      免费咨询

      OCI 365bet地区团队包括365bet地区联合创始人Jeff Scott Brown和Graeme Rocher检查我们的365bet地区课程并向发展和维护365bet地区的工程师学习

      Grails OCI团队