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

