CAE开发日志(3):Condition类

来源:互联网 发布:iphone7p淘宝店铺 编辑:程序博客网 时间:2024/06/03 16:55

在CAE的后台代码中,我专门设计了一个Condition类,这个类主要是用来处理前端的分页或者复杂的查询请求的,下面是这个类的UML图。


可以看到,这个Condition只是一个普通的Java类,但是这个Java类可以有效地减少各层接口方法的参数数量甚至是方法数,使得程序更有OOP的味道。

Condition的前三个属性,page、pageStart、pageLimit是为了前端的分页查询来服务的。一般来说,后台暴露给前端的参数的含义不应该太过复杂,而且要易懂,以前我做分页的时候,就会让前端传start和limit给我,但是前端如果没有接触过分页以及了解分页的一些原理的话,可能就会很难理解为什么要传这个多东西,start和limit是分页里面最重要的两个参数,只要前端传过来后台,我直接把这两个数传进sql的LIMIT子句即可,当然,这种交互设计就相当于把后台的编程难度转移到了前端而已。

在CAE的交互设计中,前端不需要再理会什么start和limit,前端只需要传一个page,表示目前是第几页即可。而这个page变量就是Condition类的page成员了。

而limit,也就是Condition类的pageLimit成员目前也不需要前端传,因为每个需要分页的页面的limit都会由后台的常量来维护,这个只需要和前端协商好limit的数量就可以了,之所以可以写死在后台,是因为即使limit写在客户端,它在很少情况下会修改,所以理论上limit放到哪里都行,既然如此,为何不放到后台呢,而且还能降低前端的编程难度。

但是真正传入sql的LIMIT子句的是start,可以看到Condition类是没有pageStart的setter的,那么pageStart从哪里注入呢?实际上不需要注入,因为start就是通过limit和page计算出来的一个变量而已,首先来梳理一下page、start、limit三个变量之间被赋值的顺序吧。

首先,客户端传入一个page变量到Condition对象中,这时page变量就赋值成功了;随后,后台自动把pageLimit注入到已经有page变量的Condition对象(现在是在service层干这事);最后,根据page和pageLimit计算得出pageStart。

那么,只需要在setLimit的时候,同时把start给算出来不就可以了吗?于是Condition类的setPageLimit方法定义如下:

public void setPageLimit(Integer pageLimit) {this.pageLimit = pageLimit;this.pageStart = (page-1)*this.pageLimit;}

也就是说,在调用pageLimit的setter的时候,pageStart也一并算出来了。

通过以上设计,前端就可以只传一个page代表现在需要第几页的数据,分页就可以完成了。

除了page、pageStart、pageLimit以外,其他成员对查询也会起到一定的作用。

timeStart和timeEnd,这对变量就可以用来指明一个时间范围,通常时间搜索都是一个区间,也就是需要两个变量来存储这个条件(一个下限时间,一个上限时间),对于一般的字段来说,可以使用实体类去存储搜素条件,但是因为时间是一个区间,而实体类只有一个时间字段,所以不能使用实体类来存储时间类型的条件(当然,如果能保证搜索条件的时间只有上限或下限的话,使用实体类也是可以的)。

使用String类型而不是Timestamp或者Date类型是为了和前端兼容,因为前端并不一定懂Timestamp或者Date类型,但是字符串是一定可以轻松注入的。

目前还没有出现日期区间查询的需求,所以该变量仍未被使用。


tokenString,这个是用于token令牌,也就是防止二次提交用的,关于如何防止二次提交之后看机会再写文,因为现在还不需要使用token,所以该变量仍未被使用。


orderBy和orderDir,这两个变量是用于排序用的,一个是指明排序的列,一个是指明排序的方向,因为是String类型的,所以需要和前端在交接文档中协商应该传什么字符串过来,这个字符串不能乱传,因为是直接传入到sql的ORDER BY子句中的,这个设计可能不太好,得不到强语言的拼写检查支持,而且只能支持所有列同一方向的排序,如果需要“ORDER BY name ASC,time DESC”这样的复合排序的情况时,单纯的String类型的orderBy和orderDir就很难支持了,不过现在还没有出现这么复杂的情况,这个问题可以先不解决,后续可以考虑把这个再抽离成一个Order类,然后里面是一个一个的键值对来表示排序的列和排序方向。


extraInfo,专门记录额外的信息,如果前面的变量都无法满足前端传参的需求或者是一些非常特别的页面需要传入特殊的参数时就可以使用这个extraInfo,但是String类型的扩展性可能不高,后续有可能改成Map类型的。目前该变量仍未被使用。

0 0
原创粉丝点击