如何为JSP动态数据库表格添加分页(每页最多5条)
实现Oracle数据表格的分页功能(每页5条)
我来帮你搞定这个分页需求!针对你的JSP+Oracle场景,咱们可以用Oracle原生的分页语法来实现,同时在页面上添加分页导航控件,下面是具体的实现步骤和修改后的代码:
核心思路
- 获取当前页码和每页固定显示5条的参数
- 修改Oracle查询语句,只查询当前页需要的5条数据
- 计算总记录数,用于生成分页导航(比如总页数、上/下一页按钮)
- 在页面底部添加直观的分页导航控件
具体代码修改
1. 先处理分页参数
在JSP开头添加分页参数的获取与初始化逻辑:
<% // 分页配置:每页5条,默认显示第一页 int pageSize = 5; int pageNo = 1; String pageParam = request.getParameter("pageNo"); if(pageParam != null && !pageParam.isEmpty()){ try{ pageNo = Integer.parseInt(pageParam); // 页码不能小于1 if(pageNo < 1) pageNo = 1; }catch(NumberFormatException e){ pageNo = 1; } } // 计算Oracle分页需要的起始/结束行号 int startRow = (pageNo - 1) * pageSize + 1; int endRow = pageNo * pageSize; %>
2. 修改SQL查询(支持分页+避免SQL注入)
替换你原来的拼接式SQL,改用预编译语句+Oracle分页语法(兼容所有Oracle版本):
// 先写统计总记录数的SQL String countSql = "SELECT COUNT(*) FROM (" + "SELECT PK.PROJECT_ID,PK.PROJECT_NAME,PK.HEADER,PK.DESCRIPTION,DK.EMPLOYEE_ID,PK.approve " + "FROM EMPLOYEE_TASK PK INNER JOIN REGISTRATION_EMPLOYEE dk ON dk.employee_id=pk.employee_id " + "WHERE dk.REPORTING_MANAGER_ID=? AND PK.approve='Pending'" + ") t"; // 分页查询的SQL(注意必须加排序,保证分页数据顺序稳定) String pageSql = "SELECT * FROM (" + "SELECT t.*, ROWNUM rn FROM (" + "SELECT PK.PROJECT_ID,PK.PROJECT_NAME,PK.HEADER,PK.DESCRIPTION,DK.EMPLOYEE_ID,PK.approve " + "FROM EMPLOYEE_TASK PK INNER JOIN REGISTRATION_EMPLOYEE dk ON dk.employee_id=pk.employee_id " + "WHERE dk.REPORTING_MANAGER_ID=? AND PK.approve='Pending'" + "ORDER BY PK.PROJECT_ID" + ") t WHERE ROWNUM <= ?" + ") WHERE rn >= ?";
3. 执行查询并计算总页数
替换原来的statement查询逻辑,用PreparedStatement更安全:
// 统计总记录数,计算总页数 PreparedStatement countStmt = con.prepareStatement(countSql); countStmt.setString(1, Manager_id); ResultSet countRs = countStmt.executeQuery(); int totalRecords = 0; if(countRs.next()){ totalRecords = countRs.getInt(1); } // 计算总页数,向上取整 int totalPages = (totalRecords + pageSize - 1) / pageSize; // 执行分页查询 PreparedStatement pageStmt = con.prepareStatement(pageSql); pageStmt.setString(1, Manager_id); pageStmt.setInt(2, endRow); pageStmt.setInt(3, startRow); resultSet2 = pageStmt.executeQuery();
4. 添加分页导航控件
在表格结束后添加分页按钮,方便切换页面:
<!-- 分页导航栏 --> <div align="center" style="margin-top:15px; color:white;"> <a href="?pageNo=1" style="margin:0 8px; color:yellow;">首页</a> <% if(pageNo > 1){ %> <a href="?pageNo=<%= pageNo - 1 %>" style="margin:0 8px; color:yellow;">上一页</a> <% } %> <!-- 显示页码按钮 --> <% for(int i=1; i<=totalPages; i++){ %> <% if(i == pageNo){ %> <span style="font-weight:bold; color:red; margin:0 8px;"><%= i %></span> <% }else{ %> <a href="?pageNo=<%= i %>" style="margin:0 8px; color:yellow;"><%= i %></a> <% } %> <% } %> <% if(pageNo < totalPages){ %> <a href="?pageNo=<%= pageNo + 1 %>" style="margin:0 8px; color:yellow;">下一页</a> <% } %> <a href="?pageNo=<%= totalPages %>" style="margin:0 8px; color:yellow;">尾页</a> </div>
额外优化提示
- Oracle 12c+简化写法:如果你的Oracle版本是12c及以上,可以用更简洁的分页语法替换上面的
pageSql:
SELECT PK.PROJECT_ID,PK.PROJECT_NAME,PK.HEADER,PK.DESCRIPTION,DK.EMPLOYEE_ID,PK.approve FROM EMPLOYEE_TASK PK INNER JOIN REGISTRATION_EMPLOYEE dk ON dk.employee_id=pk.employee_id WHERE dk.REPORTING_MANAGER_ID=? AND PK.approve='Pending' ORDER BY PK.PROJECT_ID OFFSET <%= (pageNo-1)*pageSize %> ROWS FETCH NEXT <%= pageSize %> ROWS ONLY
- SQL注入防护:你原来的代码直接把
Manager_id拼进SQL里,存在安全风险,上面的代码用PreparedStatement绑定参数,一定要坚持这种写法!
这样修改后,你的页面就能实现每页5条记录的分页功能,经理可以通过分页按钮轻松切换不同页面查看数据啦!
内容的提问来源于stack exchange,提问作者Atul
相关产品推荐
相关产品推荐

