You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 13:45:03