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

如何在POST/DELETE请求中传递JSP forEach索引至Controller?

解决方案:用实体ID而非索引定位要删除的DAO

别再纠结传递varStatus索引啦——这种方式非常不可靠!页面上的索引只是渲染时的临时顺序,一旦数据有变动(比如分页、其他用户删除记录),索引和数据库里的实际记录就会错位,很容易删错数据。正确的做法是直接传递Game实体的唯一标识(比如ID),这才是和数据库记录一一对应的可靠方式。

下面给你两种可行的实现方案:

方案1:表单提交(最简单的同步方式)

第一步:修改JSP的删除按钮,嵌入表单传递ID

把原来的按钮放在独立表单里,用隐藏域存储当前行Game的ID,点击按钮时提交表单到Controller:

<td>
    <form action="/deleteGame" method="POST" style="margin:0;">
        <input type="hidden" name="gameId" value="${game.id}">
        <button type="submit" class="btn btn-danger">
            <strong>X</strong>
        </button>
    </form>
</td>

第二步:修改Controller的POST方法,接收ID并执行删除

更新postDeleteGame方法,通过@RequestParam接收传递的gameId,调用Service删除对应记录后,重新加载最新游戏列表返回页面:

@RequestMapping(value="/deleteGame", method=RequestMethod.POST)
public String postDeleteGame (@RequestParam("gameId") Long gameId, ModelMap model) {
    // 调用Service删除指定ID的Game
    gamesService.deleteById(gameId);
    
    // 重新获取最新游戏列表,确保页面显示最新状态
    List<Game> myGames = gamesService.fetchById();
    model.addAttribute("games", myGames);
    
    return "deleteGame";
}

方案2:AJAX实现无刷新删除(更友好的用户体验)

如果不想每次删除都刷新页面,可以用AJAX异步提交请求:

第一步:修改JSP按钮,添加数据属性存储ID

<td>
    <button type="button" class="btn btn-danger delete-btn" data-game-id="${game.id}">
        <strong>X</strong>
    </button>
</td>

第二步:添加JavaScript处理点击事件(jQuery示例)

$(document).ready(function() {
    $('.delete-btn').click(function() {
        const $btn = $(this);
        const gameId = $btn.data('game-id');
        
        // 发送POST请求到Controller
        $.post('/deleteGame', { gameId: gameId }, function() {
            // 删除成功后,移除当前表格行
            $btn.closest('tr').remove();
        }).fail(function() {
            alert('删除失败,请稍后重试');
        });
    });
});

第三步:调整Controller返回JSON(可选)

如果用AJAX,Controller可以返回JSON状态而非页面:

@RequestMapping(value="/deleteGame", method=RequestMethod.POST)
@ResponseBody
public Map<String, String> postDeleteGame (@RequestParam("gameId") Long gameId) {
    Map<String, String> result = new HashMap<>();
    try {
        gamesService.deleteById(gameId);
        result.put("status", "success");
    } catch (Exception e) {
        result.put("status", "error");
        result.put("message", e.getMessage());
    }
    return result;
}

为什么不推荐用索引?

再强调一次:页面上的loopIndex.index只是当前页面渲染的行号,和数据库记录没有直接绑定关系。比如:

  • 开启分页后,第二页第一行的索引是0,但对应数据库记录的ID可能是100+
  • 如果其他用户在你操作前删除了一行,你的索引就会指向错误的记录

只有用数据库生成的唯一ID,才能确保每次删除的都是你想要的那条记录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:51:44