用户管理的分页显示2
在界面完成分页控制,也就是在循环显示的时候进行控制。前面介绍的显示信息的代码是通过<c:forEach>控制的,所以需要在<c:forEach>中添加代码,只显示满足条件的记录。
<c:forEach>标签提供了两个属性 begin 和 end,可以控制集合中的记录从什么地方开始显示以及显示到什么地方结束。另外在分页控制的时候需要得到总的页数,而总的页数是
由总的记录数决定的,所以需要在 UserBean 中添加一个方法。
要在界面上完成分页控制,需要完成下面的修改:
(1) 修改 UserBean,添加一个获取总页数的方法;
(2) 修改 FindAllUserServlet,添加调用获取总页数的方法的代码以及传递总页数的代码;
(3) 修改 userlist.jsp,添加页码控制的代码(上一页、下一页、最后一页和第一页等的控制代码),以及控制信息显示的代码。
1、修改 UserBean.java
在 UserBean 中添加一个方法,该方法用于获取记录数。得到数据库中记录数的过程与查询所有用户信息的过程是相同的,只是 SQL 语句不同,最后得到的结果集不同。
SQL 语句是:
select count(*) from usertable
结果集只有一行一列,所以遍历和取值比较简单。只要将指针指向第一行,然后取出第一列内容即可,代码如下:
rs.next();
int n = rs.getInt(1);
然后根据记录数计算页数,假设每页显示 10 条记录,则页数为:
pageCount = (n-1)/10+1;
获取总页数的方法如下:
public Integer getPageCount() { int pageCount=1; // 连接对象 Connection con=null; // 语句对象 Statement stmt=null; // 结果集对象 ResultSet rs=null; // 查询语句 String sql="select count(*) from usertable"; try { // 创建上下文环境 Context initContext = new InitialContext(); // 查找数据源 Context envContext = (Context)initContext.lookup("java:/comp/env"); DataSource ds = (DataSource)envContext.lookup("jdbc/TestDB"); // 从连接池中获取连接 con = ds.getConnection(); // 创建语句对象 stmt=con.createStatement(); // 执行 select 语句,返回结果集对象 rs=stmt.executeQuery(sql); // 指向结果集的第一条 rs.next(); // 得到第一列 int n = rs.getInt(1); // 计算总页数 pageCount = (n-1)/10+1; }catch(Exception e) { } finally { // 关闭对象的顺序:rs stmt con // 与创建对象的顺序相反 try{ rs.close(); }catch(Exception e){} try{ stmt.close(); }catch(Exception e){} try{ con.close(); }catch(Exception e){} } // 返回计算的结果 return new Integer(pageCount); }
2、修改 FindAllUserServlet
使用分页显示,每次处理的时候需要知道要访问第几页,还需要知道一共有多少页。要显示第几页是用户在界面上点击上一页、下一页、第一页、最后一页或者输入第几页来确定的,所以需要获取。
第 1 次访问的时候,不知道显示第几页,默认显示第 1 页。
可以使用下面的代码:
int pageNo = 1; // 设置默认值
// 获取从页面中传递的 第几页 信息
String strPageNo = request.getParameter("pageNo");
if(strPageNo != null)
{
pageNo = Integer.parseInt(strPageNo); // 把字符串转换成数字
}
另外需要把总的页数传递到显示页面,获取的方式和传递的方式与所有用户信息的获取和传递方式相同。下面是完整的代码:
import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.util.*; import bookstore.bean.*; public class FindAllUserServlet extends HttpServlet{ public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException { int pageNo = 1; // 获取从页面中传递的 第几页 信息 String strPageNo = request.getParameter("pageNo"); if(strPageNo != null) { pageNo = Integer.parseInt(strPageNo); // 把字符串转换成数字 } // 创建模型对象 UserBean user = new UserBean(); try{ // 调用业务方法得到所有用户列表 ArrayList userlist = user.findAllUser(); // 保存到 request 中 request.setAttribute("userlist",userlist); // 得到总的页数 Integer pageCount = user.getPageCount(); // 把总页数保存到 request 中 request.setAttribute("pageCount",pageCount); // 把当前页传递过去 request.setAttribute("pageNo",pageNo); // 转向显示界面 RequestDispatcher rd = request.getRequestDispatcher("userlist.jsp"); rd.forward(request,response); }catch(Exception e){ // 设置文档类型 response.setContentType("text/html;charset=gb2312"); // 获取输出流对象 PrintWriter out = response.getWriter(); // 输出异常信息 out.println(e.toString()); } } public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException { doGet(request,response); } }
3、修改 userlist.jsp
需要在显示的时候增加提示信息“共有多少页,这是第几页”。当前页码和共有多少页的信息是通过 FindAllUserServlet 生成的,直接通过表达式语言显示即可:
共有${pageCount}页,这是第${pageNo}页。
要添加到第一页的超链接,可以使用下面的代码:
<a href="findAllUser?pageNo="1">第一页</a>
findAllUser 后面的问号表示要传递参数,pageNo 是参数的名字,1 是参数的值,通过这种方式传递值与通过表单提交信息的方式的效果完全相同,相当于有
一个表单元素,表单元素的名字是 pageNo,表单元素的值是 1。
要添加到上一页的超链接,可以使用下面的代码:
<a href="findAllUser?pageNo=${pageNo-1}">上一页</a>
要添加到下一页的超链接,可以使用下面的代码:
<a href="findAllUser?pageNo=${pageNo+1}">下一页</a>
要添加到最后一页的超链接,可以使用下面的代码:
<a href="findAllUser?pageNo=${pageCount}">最后一页</a>
如果当前页是第一页,则不用显示“第一页”和“上一页”超链接;如果是最后一页,则不用显示“最后一页”和“下一页”超链接。