Grails项目实现-购物车 过程文档(1)
Grails项目实现-购物车 过程文档
一.准备工作:
1.环境设置:
IDE:IntelliJ IDEA 2016.3.4版本
JDK:jdk1.7.0.45
Grails:grails-2.2.0
Jdbc驱动包:mysql-connector-java-5.1.6-bin.jar
2.用IDEA创建项目,项目名称为GDepot
3.数据库搭建
3.1 将MySQL的驱动包mysql-connector-java-5.1.6-bin.jar
复制到项目文件夹的lib中
3.2 打开grails-app\conf\DataSource.groovy修改内容
修改的内容如下:
3.3创建领域Domain类 Goods 和Category,分别添加属性(字段),可知商品和分类的关系是一对多的关系,Category类中的constraints闭包,定义了对Category表中数据的约束条件,即是为CategoryName字段添加唯一性约束,代码如下:
注:categoryName添加唯一性约束,唯一性,可以空,但只能有一个。
PS:数据库的五大约束
1.—-主键约束(Primay Key Coustraint) 唯一性,非空性
2.—-唯一约束 (Unique Counstraint)唯一性,可以空,但只能有一个
3.—-检查约束 (Check Counstraint) 对该列数据的范围、格式的限制(如:年龄、性别等)
4.—-默认约束 (Default Counstraint) 该数据的默认值
5.—-外键约束 (Foreign Key Counstraint) 需要建立两表间的关系并引用主表的列
3.4 在mysql中创建DataSource.groovy配置的三个环境的数据库:
1.mysql –u rooy –p
2.
3.show databases;
4.
5.desc goods;
数据库自动为每张表创建了id的主键和一个version的字段(源自hibernate的乐观锁机制),并且在goods表中category_id字段实现了与category表的关联。
6.修改grails-app\conf\BookStrap.groovy文件的内容,让程序启动时自动添加几条数据:
程序启动时,Grails会自动添加一个商品分类和两件商品。
(注:发现运行多次,发现数据库添加进category数据,但是goods中的数据始终添加不进去。这是因为category表中的categoryName进行了唯一约束,不能有重复值‘Book’值添加,因此category.save()没有执行。解决方法:更换一个新的categoryName的值,如‘AAA’就能成功保存数据。)
二.查看商品列表
1.让Grails生成这两个Domain的CRUD页面:生成对应的Controller和views页面。在Controller页面加上:def scaffold = true。
访问; http://localhost:8080/GDepot/goods/list 页面如下
(注意: 生成对应的Controller和views页面选择generate controller/views)
2.修改显示商品列表的页面(grails\view\goods\list.gsp)
分析:
页面展示效果:
3.修改商品明细的页面
4.创建和编辑页面
三.商品搜索
1.构建查询表单
在grails-app/views/goods/下创建一个新的gsp页面,searchForm.gsp,复制goods下edit.gsp的代码复制过来后进行修改。
注意表头需要引入相应的文件:
修改的代码如下:
页面展示如下:
2.复杂的数据库查询
Hibernate给程序员提供了方案就是构建Criteria查询,他可以以一种优雅的方式拼接很复杂的查询逻辑,Grails对Hibernate的Criteria查询进行了更优雅的封装,为它提供的组件名叫做HibernateCriteriaBuilder。在GoodsController中添加def search 代码:
3.数据库的分页查询
提供分页功能的实现,也就是两件事:一件事是进行分页的查询,另一件事是在页面显示时能提供一个可以在不同页切换的分页导航。
要实现分页查询,HibernateCriteriaBuilder提供了多种实现方式。在闭包中,可以使用maxResults()和firstResult()方法去控制分页的查询。
3.1
由于分页后还要在页面上显示总页数信息,还需要查询数据库,以计算出符合条件的数据总数,使用count方法,代码如下:
3.2
然而这样一来,两个查询逻辑相似,就造成了代码的重复,因此作出以下修改:
3.3
将逻辑查询提取出来,取名为searchClosure,然后分别用HibernateCriteriaBuilder的list方法和count方法对数据库进行查询。
3.4 当调用HibernateCriteriaBuilder的list()方法时,如果传入两个参数,且一个参数是Map,则该list方法将进行分页查询。单页的大小(maxResults)和第一条记录位置(firstResult)分别由Map得max和offset两个key来指定。此时返回的goods是由Grails提供的grails.orm.PagedResultList类的实例,多了一个totalCount属性,这个属性的值就符合查询条件的记录总数。
(注:在文件中值传递含义一定要弄清楚)
搜索成功页面:
List.gsp:
注解:grails框架的g:paginate分页标签的使用
我用到的grails是2.4.4。该版本下游一个标签g:paginate
该标签下有以下几个参数:total(必须要填写的项)、controller、action、prev、max、offset等等,我用到的有这几个参数,详细参数的使用参考API文档。
1.分页:(Tsystemparam是我代码的一个域类),前台代码:写在控制器下需要执行的方法
params.max=5//给params参数附一个map集合key=max、value=5,每页展示的数据条数
\跳转到showsysParamList.gsp页面,传递到前台的map集合带有查出来的所有数据和数据的总数量,在使用list方法时一定要传入params参数,因为params参数设置了每页显示的数据量和offset(偏移量,如果不设置max和offset则默认值为10,设置了max之后offset可以根据数据来自动调整偏移量)。统计的数量的总个数一定要传递个前台,用前台的total来接收。
render(view:”showsysParamList”,model:[sys:Tsystemparam.list(params),sysCount:Tsystemparam.count()])
2.条件分页
//给params添加map集合key=max,value=5
params.max=5;
//Grails的 HibernateCriteriaBuilder 实例,可用来构建Criteria查询。
def c = Tsystemparam.createCriteria()
//params的值必须要有,否则会无法使用totalCount方法
def results = c.list(params) {
like(“name”, “%w%”)
//如果查询的条件不写死的话可以在下边传值时传给前台带着走
//可以带其他条件查询或者排序,我的只用到了模糊查询其余的都省略了
//and {
// between(“balance”, 500, 1000)
// eq(“branch”, “London”)
//}
//maxResults(10)
//order(“holderLastName”, “desc”)
}
//totalCount方法只有在def results = c.list(params) {传递给list方法params参数才可以使用params可以使用max:5,offset:0来代替
render(view:”showsysParamList”,model:[syst: results, sysCount:results.totalCount])
前台代码:只需添加该标签即可
total接收到的是控制器传递过来的查询出来的总共的数量,如果在前台没有设置max和offset可以在p:paginate标签下添加max和offset参数,效果同控制器中添加
4.将查询改造成inner join,通过FetchMode()方法,设置对其他表的抓取模式为主动抓取,从而实现主动链接其他表。
四.用户注册与登录
1.创建存储用户信息的Domain类-User,以及对应Controller和gsp。
运行后结果:
验证过程的原理:
Controller:
Gsp:
自定义验证改为中文:
验证:
2.用户注册
在Grails中,除了可以用Domain进行表单校验,还可以用命令对象(Command Object),它也一样可以用contraints闭包去描述数据约束,一样可以用hasErrors方法去验证数据是否合法。唯一的不同,它与数据库无关,因而不能执行数据库的相关
命令对象的类名为XXXCommand,可以存放在src\groovy中,也可以直接写在Controller类中。
现在在src\groovy中创建一个名为RegisterCommand.groovy的文本文件(groovy class)。
以其中一个passwordagain的校验为例:
Create.gsp(!)
效果展示:
以上是一个简单的未成形的用Grails框架实现购物车的项目,部分摘选自《Grails技术精解与Web开发实践》,需要源码和接下去部分的学习欢迎找我,一起进步。