分页工具类
public class PageBean<T> implements Serializable{
//起始索引
private int startIndex;
//当前页码
private int pageNumber;
//每页显示条数
private int pageSize = 3;
//总记录数
private int total;
//总页数
private int totalPage;
//查询到的数据
private List<T> result;
public int getStartIndex() {
return (getPageNumber()-1)*getPageSize();
}
public void setStartIndex(int startIndex) {
this.startIndex = startIndex;
}
public int getPageNumber() {
return pageNumber;
}
public void setPageNumber(int pageNumber) {
this.pageNumber = pageNumber;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
public int getTotalPage() {
return getTotal()%getPageSize() ==0 ?(getTotal()/getPageSize()):(getTotal()/getPageSize()+1);
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public List<T> getResult() {
return result;
}
public void setResult(List<T> result) {
this.result = result;
}
}
两个重要公式
获取当前索引:当前索引 = (当前页码-1)*每页显示条数
获取总页数:总页数 = 总条数 / 每页显示条数 如果未除尽则要加上1
什么是序列化?
序列化是将对象状态转换为可保持或传输的格式的过程,将对象转化成流的形式。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据
引用自https://baijiahao.baidu.com/s?id=1633305649182361563&wfr=spider&for=pc
为什么要进行序列化?
1、将对象的状态保存在存储媒体中以便可以在以后重新创建出完全相同的副本;2、按值将对象从一个应用程序域发送至另一个应用程序域。实现serializabel接口的作用是就是可以把对象存到字节流,然后可以恢复,所以你想如果你的对象没实现序列化怎么才能进行持久化和网络传输呢,要持久化和网络传输就得转为字节流,所以在分布式应用中及设计数据持久化的场景中,你就得实现序列化
引用自https://www.cnblogs.com/hhhshct/p/9664390.html
持久化一般指将数据持久化保存,如存到数据库中或写到文件中
为什么要是用泛型?
使用泛型可以高自由度,我们可以借助工具类实现对user的分页,也可以实现对item(商品)的分类
实现初步分页
注意:分页条数在工具类里写成3 也可以在页面获取
dao层
//分页查询所有用户
public List<User> getUsersByPage(PageBean<User> page) {
QueryRunner qr = new QueryRunner(C3p0Utils.getDataSource());
String sql = "select * from user limit ?,?";
Object [] params = {page.getStartIndex(),page.getPageSize()};
try {
return qr.query(sql, new BeanListHandler<User>(User.class),params);
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
service层
public PageBean<User> getUsersByPage(PageBean<User> page) {
List<User> users = userDao.getUsersByPage(page);
page.setResult(users);
return page;
}
web层
//分页查询所有用户
public String getUsersByPage(HttpServletRequest request, HttpServletResponse response){
//获取当前页码
String pageNumber = request.getParameter("pageNumber");
//创建分页工具类对象
PageBean<User> page = new PageBean<User>();
page.setPageNumber(Integer.valueOf(pageNumber));//设置当前页码
//调用业务层处理
UserService userService = new UserServiceImpl();
page = userService.getUsersByPage(page);
request.getSession().setAttribute("page", page);//把查询结果存入session域
return "amin/user_list";//请求转发
}
实现总记录数、总页数、加入索引页
处于第一页不显示上一页
处于最后一页不显示下一页
显示不显示的实现主要是c:if判断语句
索引页的实现,foreach遍历
begin和end标签
<c:forEach begin="1" end="${page.totalPage}" var="i">
<li class="paginItem"><a href="${pageContext.request.contextPath}/user?method=getUsersByPage&pageNumber=${i}">${i}</a></li>
</c:forEach>
ScalarHandler:将单个值封装、例如select count(*),求内容的条数
dao层
//分页查询所有用户
public List<User> getUsersByPage(PageBean<User> page) {
QueryRunner qr = new QueryRunner(C3p0Utils.getDataSource());
String sql = "select * from user limit ?,?";
Object [] params = {page.getStartIndex(),page.getPageSize()};
try {
return qr.query(sql, new BeanListHandler<User>(User.class),params);
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
//查询总条数
public int selectTotal() {
QueryRunner qr = new QueryRunner(C3p0Utils.getDataSource());
String sql = "select count(*) from user";
try {
Long total = (long) qr.query(sql,new ScalarHandler());//ScalarHandler()将单个值封装
return total.intValue();
} catch (SQLException e) {
e.printStackTrace();
return 0;
}
}
service层
public PageBean<User> getUsersByPage(PageBean<User> page) {
List<User> users = userDao.getUsersByPage(page);
page.setResult(users);
int total = userDao.selectTotal();
page.setTotal(total);
return page;
}
web层
//分页查询所有用户
public String getUsersByPage(HttpServletRequest request, HttpServletResponse response){
//获取当前页码
String pageNumber = request.getParameter("pageNumber");
//创建分页工具类对象
PageBean<User> page = new PageBean<User>();
page.setPageNumber(Integer.valueOf(pageNumber));//传入当前页码
//调用业务层处理
UserService userService = new UserServiceImpl();
page = userService.getUsersByPage(page);
request.getSession().setAttribute("page", page);//把查询结果存入session域
return "admin/user_list";//请求转发
}
小结
后端分页主要是把数据、页码信息封装进一个返回类中,返回给前端
后端每次只返回一页的信息
前端只需要把页面和条数传递给后端即可