在前一篇使用Grails快速开发应用程序(1)的应用中,我们配置好了Grials的环境。下面我们将做一些有用的事情。
首先说明我们的应用程序的需求。
我们这里有一个迷你图书馆。有大约几百本图书和几百个读者。兼职的图书管理员目前是将读者的借书信息用最传统的方式-白纸黑字来记载的。如下所示:
图书名称 | 借阅人 | 借书时间 | 还书时间 |
经济学 | 学术部 彭小米 | 2010年12月10日 | 2010年12月12日 |
c#本质论 | s1e188 钱小样 | 2010年12月11日 | 2010年12月12日 |
聪明的你可以分析出来。如果用软件系统来描述的话,至少要有3张表。分别是读者表、图书表和借阅记录表。
为了避免陷入系统分析的泥潭。我们先从最简单的图书这个实体类入手。在Grails当中,是以领域(Domain)编程为中心的,以领域类来作为程序的核心,从领域类来构造系统的服务类和表示层。这里图书实体类可以看做就是领域类(Domain Class)。
接下来我们就建立图书领域类:
c:> grails create-domain-class Book
实际上载建立领域类之前grails就已经帮我们建立好了如下的目录结构
其中Domain是存放领域类的。controllers存放控制器,views存放gsp文件。services表示服务层。i18n国际化。conf存放配置信息。
我们现在去domain文件夹中查看,在下面gamesys(项目名)文件夹下已经生成了一个名为Book.groovy的groovy类文件.
使用记事本打开它内容如下:
package gamesys
class Book {
static constraints = {
}
}
现在我们把图书领域类的属性加入到这个文件中去。修改后变成如下的内容:
package gamesys
class Book {
String bname //图书名称
String btype //图书分类
String publish //出版社
Date inTime //入库时间
Integer counter=0 //被借阅次数
Float price
String memo ="" //备注
static optionals=["publish","inTime","btype"] //表示publish等3个属性不是必填的
static constraints = {
}
}
在我们建立控制器类之前,我们目前还没有提到任何对象关系映射(ORM)的东西.Grails会认为所有放在Domain文件夹下来的实体类都需要持久化的操作。所有grails会自动帮我们完成所有的持久化操作。在后台grails利用了Hibernate来完成这个任务。那么我们可以先不用担心持久化了。
接下来我们要建立控制器了。
c:> grails create-domain-class Book
如果你的book的领域类建立的完全正确的话,那么将会在C:/gamesys/grails-app/controllers/gamesys文件夹下生成一个名为BookController.groovy的文件。同样用记事本打开内容如下:
package gamesys
class BookController {
def index = { }
}
这时你可以认为这时一个空的控制器,我们需要向其中加入对Book类的增删改查功能的代码。看起来不是个简单的任务。实际上我们只需要把BookController.groovy改成如下的代码
package gamesys
class BookController {
def scaffold=Book
}
当grails碰到scaffold属性时,它会自动生成对领域类的crud功能以及必要的视图。
现在该是看看我们的程序有哪些功能了。
c:>grails run-app gamesys
首先主页中有了一个控制器
点击进入能看到所有图书的列表,由于当前还没有图书,所有为空。但是你能看到相关的列名。同时有新建图书的链接
然后点击进入录入新图书界面
注意In Time这行,因为我们定义这个属性是日期型,所以grails自动加了年月日的下拉列表。
插入数据后点击图书列表就有了如下的结果:
同时你可以点击某个图书的ID来修改图书信息
修改完成最后返回图书列表。
好了,到目前为止,我们已经完成了图书类的增删改查的功能。 在以后的工作中我们还要继续完成用户类,借阅类以及3张表之间的关系。这次先到这里,休息。(未完待续)