`

grails ajax分页标签实现

阅读更多
grails ajax分页标签实现
一、设计目标
1、采用ajax实现
2、要多少条数据,取多少条,不从数据库中一次性全部取出
3、实现指定页面跳转
4、用户可以指定选择每页显示几条数据
5、按那个字段排序
6、最好不要占用session
二、如何实现
2、传入参数:显示页码,共有多少条数据,每页显示几条数据,返回的页面
       可选按那个字段排序

        if(!params.total){
            params.total=TestAjaxPage.count()///这个必须要,ajax请求时就不用在count总数了
        }
        params.view=params.view==null?"list":params.view
        params.max = Math.min(params.max ? params.max as int : 2, 100)
        params.linkTotal = Math.min(params.linkTotal ? params.linkTotal as int : 2, 100)
        params.offset = Math.min(params.offset ? params.offset as int : 0, 100)
        params.sort=params.sort==null?"dateCreated":params.sort
        params.order=params.order==null?"desc":params.order
截个图:

talib code
import org.springframework.web.servlet.support.RequestContextUtils as RCU;
import org.codehaus.groovy.grails.commons.ConfigurationHolder
class AjaxPageTagLib {
    def paginateAjax={attrs ->
        def writer = out
        params.offset = Math.min(params.offset ? params.offset as int : 0, 100)
        params.sort=params.sort==null?"dateCreated":params.sort
        params.order=params.order==null?"desc":params.order
        def messageSource = grailsAttributes.getApplicationContext().getBean("messageSource")
        def locale = RCU.getLocale(request)       
        def total = attrs.total.toInteger()
        def offset = params.offset?.toInteger()
        def max = params.max?.toInteger()
        int pageSize=Math.round(Math.ceil(total / max))   
        def path=request.getContextPath()   
        def pageNow=offset/max+1
        def selectMax=attrs.selectMax?.toInteger()
        if(!selectMax){
            selectMax=20
        }
        selectMax=selectMax>total?total:selectMax
        ////js输出
        writer<<"""
         <div id="ajaxPage">
        """
        /////显示首页和上页
        def firstText=messageSource.getMessage('paginate.first', null, messageSource.getMessage('default.paginate.first', null, 'First', locale), locale)
        def prevText=messageSource.getMessage('paginate.prev', null, messageSource.getMessage('default.paginate.prev', null, 'Prev', locale), locale)
        def nextText=messageSource.getMessage('paginate.next', null, messageSource.getMessage('default.paginate.next', null, 'Next', locale), locale)
        def lastText=messageSource.getMessage('paginate.last', null, messageSource.getMessage('default.paginate.last', null, 'Last', locale), locale)
       
        if(offset!=0){
            def firstUrl="""offset=0&max=${params.max}&sort=${params.sort}&order=${params.order}&total=${total}"""
            writer<<"""
            <span id="firstShow" title="${firstText}" onclick="new Ajax.Updater('${attrs.update}',
        '${path}/${params.controller}/${params.action}',{asynchronous:true,evalScripts:true,parameters:'${firstUrl}'});
        return false;" >
            [${firstText}]
            </span>
            """
            int prev=offset-max
            def prevUrl="""offset=${prev}&max=${params.max}&sort=${params.sort}&order=${params.order}&total=${total}"""
            writer<<"""
                <span id="preShow" title="${prevText}" onclick="new Ajax.Updater('${attrs.update}',
            '${path}/${params.controller}/${params.action}',{asynchronous:true,evalScripts:true,parameters:'${prevUrl}'});
            return false;" >
                [${prevText}]
                </span>
                """
        }
        else{
            writer<<"""<span id="firstNoShow" title="${firstText}">
                      [${firstText}]
                      </span>
                """
            writer<<"""<span id="preNoShow" title="${prevText}">
                    [${prevText}]
                    </span>
                    """
        }
        ////数据信息输出
        writer<<"""<span id="ajaxPageInfo">当前${pageNow}/${pageSize}页(共${total})</span>"""
       
        //下一页和末页输出,
        if(offset!=max*(pageSize-1)){
            int next1=offset+max
            def nextUrl="""offset=${next1}&max=${params.max}&sort=${params.sort}&order=${params.order}&total=${total}"""
           
            writer<<"""
                <span id="nextShow"   title="${nextText}" onclick="new Ajax.Updater('${attrs.update}',
            '${path}/${params.controller}/${params.action}',{asynchronous:true,evalScripts:true,parameters:'${nextUrl}'});
            return false;" >
                [${nextText}]
                </span>
                """
            int last=max*(pageSize-1)
            def lastUrl="""offset=${last}&max=${params.max}&sort=${params.sort}&order=${params.order}&total=${total}"""
            writer<<"""
                <span id="lastShow" title="${lastText}" onclick="new Ajax.Updater('${attrs.update}',
            '${path}/${params.controller}/${params.action}',{asynchronous:true,evalScripts:true,parameters:'${lastUrl}'});
            return false;" >
                [${lastText}]
                </span>
                """
        }
        else{
            writer<<"""<span id="nextNoShow" title="${nextText}">
                [${nextText}]
                </span>
                """
            writer<<"""<span id="lastNoShow" title="${lastText}">
                [${lastText}]
                </span>
                """
        }
        ///到指定页连接输出
        def selectUrl="&max=${params.max}&sort=${params.sort}&order=${params.order}&total=${total}"
        writer<<"""
        <span id="ajaxSelectText">转到<select id="ajaxSelect" onchange="myUpdate('${attrs.update}','${path}/${params.controller}/${params.action}'
        ,'${selectUrl}','${max}')">
       
        """
        for(int j=1;j<=pageSize;j++){
            if(pageNow!=j){
                writer<<"""  <option value ="${j}">${j}/${pageSize}</option>           """
            }
            else{
                writer<<"""  <option value ="${j}"  selected="selected">${j}/${pageSize}</option>           """
            }
        }
        writer<<"</select>页</span>"
       
        ////每页显示几条数据
        def maxUrl="&offset=0&sort=${params.sort}&order=${params.order}&total=${total}"
        writer<<"""
             <span id="ajaxMaxText"> 每页显示</span><select id="ajaxMax" onchange="myUpdate2('${attrs.update}','${path}/${params.controller}/${params.action}'
            ,'${maxUrl}')">
            """
        for(int j=1;j<=selectMax;j++){
            if(max!=j){
                writer<<"""<option value ="${j}">${j}</option>"""
            }
            else{
                writer<<"""<option value ="${j}"  selected="selected">${j}</option>"""
            }
        }
        writer<<"</select> </div>"
    }
}
example code

        if(!params.total){
            params.total=CompanyFinance.count()////注意total参数
        }
        def hql="select id,title,dateCreated from CompanyFinance "
        params.view=params.view==null?"list":params.view
        params.max = Math.min(params.max ? params.max as int : 2, 100)
        params.linkTotal = Math.min(params.linkTotal ? params.linkTotal as int : 2, 100)
        params.offset = Math.min(params.offset ? params.offset as int : 0, 100)
        params.sort=params.sort==null?"dateCreated":params.sort
        params.order=params.order==null?"desc":params.order
        params.selectMax="true"///暂时没用
        def results = sessionFactory.currentSession.createQuery(hql+" order by ${params.sort} ${params.order}")
           .setCacheable(false)
           .setReadOnly(true)
           .setFirstResult(params.offset)
           .setMaxResults(params.max)
           .list()
   
        render view:params.view,model:[pageAjaxList:results,paginateAjaxTotal:params.total]<g:paginateAjax total="${paginateAjaxTotal}" update="update1"
    selectMax="20" />
对了,还有js,css
function myUpdate(update1, url1, parameters1, max) {
    var selectValue = document.getElementById("ajaxSelect").value
    var offset = max * (selectValue - 1)
    var newParams = "offset=" + offset + parameters1
    new Ajax.Updater(update1, url1, {
        asynchronous : true,
        evalScripts : true,
        parameters : newParams
    });
    return false;
}
function myUpdate2(update1, url1, parameters1) {
    var max = document.getElementById("ajaxMax").value
    var newParams = "max=" + max + parameters1
    new Ajax.Updater(update1, url1, {
        asynchronous : true,
        evalScripts : true,
        parameters : newParams
    });
    return false;
}
css:(css水平有限啊),table的css最好自己写,如果 用默认的main.css会报错

@CHARSET "UTF-8";
#firstShow{
  color:#0000cc;
  cursor:hand;
  cursor:pointer;
}

#preShow{
  color:#0000cc;
  cursor:hand;
  cursor:pointer;
}
#ajaxPageInfo{
  color:#000000;
}

#nextShow{
  color:#0000cc;
  cursor:hand;
  cursor:pointer;
}
#lastShow{
  color:#0000cc;
  cursor:hand;
  cursor:pointer;
}


#ajaxSelectText{
   color:#000000;
}

#ajaxMaxText{
   color:#000000;
}
#firstNoShow{
}

#preNoShow{

}

#nextNoShow{
}

#lastNoShow{
}grails 1.1
grails 1.3.5下测试通过
最后页面上应该以下几句
<g:javascript library="prototype" />
<script type="text/javascript" src="${resource(dir: 'js', file: 'ajaxPage.js')}"></script>
<link rel="stylesheet" href="${resource(dir:'css',file:'ajaxPage.css')}" />
要源码可以下载:

hg clone https://asdtiang@bitbucket.org/asdtiang/mygrailsstudy
分享到:
评论

相关推荐

    grails实现分页技术

    供初学者使用,在grails中只有list(自动生成)中有分页实现,而自己新增的页面中需自己实现分页,该文档中描述了如何实现分页以及注意点

    grails ajax

    It is javascript and ajax using in grails, it is very useful

    grails 使用ajax的例子

    介绍了使用ajax的几个常用标签,欢迎志同道合的朋友来看看

    Grails标签

    Grails标签 主要介绍了grails的标签的一个帮助文档

    精通Grails 之用 JSON 和Ajax 实现异步Grails(pdf电子书)

    精通Grails 之用 JSON 和Ajax 实现异步Grails。书中包含了全部代码。免费下载

    精通 Grails 使用 Ajax 实现多对多关系

    极好的资源,这里边对用Ajax实现多对多关系讲的非常清楚 。

    Grails 下拉框联动最优实现

    NULL 博文链接:https://zeroblue.iteye.com/blog/1158924

    Grails Grails Grails

    Grails Grails Grails Grails Grails

    Grails权威指南

     9.4 实现ajax效果(effects)  9.5 如何处理javascript事件  9.6 以异步方式提交表单  9.7 关于ajax性能的讨论  9.8 本章小结 第10章 服务(services)和作业(jobs)  10.1 服务基础知识...

    Ajax Development With Grails Dojo

    Ajax Development With Grails Dojo www.grails-exchange.com © Sven Haiges, Yahoo! Inc. GRAILS & DOJO 3 Goals You know how to get started! You know how AJAX is supported by Grails Tags, Libraries...

    Grails权威指南 Grails权威指南

    Grails权威指南Grails权威指南Grails权威指南Grails权威指南Grails权威指南Grails权威指南

    Groovy轻松入门——Grails实战基础篇

    在学习任何东西之前,最重要的是培养兴趣,Groovy世界最耀眼的技术之一--Grails相信大家早已耳闻,我将通过Grails实战系列文章 向您展现Grails的迷人风采,使您感受到Grails的魅力,以至疯狂地爱上Grails,并坠入...

    Grails 中文参考手册

    6.7.1 用Prototype实现Ajax 6.7.1.1 异步链接 6.7.1.2 更新内容 6.7.1.3 异步表单提交 6.7.1.4 Ajax事件 6.7.2 用Dojo实现Ajax 6.7.3 用GWT实现Ajax 6.7.4 服务端的Ajax 6.8 内容协商 7. 验证 7.1 声明约束 7.2 验证...

    grails 1.0.4

    Grails的出现并不是偶然的,而是随着Web应用的日趋复杂及Web2.0和Ajax的悄然兴起发展起来的。不过在我们继续介绍Grails之前,有必要先探究一下如今其他的Java框架及他们的用户体验,因为正是他们的积累,才会产生...

    使用 Grails 快速开发 Web 应用程序

    Grails入门好资料

    Eclipse下搭建Grails项目

    Grails项目的应用越来越多,而对于初学者来说,在Eclipse下搭建Grails项目是一个难题,这个文档将教会你如何搭建Grails项目,希望对你有所帮助。

    Grails入门指南 -- 针对grails1.0.4更新

    Grails入门指南中文pdf -- 针对grails1.0.4更新,附加idea8 开发grails的流程

    grails 文档

    NULL 博文链接:https://extrimlycold20070206121610.iteye.com/blog/1139647

    Grails1.1中文文档

    Grails1.1中文文档

Global site tag (gtag.js) - Google Analytics