Day 6:在 Java 虚拟机上使用 Grails 进行快速 Web 开发

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: Grails 是一个基于 Groovy 和 Java 的开源 Web 框架。它是 Java 虚拟机(JVM)上顺应 Rails、Django 等流行 Web 框架而生的,伴随着标准的 Jetty/Tomcat 服务器,Grails 能帮助开发者进行快速的应用开发。在这篇文章中,我们会描述如何用 Grails 的 Eclipse 插件开发一个简单的 Web 应用。

在“30天学习30种新技术”的第六天,我决定去学习一个 web 开发框架 : Grails

Grails 是一个基于 Groovy 和 Java 的开源 Web 框架。它是 Java 虚拟机(JVM)上顺应 Rails、Django 等流行 Web 框架而生的,伴随着标准的 Jetty/Tomcat 服务器,Grails 能帮助开发者进行快速的应用开发。在这篇文章中,我们会描述如何用 Grails 的 Eclipse 插件开发一个简单的 Web 应用。


为什么我们选择 Grails?

这是考虑到两个原因:

1. 快速的 Web 开发:它在 Java 虚拟机和掌握的 Java 知识下,也能达到像 Rails 或 Django 那样的快速开发的目标。

2. 成熟的技术:Grails 是基于 Spring 和 Hibernate 打造的。它可以看作是在这些技术上加了语法糖(Syntactic Sugar)。


前期准备

  1. 一些基本的 Java 知识是需要的。
    2.在你的操作系统上安装最新版本的 JDK,你可以安装 OpenJDK 或者 Oracle JDK 7。OpenShift 支持 OpenJDK 6 和 7.
  2. 从 Eclipse 官网下载和你操作系统对应的最新版 Eclipse 安装包。在这篇文章写的时候,最新版的 Eclipse 包叫 Kepler.

image.png

安装 Eclipse 非常容易。只需要解压你下载的安装包就可以了。在 linux 或者 Mac 系统上,打开终端,然后输入:

$ tar -xzvf eclipse-jee-kepler-R-*.tar.gz


在 Wdinows 系统上,你可以用 winzip 或者 7-zip 或者其它解压软件来解压。解压之后,在文件夹里面应该能能看到一个名为 eclipse 的文件夹。你可以按自己意愿为运行程序文件创建一个快捷方式。

安装 Grails:

请参阅 Grails 的开始使用指引.

现在这篇文章使用的 Grails 版本为 2.3.1。 在命令行下运行 grails -version 能查看你当前的 Grails 版本:

$ grails -version

Grails version: 2.3.1

当我第一次运行查看版本的命令时,我得到是以下的报错:

$ grails -version

Exception in thread "main" java.lang.NoClassDefFoundError:

org/codehaus/groovy/grails/cli/support/GrailsStarter

这个错误的原因是我这个机子上 Grails 的版本太老了。如果用的是 mac,转到 /usr/local/bin 目录下,你或者找到另一个安装文件。我以前可能不记得我安装过 grails 了,所以我先把旧版卸载了:

brew uninstall grails


第一步:安装 Eclipse Grails 插件

当你解压了和 Java EE 对应的 Eclipse Kepler IDE 之后,打开 Eclipse,然后从导航转到 项目的工作空间(Project Workspace)。打开菜单的 Help > Eclipse Marketplace,然后搜索 Grails。安装"Eclipse Kepler(4.3)的 Groovy/Grails 工具套件"。插件安装之后重启 Eclipse。


第二步:创建一个新的 Grails 项目

在这篇文章中,我们的目标是编写一个简单的链接分享应用。用户可以首先注册应用,然后自己提交链接。


创建一个新项目:文件 > 新建 > Grails 项目,然后完善项目信息。这个应用的名字是 Linkbin。


当我们第一次创建 Grails 项目时,我们必须配置 Grails 的安装环境。点开"Grails 安装配置(Configure Grails Installations)",然后增加一个新的 Grails 安装。

像在下图那样,我们可以自己为项目设置一个不同的存放路径。然后完成后,点击"完成(Finish)"按钮。

image.png

Eclipse 会问我们是否需要打开"Grails 视角(Grails perspective)",选择"是"。项目就会被创建,然后被导入到 Eclipse 里面。


第三步:创建一个领域模块(Domain model)

应用的领域模块非常简单,我们需要两个条目:User 和 Story。

User 条目有两个属性:emailfullName。我们会为 email 属性增加 not blankemailunique 限制。email 限制能把这个属性的内容检测限定为 email 格式。fullName 属性有 not blanksize两个限制。其中,size 的量使用 groovy 的 range 来限定长度集合、数字或者内容长度等的大小。为了创建一个新的 domain 类,右击 domain,然后选择 New > Domain Class.

这会创建一个 User 领域类(domain class)。用下面的代码代替 User 领域类的代码:

package linkbin

classUser {

   String email

   String fullName

   static constraints = {

       email unique:true , blank : false , email:true

       fullName size:5..100  , blank : false

   }

}

