分页目的:为了防止服务器一次性将数据库全部数据读出,提高效率。(数据库数据以文件形式存在,从硬盘读取速度慢)
需要使用到限制查询,限制查询的两种表示方法:
limit n:从0开始查询n条数据
limit(n,m):
n—:偏移量(每页显示的第一条数据)
m—:分页量(每页显示的数据条数)
设计需考虑:
当前分页数:currentPage
分页量:pageSize
偏移量:offset
数据总条数:pageTotal
总页数:pages
偏移量:int offset = (currentPage -1)* pageSize;
总页数: int pages= (int)Math.ceil(total*1.0 /pageSize);
分页技术的具体实现如下:
- servlet中的处理
- service中的处理
- dao层的处理
- utils的处理
- .jsp文件的处理
StudentServlet (get请求中分页实现关键代码)
case "look":
//int currentPage = 1;
int currentPage = req.getParameter("p")==null?1:Integer.parseInt(req.getParameter("p"));//页码值
int pageSize = 10;//分页量
List<Student> list = ssi.queryPage(currentPage,pageSize);//分页后的数据
int total= ssi.queryTotal();//总条数
int pages= (int)Math.ceil(total*1.0 /pageSize);//总页数
req.setAttribute("currentPage",currentPage);
req.setAttribute("pages",pages);
req.setAttribute("list",list);
req.getRequestDispatcher("/WEB-INF/sms/stu/list.jsp").forward(req,resp);
break;
StudentServiceImpl中关键代码
@Override
public List<Student> queryPage(int currentPage, int pageSize) {
//拿到偏移量: 起始位置 ,从0开始
int offset = (currentPage -1)* pageSize;
return sdi. selectPage(offset,pageSize);
}
@Override
public int queryTotal() {
return sdi.selectTotal();
}
StudentDaoImpl中关键代码
@Override
public List<Student> selectPage(int offset, int pageSize) {
String sql = "select * from students limit ?,?";
BeanListHandler<Student> handler = new BeanListHandler(Student.class);
Integer[] args = {offset,pageSize};
return DBUtil.select(sql,handler,args);
}
@Override
public int selectTotal() {
String sql = "select count(*) from students";
ScalarHandler<Long> handler = new ScalarHandler<>();
Integer[] args = {};
return DBUtil.select(sql,handler,args);
}
DBUtil中对查询的操作
public static <T> List<T> select(String sql, BeanListHandler<T> beanListHandler, Object... args){
List<T> list = null;
try {
list = runner.query(sql,beanListHandler,args);
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
//long强转int
public static int select(String sql, ScalarHandler<Long> scalarHandler, Object... args){
int num = 0 ;
try {
num = (int)runner.query(sql,scalarHandler,args).intValue();
} catch (SQLException e) {
e.printStackTrace();
}
return num;
}
list.jsp中对页码部分的设置,采用booystrap设置的分页框架
需注意的是:左右两边界限的判断
左边界限:当currentPage-1=0时 显示第一页,否则显示当前页currentPage-1;
右边界限:当currentPage+1>pages 时 显示最大页即Pages,否则显示当前页currentPage+1;
对当前页添加激活颜色
<tr>
<td colspan="7">
<nav aria-label="Page navigation">
<ul class="pagination">
<li>
<a href="?a=look&p=${currentPage-1 == 0?1:currentPage-1}" aria-label="Previous">
<span aria-hidden="true">«</span>
</a>
</li>
<c:forEach begin="1" end="${pages}" var="i">
<li class="${i==currentPage ? 'active':''}"><a href="?a=look&p=${i}">${i}</a></li>
</c:forEach>
<li>
<a href="?a=look&p=${currentPage+1 > pages? pages:currentPage+1}" aria-label="Next">
<span aria-hidden="true">»</span>
</a>
</li>
</ul>
</nav>
</td>
</tr>