先上时序图:
系统管理员请求查询所有的用户后,到达jsp在客户端取得相应的分页参数(pageNo,pageSize,),再提供方法查到所有用户,参数同前,返回用户列表userList,但是还需要返回这些记录的其他参数(totalRecords,pageSize,totalPage),然后再一步步显示到浏览器中。鉴于很多模块都使用分页,利用对象的封装性,方便复用,可做如下分页操作。
1.封装一个分页的对象PageModel,这里包括了分页相关的所有属性
//结果集
private List<E> list;
//查询记录数
private int totalRecords;
//每页记录数
private int pageSize;
//第几页
private int pageNo;
/**
* 总页数
* @return
*/
public int getTotalPages() {
return (totalRecords + pageSize -1 )/pageSize;
}
/**
* 返回首页
* @return
*/
public int getTopPageNo(){
return 1;
}
/**
* 取得尾页
* @return
*/
public int getBottomPageNo(){
return getTotalPages();
}
/**
* 取得上一页
* @return
*/
public int getPreviousPageNo(){
if (pageNo <= 1) {
return 1;
}
return pageNo -1 ;
}
/**
* 取得下一页
* @return
*/
public int getNextPageNo(){
if (pageNo >= getTotalPages()) {
return getTotalPages();
}
return pageNo + 1;
}
2.UserManager中接收PageModel返回值,通过findUserList()查询结果,返回PageModel对象在页面中拿到,显示输出即可(在这里采用的是泛型集合的形式)
/**
* 分页查询
* @param pageNo 第几页
* @param pageSize 每页多少条数据
* @return PageModel
*/
public PageModel<User> findUserList(int pageNo,int pageSize){
//分页查询语句,定义一个stringBuffer拼接sql字符串,三层嵌套
StringBuffer sbSql = new StringBuffer();
sbSql.append("select user_id, user_name, password, contact_tel, email, create_date ")
.append("from ")
.append("( ")
.append("select rownum rn, user_id, user_name, password, contact_tel, email, create_date ")
.append("from ")
.append("( ")
.append("select user_id, user_name, password, contact_tel, email, create_date from t_user where user_id <> 'root' order by user_id ")
.append(") where rownum <= ? ") //这是占位符
.append(") where rn > ? "); //这是占位符
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
PageModel<User> pageModel = null;
try {
conn=DbUtil.getConnection();
pstmt = conn.prepareStatement(sbSql.toString());
//填充占位符
pstmt.setInt(1, pageNo * pageSize);
pstmt.setInt(2, (pageNo-1)*pageSize);
rs=pstmt.executeQuery();
//泛型类型的
List<User> userList = new ArrayList();
//赋值,从哪开始查,查几个
//返回多条,使用while循环
while (rs.next()) {
//创建一个用户对象
User user=new User();
user.setUserId(rs.getString("user_id"));
user.setUserName(rs.getString("user_name"));
user.setPassword(rs.getString("password"));
user.setContactTel(rs.getString("contact_tel"));
user.setEmail(rs.getString("email"));
user.setCreateDate(rs.getTimestamp("create_date"));
//将该对象放到相关list中,得到有记录的PageModel
userList.add(user);
}
//实例化PageModel,并获得list记录集,最后返回给jsp
pageModel = new PageModel<User>();
pageModel.setList(userList);
pageModel.setTotalRecords(getTotalRecords(conn));
pageModel.setPageSize(pageSize);
pageModel.setPageNo(pageNo);
} catch (SQLException e) {
e.printStackTrace();
}finally{
DbUtil.close(rs);
DbUtil.close(pstmt);
DbUtil.close(conn);
}
return pageModel;
}
服务器业务逻辑部分已完成,接下来为:
4.将每页的数据输出到jsp
在user_maint.jsp中调用刚才的findUserList,并循环迭代,引进用户user
<%
int pageNo = 1;
int pageSize = 2;
String pageNoString = request.getParameter("pageNo");
if(pageNoString != null){
pageNo = Integer.parseInt(pageNoString);
}
PageModel<User> pageModel = UserManager.getInstance().findUserList(pageNo,pageSize);
%>
补充:
共*页(取得总记录数/每页多少个=总页数)
第几页
上一页
下一页
...自己去研究吧 哈哈