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
相关产品推荐
相关产品推荐

