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

Grails应用无领域类场景下获取指定歌曲ID渲染详情gsp的问题

实现详情页ID传递与渲染步骤


1. 列表页配置跳转传参

你已经实现了歌曲列表渲染,直接在列表的「查看详情」跳转链接中绑定每首歌的主键ID作为路径参数即可,示例代码:

<!-- 替换为你列表遍历的实际变量名和ID字段名 -->
<g:each in="${songList}" var="song">
    <tr>
        <td>${song.name}</td>
        <td>${song.singer}</td>
        <td><g:link controller="song" action="show" id="${song.id}">查看详情</g:link></td>
    </tr>
</g:each>

2. Controller层接收参数并查询数据

在对应的Controller中新增show动作,接收路径传递的ID参数,调用Service层查询单条歌曲数据后传给视图:

class SongController {
    // 注入你自己实现的SongService
    SongService songService

    def show(Long id) {
        // 非法ID直接跳转回列表页
        if (!id) {
            redirect(action: "index")
            return
        }
        // 未查询到对应数据给出提示
        Map songInfo = songService.getSongById(id)
        if (!songInfo) {
            flash.error = "指定歌曲不存在"
            redirect(action: "index")
            return
        }
        // 传递数据到详情页
        render(view: "show", model: [song: songInfo])
    }
}

3. Service层实现单条数据查询逻辑

因为你没有创建领域类,直接用Groovy SQL或者JdbcTemplate操作Postgres查询即可,Groovy SQL示例:

import groovy.sql.Sql
import javax.sql.DataSource

class SongService {
    // Grails会自动注入配置好的Postgres数据源
    DataSource dataSource

    Map getSongById(Long songId) {
        def sql = new Sql(dataSource)
        try {
            // 替换为你实际的表名、字段名
            return sql.firstRow("""
                SELECT id, name, singer, album, duration, release_time 
                FROM song 
                WHERE id = ?
            """, [songId]) as Map
        } finally {
            sql.close()
        }
    }
}

4. 详情gsp页渲染数据

创建show.gsp文件,直接读取Controller传递的model参数渲染即可:

<h1>歌曲详情</h1>
<div class="song-info">
    <p>歌曲ID:${song.id}</p>
    <p>歌曲名称:${song.name}</p>
    <p>演唱歌手:${song.singer}</p>
    <p>所属专辑:${song.album}</p>
    <p>歌曲时长:${song.duration}</p>
    <p>发行时间:${song.release_time}</p>
</div>
<div class="operation-bar">
    <g:link action="edit" id="${song.id}">编辑信息</g:link>
    <g:link action="index">返回列表</g:link>
</div>

补充说明

后续编辑、删除功能的ID传递逻辑和上述流程完全一致,直接给对应操作的链接/按钮绑定对应歌曲ID即可。如果需要用参数别名,也可以用params传递:<g:link action="show" params="[songId:${song.id}]">查看详情</g:link>,对应Controller里用params.songId接收即可。

内容的提问来源于stack exchange,提问作者panamilo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 12:27:01