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

JSP-Servlet-DAO架构下电影时长范围搜索功能失效求助

问题诊断与修复方案

嘿,我一眼就揪出问题所在了!你的DAO实现里的buscar方法犯了一个PreparedStatement使用的常见错误——你没给SQL里的占位符?赋值就直接执行查询了!

核心错误分析

先看你DAOPeliculas类里的buscar方法关键代码:

@Override
public List<Peliculas> buscar(int id1, int id2) {
    // ... 初始化代码
    try {
        conn = MysqlDBConexion.getConexion();
        String sql = "select * from tb_pelicula where duracionpeli>=? AND duracionpeli<=?";
        pstm = conn.prepareStatement(sql);
        // 这里完全缺失给占位符绑定参数的步骤!
        rs = pstm.executeQuery();
        // ... 结果集处理
    }
    // ... 异常处理
}

你写了带两个占位符的SQL,但没有把传入的id1和id2绑定到?上,导致数据库执行的是duracionpeli>=NULL AND duracionpeli<=NULL,自然查不到任何数据。


第一步:修复DAO的buscar方法

给PreparedStatement添加参数绑定的代码,修改后的完整方法如下:

@Override
public List<Peliculas> buscar(int id1, int id2) {
    List<Peliculas> data = new ArrayList<Peliculas>();
    Connection conn = null;
    PreparedStatement pstm = null;
    ResultSet rs = null;
    try {
        conn = MysqlDBConexion.getConexion();
        String sql = "select * from tb_pelicula where duracionpeli>=? AND duracionpeli<=?";
        pstm = conn.prepareStatement(sql);
        // 给第一个占位符绑定最小时长参数
        pstm.setInt(1, id1);
        // 给第二个占位符绑定最大时长参数
        pstm.setInt(2, id2);
        rs = pstm.executeQuery();
        while (rs.next()) {
            data.add(new Peliculas(rs.getInt("idpelicula"), 
                                   rs.getString("nompeli"), 
                                   rs.getString("descripeli"), 
                                   rs.getString("clasipeli"), 
                                   rs.getInt("duracionpeli"), 
                                   rs.getString("director"), 
                                   rs.getString("actor"), 
                                   rs.getString("sinopsis")));
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally{
        try {
            if(rs!= null) rs.close();
            if(pstm!= null) pstm.close();
            if(conn!= null) conn.close();
        } catch (Exception e2) {
            e2.printStackTrace();
        }
    }
    return data;
}

第二步:补充Servlet参数处理建议

虽然你只贴了Servlet的部分代码,但要确保从请求中获取参数时正确转换为int类型,同时处理异常:

// 假设前端表单的参数名为minDur和maxDur
try {
    int minDur = Integer.parseInt(request.getParameter("minDur"));
    int maxDur = Integer.parseInt(request.getParameter("maxDur"));
    
    // 调用DAO执行搜索
    OperacionesDAO dao = new DAOPeliculas();
    List<Peliculas> searchResult = dao.buscar(minDur, maxDur);
    
    // 将结果转发到JSP展示
    request.setAttribute("peliculas", searchResult);
    request.getRequestDispatcher("peliculaList.jsp").forward(request, response);
} catch (NumberFormatException e) {
    // 处理用户输入非数字的情况,比如返回错误提示
    request.setAttribute("errorMsg", "请输入有效的时长数字");
    request.getRequestDispatcher("searchPage.jsp").forward(request, response);
}

第三步:验证修复效果

修改完成后重新部署项目,测试时长范围(比如180-200),就能得到和MySQL客户端执行相同的结果——返回《Avengers》和《Interstellar》两条数据了。

内容的提问来源于stack exchange,提问作者Pedro P Segura

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:23:58