Story 条目也有三个属性:link,description,submittedOn. link 属性对应用户所提交的网址,description 和 submittedOn 是所提交网址的额外文字内容和提交日期。我们会为 link 和 description 属性加上 not blank(非空)限制。同样的,link 属性也会被加上 unique 和 url 限制。

package linkbin

class Story {

   String link

   String description

   Date submittedOn

   static constraints = {

       link url : true , blank : false ,unique : true

       descriptionsize : 10..1000 , blank : false

   }

}

现在,我们连接 User 和 Story 起来。 一个用户可以提交多个故事,每个故事都都有所属的用户。它们的关系如下所示:

package linkbin

classUser {

   String email

   String fullName

   static hasMany = [stories : Story]

   static constraints = {

       email unique:true , blank : false , email:true

       fullName size:5..100  , blank : false

   }

   static mapping = {

       table 'users'

   }

}

一个故事属于一个用户:

package linkbin

class Story {

   String link

   String description

   Date submittedOn  

   static belongsTo = [user : User]

   static constraints = {

       link url : true , blank : false ,unique : true

       descriptionsize : 10..1000 , blank : false

   }

   static mapping = {

       table 'stories'

   }

}

第四步:从领域模块搭建控制器和视图

在 Grails 上,要为领域模块产生控制器(controller)和视图(view)非常简单。为了为 User 的领域类产生控制器和视图,打开"Grails Command Wizard".

image.png

它会在能看见所有 Grails 命令的地方打开命令向导(wizard)。我们会使用 generate-all 命令去产生控制器和视图。

下一步它会询问领域类的名字。输入 linkbin.User 然后,点击"完成"。

类似的,为 Story 领域类产生控制器和视图。

那个 Generate-all 命令会为这两个条目生成 CRUD 控制器和视图。


第五步:运行程序

每个 Grails 项目都自带连接了一个 tomcat 服务器。为了在本地上运行程序,右击项目,然后选择"运行 grails 应用"(Run as Grails app)。

这会启动内嵌的 tomcat 程序容器,然后我们能在控制台看到以下的日志:

| Loading Grails 2.3.1

| Configuring classpath.

| Environment set to development.....

| Packaging Grails application.....

| Running Grails application

| Server running. Browse to http://localhost:8080/linkbin


配置到云上

Grails 应用会被打包成 war 格式的文件。OpenShift 是一个开源的,公开的,可扩展的服务平台。如果你是一个 Java,Python,Node.js, Ruby 或者 php 开发者,你应该留意下 OpenShift 。在 OpenShift,你可以免费把你的程序部署字在上面。

在我们部署应用到 OpenShift 之前,我们要做先做这些事情:

1. 注册一个 OpenShift 账户。这是完全免费的,而且红帽(Red Hat)会给每个用户三个免费的 Gears,在 Gears 上你可以运行你的程序。在这篇文章写的时候,OpenShift 会为每个用户分配 1.5GB 的内存和 3GB 的硬盘空间。

2.在本机上,安装 rhc 客户端工具。rhc 是一个 ruby gem,所以你需要机子上安装好 ruby 1.8.7 及以上的 ruby。要安装 rhc,输入:

sudo gem install rhc

更新 rhc 到最新版本,执行:

sudo gem updatge rhc

如果需要阅读额外的安装 rhc 命令行工具时的帮助文件,可以浏览:https://openshift.redhat.com/community/developers/rhc-client-tools-install

3.使用 rhc setup 命令设置好 OpenShift 账户,这个命令会为你创建一个命名空间,然后上传你的 ssh keys 到 OpenShift 服务器上。

OpenShift 也有一个 Eclipse 插件,但这篇文章中,我会使用 rhc 命令行工具。

在设置好之后,运行下面命令创建 OpenShift 应用:

$ rhc create-app linkbin tomcat-7 postgresql-9.2

它会为我们创建一个应用容器,叫做 Gear,会自动设置好需要的 SELinux/cgroup 配置。OpenShift 也会为我们建立一个私密的 git 仓库,然后可克隆这个仓库到本地系统上。最后,OpenShift 还会部署一个连接外面的 DNS。部署的应用可以通过链接: http://linkbin-domain-name.rhcloud.com/ 来访问。把领域换成自己的 OpenShit 领域(有时候叫 命令空间)

由于我们要部署 war 文件,我们必须删除由 OpenShift 默认产生的资源文件。

$ git rm -rf src/ pom.xml

$ git commit -am "deleted default source code"

打开 Eclipse,用 postgresql 改变数据来源的配置。Grails 在 conf/Datasource.groovy 文件中维护所有的数据库配置。更新生产环境的配置以使用 PostgreSQL.

production {

   dataSource {

       dbCreate = "update"

       driverClassName = "org.postgresql.Driver"

       dialect = org.hibernate.dialect.PostgreSQLDialect  

   uri = new URI(System.env.OPENSHIFT_POSTGRESQL_DB_URL)

   url = "jdbc:postgresql://"+uri.host+uri.path+"/"+System.env.OPENSHIFT_APP_NAME

       username = System.env.OPENSHIFT_POSTGRESQL_DB_USERNAME

       password = System.env.OPENSHIFT_POSTGRESQL_DB_PASSWORD

   }

}

