分页
注意
实际上分页并不属于 jsp 的基础知识范畴,不过分页毕竟是非常
常用的一个功 能,其中也会涉及到 jsp 的一些应用,所以还有很有价值一看的。 如果你不满足以下任一条件, 请继续阅读, 否则请跳过此后的部分, 进入下一章: 第 16 章 Never End...。 1. 了解如何进行数据库分页。 2. 了解如何使用 jstl 标签替换分页的 jsp 代码。
15.1. 数据库分页
所谓的分页,就是要查询的数据太多了,一次性显示出来的话,既不容易查看也 影响性能。 就比如我们这里有 39 条数据,分 8 页显示出来,每页 5 条记录。
首先说数据库,里边只有一张表 bean,三个字段 id, title 和 add_date。
-- bean
create table bean( id bigint -- 主键 bigint, title varchar varchar(100), -- 标题 add_date datetime -- 时间 );
对应的 Bean.java 咱们就不用写了,只看一看后台去数据库读取数据库的 BeanServlet.java。 package anni; import import import import import java.io.*; java.sql.*; java.util.*; javax.servlet.*; javax.servlet.http.*;
public class BeanServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Connection conn = null; Statement state = null; ResultSet rs = null;
// 获得当前页码
int pageNo = 1; try { pageNo = Integer.parseInt(request.getParameter("pageNo" "pageNo")); "pageNo" } catch catch(Exception ex) { } if (pageNo < 1) { pageNo = 1; } request.setAttribute("pageNo" pageNo); "pageNo", "pageNo" List list = new ArrayList(); int count = 0;
// 根据页码从数据库中获得对应的数据
try { conn = DbUtils.getConn(); state = conn.createStatement(); rs = state.executeQuery("select limit " + (pageNo * 5 - 5) "select + " 5 * from bean" bean"); while (rs.next()) { Bean bean = new Bean(); bean.setId(rs.getLong(1)); bean.setTitle(rs.getString(2)); bean.setAddDate(rs.getTimestamp(3)); list.add(bean); } rs.close(); rs = state.executeQuery("select count(*) from bean" bean"); "select if (rs.next()) { count = rs.getInt(1); } } catch catch(Exception ex) { ex.printStackTrace(); } finally { DbUtils.close(rs, state, conn); } request.setAttribute("count" count); "count", "count" request.setAttribute("list" list); "list", "list"
request.getRequestDispatcher("/query.jsp" "/query.jsp").forward(request, "/query.jsp" response); } }
代码长了,分三段来看: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
// 获得当前页码
int pageNo = 1; try { pageNo = Integer.parseInt(request.getParameter("pageNo" "pageNo")); "pageNo" } catch catch(Exception ex) { } if (pageNo < 1) { pageNo = 1; } request.setAttribute("pageNo" pageNo); "pageNo", "pageNo"
这里 pageNo 代表当前的页码,如果没有传递 pageNo 参数,默认显示第一 页,为此我们在解析 request 中参数时要捕获对应的异常,如果没有输入 或者参数不是一个数字时 pageNo 就还是等
于 1。 12. rs = state.executeQuery("select limit " + (pageNo * 5 - 5) + " "select bean"); 5 * from bean" 13. 这里我们拼了一个 sql 语句,用来从(pageNo * 5 - 5)开始
查询五个记录, 这条
sql 语句是 hsqldb 数据库特有的分页语句。 (pageNo * 5 - 5)用来计算 pageNo 这页第一条记录的行号,如果是第一 页 pageNo = 1,pageNo * 5 - 5 = 0。这里的行号跟咱们平常使用的数 组索引一样,0 代表第一个条记录,这样我们第一页就会显示 0,1,2,3,4 五条记录。如果是第二页 pageNo = 2,pageNo * 5 - 5 = 5,我们就会 在第二页看到 5,6,7,8,9 五条记录。这样正好与我们预期的一致。 14. rs = state.executeQuery("select count(*) from bean" bean"); "select 15. 最后记得要