Grails框架<g:paginate>分页标签使用及参数丢失问题咨询
问题修复方案
你遇到的两个问题可以通过以下两步修改解决:
1. 调整控制器selectSnapshotVolume方法
<g:paginate>标签仅生成分页导航,不会自动截断查询结果,需要你手动在控制器中实现分页查询逻辑:
def selectSnapshotVolume() { log.info "Vaultrecovery Controller - selectSnapshotVolume" // 兼容分页请求和首次请求的参数来源 def sourceVolume = params.srcvolume log.info "SOURCE VOLUME IS: " + sourceVolume // 分页参数设置,默认每页10条,从第0条开始查 def max = Math.min(params.int('max', 10), 100) // 加最大限制避免恶意请求 def offset = params.int('offset', 0) def foo = new Sql(dataSource) // 改用参数化查询避免SQL注入风险 def querySQL = "SELECT cluster, vserver, volume, snapshot FROM netapp_vault WHERE volume LIKE ? ORDER BY snapshot" def queryParams = ["%${sourceVolume}%"] // 使用Groovy Sql自带的分页参数查询对应页数据 def destinationVolumes = foo.rows(querySQL, queryParams, offset, max) def countSQL = "SELECT COUNT(cluster) as total FROM netapp_vault WHERE volume LIKE ?" def entreeCount = foo.rows(countSQL, queryParams); [sourceVolume: sourceVolume, destinationVolumes: destinationVolumes, entreeCount: entreeCount] }
2. 修改GSP中的<g:paginate>标签
需要在分页链接中携带srcvolume参数,避免分页跳转时丢失查询条件,同时指定每页展示条数为10:
<g:paginate controller='Vaultrecovery' action='selectSnapshotVolume' total="${entreeCount.total[0] ?: 0}" max="10" params="[srcvolume: sourceVolume]" />
内容的提问来源于stack exchange,提问作者Rogelio Cordova
相关产品推荐
相关产品推荐

