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

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介: 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 .

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


接下来

相关文章
|
5天前
|
IDE Java 数据库连接
使用 Java 进行桌面应用开发
【4月更文挑战第19天】Java 是一款广泛应用于企业级、网络和桌面应用开发的编程语言。其跨平台特性使Java程序能在不同操作系统上运行,而JDK提供了开发所需工具和库。使用Swing等GUI库构建用户界面,结合JDBC进行数据库操作,Socket实现网络通信。虽然面临性能和用户体验的挑战,但通过优化和选用合适的IDE,Java仍能开发出高效稳定的桌面应用。
|
6天前
|
前端开发 Java Go
开发语言详解(python、java、Go(Golong)。。。。)
开发语言详解(python、java、Go(Golong)。。。。)
|
6天前
|
JSON Java fastjson
Spring Boot 底层级探索系列 04 - Web 开发(2)
Spring Boot 底层级探索系列 04 - Web 开发(2)
15 0
|
6天前
|
安全 编译器 PHP
PHP 8.1版本发布:引领Web开发新潮流
PHP编程语言一直是Web开发的主力军,而最新发布的PHP 8.1版本则为开发者们带来了更多创新和便利。本文将介绍PHP 8.1版本的主要特性,包括更快的性能、新的语言功能和增强的安全性,以及如何利用这些功能来提升Web应用程序的质量和效率。
|
6天前
|
人工智能 前端开发 Java
Java语言开发的AI智慧导诊系统源码springboot+redis 3D互联网智导诊系统源码
智慧导诊解决盲目就诊问题,减轻分诊工作压力。降低挂错号比例,优化就诊流程,有效提高线上线下医疗机构接诊效率。可通过人体画像选择症状部位,了解对应病症信息和推荐就医科室。
101 10
|
6天前
|
Java 关系型数据库 MySQL
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
UWB (ULTRA WIDE BAND, UWB) 技术是一种无线载波通讯技术,它不采用正弦载波,而是利用纳秒级的非正弦波窄脉冲传输数据,因此其所占的频谱范围很宽。一套UWB精确定位系统,最高定位精度可达10cm,具有高精度,高动态,高容量,低功耗的应用。
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
|
9天前
|
Web App开发 Java 应用服务中间件
【Java Web】在 IDEA 中部署 Tomcat
【Java Web】在 IDEA 中部署 Tomcat
|
9天前
|
PHP
web简易开发——通过php与HTML+css+mysql实现用户的登录,注册
web简易开发——通过php与HTML+css+mysql实现用户的登录,注册
|
10天前
|
前端开发 数据挖掘 API
使用Python中的Flask框架进行Web应用开发
【4月更文挑战第15天】在Python的Web开发领域,Flask是一个备受欢迎的轻量级Web框架。它简洁、灵活且易于扩展,使得开发者能够快速地构建出高质量的Web应用。本文将深入探讨Flask框架的核心特性、使用方法以及在实际开发中的应用。
|
14天前
|
运维 NoSQL 算法
Java开发-深入理解Redis Cluster的工作原理
综上所述,Redis Cluster通过数据分片、节点发现、主从复制、数据迁移、故障检测和客户端路由等机制,实现了一个分布式的、高可用的Redis解决方案。它允许数据分布在多个节点上,提供了自动故障转移和读写分离的功能,适用于需要大规模、高性能、高可用性的应用场景。
16 0