现在我们需要把 grails 应用打包成 war 文件。我们会使用 grails 的 war 命令来完成这个。打开 "Grails Command Wizard", 使用 war 命令。它会询问一个名字作为 war 文件的名字,我们把文件设成:target/ROOT.war。 她会在目标文件中生出 ROOT.war 文件。复制 ROOT.war 到 OpenShift linkbin 应用的 webapps 文件夹中。

现在,把 war 文件也加入到你的 git 仓库中,然后 push 改变的内容。

$ git add .

$ git commit -am "linkbin app deployed to cloud"

$ git push

当代码成功推送(push),而 war 也成功部署之后,我们可以访问:http://linkbin-{domain-name}.rhcloud.com 来看看程序运行的情况。

作为一个教训性质的 demo,项目的最终效果你可以在这里看到:http://linkbin-shekhargulati.rhcloud.com .

这就是今天的内容了。我希望这篇文章能帮到阅读这个系列的开发者们。随时欢迎反馈信息、


接下来

相关文章
|
16天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的服装商城管理系统
基于Java+Springboot+Vue开发的服装商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的服装商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
50 2
基于Java+Springboot+Vue开发的服装商城管理系统
|
14天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的大学竞赛报名管理系统
基于Java+Springboot+Vue开发的大学竞赛报名管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的大学竞赛报名管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
32 3
基于Java+Springboot+Vue开发的大学竞赛报名管理系统
|
15天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的蛋糕商城管理系统
基于Java+Springboot+Vue开发的蛋糕商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的蛋糕商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
40 3
基于Java+Springboot+Vue开发的蛋糕商城管理系统
|
15天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的美容预约管理系统
基于Java+Springboot+Vue开发的美容预约管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的美容预约管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
25 3
基于Java+Springboot+Vue开发的美容预约管理系统
|
16天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的房产销售管理系统
基于Java+Springboot+Vue开发的房产销售管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的房产销售管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
34 3
基于Java+Springboot+Vue开发的房产销售管理系统
|
15天前
|
存储 网络协议 Java
Java NIO 开发
本文介绍了Java NIO(New IO)及其主要组件,包括Channel、Buffer和Selector,并对比了NIO与传统IO的优势。文章详细讲解了FileChannel、SocketChannel、ServerSocketChannel、DatagramChannel及Pipe.SinkChannel和Pipe.SourceChannel等Channel实现类,并提供了示例代码。通过这些示例,读者可以了解如何使用不同类型的通道进行数据读写操作。
Java NIO 开发
|
3天前
|
安全 Java API
Java 泛型在安卓开发中的应用
在Android开发中,Java泛型广泛应用于集合类、自定义泛型类/方法、数据绑定、适配器及网络请求等场景,有助于实现类型安全、代码复用和提高可读性。例如,结合`ArrayList`使用泛型可避免类型转换错误;自定义泛型类如`ApiResponse<T>`可处理不同类型API响应;RecyclerView适配器利用泛型支持多种视图数据;Retrofit结合泛型定义响应模型,明确数据类型。然而,需注意类型擦除导致的信息丢失问题。合理使用泛型能显著提升代码质量和应用健壮性。
|
12天前
|
存储 算法 Java
深入解析 Java 虚拟机:内存区域、类加载与垃圾回收机制
本文介绍了 JVM 的内存区域划分、类加载过程及垃圾回收机制。内存区域包括程序计数器、堆、栈和元数据区,每个区域存储不同类型的数据。类加载过程涉及加载、验证、准备、解析和初始化五个步骤。垃圾回收机制主要在堆内存进行,通过可达性分析识别垃圾对象,并采用标记-清除、复制和标记-整理等算法进行回收。此外,还介绍了 CMS 和 G1 等垃圾回收器的特点。
46 0
深入解析 Java 虚拟机:内存区域、类加载与垃圾回收机制
|
16天前
|
开发框架 JSON 缓存
震撼发布!Python Web开发框架下的RESTful API设计全攻略,让数据交互更自由!
在数字化浪潮推动下,RESTful API成为Web开发中不可或缺的部分。本文详细介绍了在Python环境下如何设计并实现高效、可扩展的RESTful API,涵盖框架选择、资源定义、HTTP方法应用及响应格式设计等内容,并提供了基于Flask的示例代码。此外,还讨论了版本控制、文档化、安全性和性能优化等最佳实践,帮助开发者实现更流畅的数据交互体验。
37 1
|
2天前
|
存储 分布式计算 Java
Stream很好,Map很酷,但答应我别用toMap():Java开发中的高效集合操作
在Java的世界里,Stream API和Map集合无疑是两大强大的工具,它们极大地简化了数据处理和集合操作的复杂度。然而,在享受这些便利的同时,我们也应当警惕一些潜在的陷阱,尤其是当Stream与Map结合使用时。本文将深入探讨Stream与Map的优雅用法,并特别指出在使用toMap()方法时需要注意的问题,旨在帮助大家在工作中更高效、更安全地使用这些技术。
9 0