Grails小技巧
一、Controlller中params
Controlller中params是grails框架中的GrailsParameterMap类,继承自TypeConvertingMap,而不是一个简单的Map,
除了支持普通的Map方法以外,还有其他几个方法非常有用
Integer int(String name);
Long long(String name);
Double double(String name);
Short(String name);
List list(String name);
若需要得到数值类型的参数就非常方便了
int max= params.int("max")?:10;
二、分页
其实使用Grails做分页功能是最easy的事情,因为Domain类的Criteria的list方法返回的结果就是带有分页所用信息的PagedResultList类
Domain的动态方法会检查是否调用的是list方法,若是则会使用Hibernate Criteria.setProjection(Projections.rowCount())方法,根据条件查询总数。想深入了解可以看看
HibernateCriteriaBuilder.java源码。
public class HibernatePluginSupport {
private static addQueryMethods(GrailsDomainClass dc, GrailsApplication application, ApplicationContext ctx) {
...;
metaClass.static.createCriteria = {-> new HibernateCriteriaBuilder(domainClassType, sessionFactory)}
...;
}
}
//groovy 动态机制
public class HibernateCriteriaBuilder {
public Object invokeMethod(String name, Object obj){
createCriteriaInstance();
// 检查分页参数,一个参数是Map,包含分页参数
if(name.equals(LIST_CALL) && args.length == 2) {
paginationEnabledList = true;
orderEntries = new ArrayList<Order>();
invokeClosureNode(args[1]);
} else {
invokeClosureNode(args[0]);
}
...
if(paginationEnabledList) {
this.criteria.setFirstResult(0);
this.criteria.setMaxResults(Integer.MAX_VALUE);
this.criteria.setProjection(Projections.rowCount());
int totalCount = ((Integer)this.criteria.uniqueResult()).intValue();
// Drop the projection, add settings for the pagination parameters,
// and then execute the query.
this.criteria.setProjection(null);
for(Iterator<Order> it = orderEntries.iterator();it.hasNext();){
this.criteria.addOrder(it.next());
}
this.criteria.setResultTransformer(CriteriaSpecification.ROOT_ENTITY);
GrailsHibernateUtil.populateArgumentsForCriteria(targetClass, this.criteria, (Map)args[0]);
PagedResultList pagedRes = new PagedResultList(this.criteria.list());
// Updated the paged results with the total number of records
// calculated previously.
pagedRes.setTotalCount(totalCount);
result = pagedRes;
}
}
}
PagedResultList类除了实现List接口外,添加了totalCount属性即记录总数,然后view层max和offset参数来控制分页就可以了,非常的方便
//params已有order、sort、max、offset的分页排序信息
params.max = Math.min(params.int('max') ?: 15, 100)
def criteria = CellPhoneModel.createCriteria();
def pageList = criteria.list(params, {
if(params['factory.id'])
factory {
eq("id",params.long('factory.id'))
}
if(params.keyword)
like("abbreviateName","%${params.keyword}%")
});
等有空再说说Grails Security结合Named URL Mappings功能简化Requestmap配置的问题
分享到:
相关推荐
Grails Grails Grails Grails Grails
Grails权威指南Grails权威指南Grails权威指南Grails权威指南Grails权威指南Grails权威指南
Grails项目的应用越来越多,而对于初学者来说,在Eclipse下搭建Grails项目是一个难题,这个文档将教会你如何搭建Grails项目,希望对你有所帮助。
Grails入门指南中文pdf -- 针对grails1.0.4更新,附加idea8 开发grails的流程
Grails1.1中文文档
在学习任何东西之前,最重要的是培养兴趣,Groovy世界最耀眼的技术之一--Grails相信大家早已耳闻,我将通过Grails实战系列文章 向您展现Grails的迷人风采,使您感受到Grails的魅力,以至疯狂地爱上Grails,并坠入...
grails+Xfire webservice
grails-2.1.zip.001
Grails 中文 参考手册
详细讲解grails开发环境配置。 详细讲解grails连接mysql数据库,crud开发
grails3.2.8 part1
Grails专为下一代JavaWeb应用程序而设计的框架,其借助于Groovy动态语言,使Web开发变得简单而方便。Grails尽量为更多现有的Java项目创建一个全面的框架(不仅局限于视图处理),这和当前一些Java框架提供给用户的一...
grails grails入门经典 grails入门 grails例子 grails资料 通过自学一点点积累起来的,相信对你有帮助的。
grails-2.3.6
Grails 1.3.7英文版官方参考手册,学习Grails的权威指南
grails 中文文档+grails-fckeditor-0.9.5.zip插件
grails参考文档 The Grails Framework - Reference Documentation Authors: Graeme Rocher, Marc Palmer Version: 1.0.3
grails的插件系统也是其亮点之一。首先,和rails,django等web框架类似,基于微内核的思想,插件(可重用模块)是框架的一等公民。grails除了核心模块以外的功能几乎都是通过插件方式实现的。实际上,一个grails插件...
比较难找的grails的资料,我也是找了很久才找到的。需要grails相关的拿走