下面为非插件,纯代码实现
这是代码实现的效果图:
首先正常的分页如果是第一次写可以在查询全部的表格写完后在此基础上再做修改。
需要增加的参数:从第几条开始 start,查询几条数据 , pageSize(自己定),总数据条数 allCount ,当前页数 curPage , 总页数 allPage
书写顺序:
↓
Dao层:(原查所有的方法)由于分页一页显示的是固定的条数所以需要获取limit的两个参数(从第几条开始 start,查询几条 pageSize)
实现代码:
↓
select * from 表名 limit ?,?
↓ (新增方法)用于展示获取总页数,只需获取本表一共有多少数据即可,系统自动生成的count后面会有一个空格必须删掉,不然会报错(总数据条数 allCount )
↓ 实现代码:
select count(*) cou from 表名 //(cou为别名可不写)
Servlet层:由于通常需要给用户显示当前页数和总页数(所以需要获取这两个参数 curPage allPage)
↓ (curPage获取思路:不管有没有先从request作用域获取,由于第一次访问所以还未进入到jsp,所以第一次一定为空,可以加一个小判断解决)
↓ 实现代码:
//尝试从请求路径中获取页号,第一次获取不到,点击下一页或者上一页时候可以获取
String curPageStr=req.getParameter("curPage");
int curPage=1;//当前的页数默认值为1
if (curPageStr!=null){
curPage= Integer.parseInt(curPageStr);
}
↓ (start获取思路:根据carPage和pageSize获取)
↓ 实现代码:
int pageSize=3;//一页显示的条数,自定
int start=(curPage-1)*pageSize;//从第几条开始显示的
↓ (allPage获取思路:可以用上面写出来的获取总条数除于一页的条数获取 ***但是,由于最后一页并不一定显示完全也就是说前面除法有余数,这个余数也是需要单独一页来展示出来的,所以我们用%来判断一下)
↓ 实现代码(根据自己的代码修改):
//获取总条数
int count=phoneService.allCount();
//给总页数设置初始值
int allPage=0;
//如果除尽则为当前页面刚好可以展示全,不需要再加一页
//如果除不尽则需要再添加一页来展示剩余数据
if (count%pageSize==0){
allPage=count/pageSize;
}else {
allPage=count/pageSize+1;
}
//总条数除于一页的条数的总页数就是总页数
session.setAttribute("allPage",allPage);
jsp页面:用超链接来表示上一页下一页(如果嫌丑可以根据自己的喜好添加样式,***上面的数据记得转发过来)
↓ 这里直接展示代码:
<div >当前是第${作用域.curPage}页 ,共${作用域.allPage}页</div>
<a href="${pageContext.request.contextPath}这里是Servlet的注解地址?curPage=${作用域.curPage-1} >上一页</a>
<a href="${pageContext.request.contextPath}这里是Servlet的注解地址?curPage=${作用域.curPage+1}>下一页</a>
jsp页面优化:由于便于用户操作添加一个首页尾页,并且不再在第一页显示上一页和首页(解决逻辑问题)
↓ (当然可以根据此处逻辑根据自己的想法修改,如显示第一二三页直接跳转到指定页面)
↓ 代码展示:(用c标签的if判断解决)
<c:if test="${作用域.curPage>1}">
<a href="${pageContext.request.contextPath}这里是Servlet的注解地址?curPage=1">首页</a>
<a href="${pageContext.request.contextPath}这里是Servlet的注解地址?curPage=${作用域.curPage-1} >上一页</a>
</c:if>
<c:if test="${sessionScope.curPage<sessionScope.allPage}">
<a href="${pageContext.request.contextPath}这里是Servlet的注解地址?curPage=${作用域.curPage+1}>下一页</a>
<a href="${pageContext.request.contextPath}这里是Servlet的注解地址?curPage=${作用域.allPage}">尾页</a>
</c:if>
这是插件实现:(包自行找,这里是maven导入)
这种写法dao和业务类都比较复杂。我们可以通过mybatis的PageHelper简化我们的开发。
具体步骤:
- 引入依赖包
<!--mybatis的分页插件-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.11</version>
</dependency>
- 在mybatis主配置文件mybatis-config.xml中注册该插件。
要写在实体类别名下面,数据源配置的上面
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>
- 只要在dao里面提供查询所有的方法。
- 调用dao的时候需要两行代码
SqlSession session = MybatisUtil.getSession();
ProductDao pd = session.getMapper(ProductDao.class);
//设置分页信息。第一个参数是页号,第二个参数是一页显示的条数
PageHelper.startPage(1, 3);
//查询全部
List<Product> proList = pd.selectAll();
//把查询全部返回的数据封装到PageInfo对象里面。
PageInfo<Product> pi=new PageInfo<>(proList);
List<Product> list = pi.getList();//获取到当前页的所有数据
pi.getNextPage();//下一页的页号
pi.getPages();//总页数
boolean hasNextPage = pi.isHasNextPage();//是否有下一页
boolean hasPreviousPage = pi.isHasPreviousPage();//是否有上一页
pi.getPageNum();//当前页号
session.close();
版权归原作者 05年的程序员 所有, 如有侵权,请联系我们删除。