注:这是根据老师上课的内容做的课程项目笔记,项目资源是老师发的,不是本人的项目资源
上个博客完成了所有商品类型的查找,最后展示的页面是所有商品类型展示在同一个页面中。但是当商品类型多到一页放不下时就会出现问题,这个时候需要对数据库中查询的数据进行分页。
在线商城系统04——列表分页
分页查询:查询数据,限制一页上出现数据的条数
select * from t_product_type limit 1,3;
使用limit实现分页查询
limit 开始索引,显示的条数
列表分页其实就是在原来查询的基础上拼接一个这样的分页条件,分页的条件可以是自己设定的也可以是默认的。
导入支持分页的jar包
想要实现列表分页要导入分页的依赖,因为分页是与数据相关的,所以在dao模块中导入最为合适,web模块中导入了service模块的依赖,service中导入了dao的依赖,因此在web模块中可以使用分页。
要使用分页就要在配置文件spring-dao.xml中添加分页查询的插件:
通用分页拦截器可以对多种数据库语言进行拦截,每种数据库语言都有方言,这里用的是MySQL数据库,所以要指定MySQL数据库的方言
修改service模块代码实现分页
未添加分页时,查询所有商品类型的语句是这样的:
现在要对这个方法进行几点修改:
- 添加参数“开始页”和“每页展示的数据条数”
findAll(Integer page,Integer pageSize);
page:当前页,pageSize:每页显示的数据条数 - 返回值改为PageInfo类型的,因为PageInto包装类里面有许多封装好的方法,用起来很方便,比如查看页头页尾等方法,PageInfo中也包含了List,功能比List强大很多。这样返回的不仅仅就只有数据列表,还有其他的信息
- 注意:因为在dao配置文件中添加了分页拦截,PageHelper作为拦截的条件,会拦截从PageHelper调用dao方法之间的所有语句,所以PageHelper和调用语句要写在一起
@Transactional(propagation = Propagation.SUPPORTS,readOnly = true)
@Override
public PageInfo<ProductType> findAll(Integer page, Integer pageSize) {
PageHelper.startPage(page, pageSize);
List<ProductType> productTypes = productTypeDao.selectAll();
PageInfo<ProductType> pageInfo = new PageInfo<>(productTypes);
return pageInfo;
}
修改Controller层代码
controller层调用service层的方法,service模块中查询所有商品类型的方法中设置了两个参数,当前页数和页大小,页大小可以写一个固定的数,当前页数如果前端没有指定就默认显示第一页,如果指定了就显示指定的页数。
在公共模块中创建存放常量的包,定义一个专门存放常量的类,定义两个常量:
修改controller中的productTypeController类:
@RequestMapping("/findAll")
public String manage( Integer page,Model model) {
//如果没有传入当前页的参数,就取默认值
if (ObjectUtils.isEmpty(page)) {
page = Constant.PAGE_NUM;
}
PageInfo<ProductType> pageInfo = productTypeService.findAll(page,Constant.PAGE_SIZE );
model.addAttribute("data", pageInfo);
return "productTypeManager";
}
注意:返回的是一个pageInfo对象,不是查询结果list,在前端获取的时候要获取pageInfo中的list数据
运行结果:
这样写的弊端是每次都要在网址上加上参数page,过于繁琐,可以在页面上添加分页栏
使用bootstrap-pageinator插件分页:
-
创建分页栏存放的ul
要添加在放数据的table下面 -
在productTypeManage页面加上bootstrap-pageinator的js
-
重写bootstrap-paginator.js中的方法bootstrapPaginator,使点击的时候就开始调用该方法
在这个方法中加入几个我们需要的参数:指定版本号、总页数、当前页、返回访问路径和分页栏格式等
<script src="${pageContext.request.contextPath}/js/bootstrap-paginator.js"></script>
<script>
$(function () {
$('#pagination').bootstrapPaginator({
//版本
bootstrapMajorVersion: 3,
//当前页
currentPage: ${data.pageNum},
//总页数
totalPages: ${data.pages},
//点击分页栏返回的请求路径(带参数)
pageUrl: function (type, page, current) {
return '${pageContext.request.contextPath}/backend/productType/findAll?page='+page;
},
//分页栏的首页、尾页、下一页、上一页
itemTexts: function (type, page, current) {
switch (type) {
case "first":
return "首页";
case "prev":
return "上一页";
case "next":
return "下一页";
case "last":
return "尾页";
case "page":
return page;
}
}
})
});
</script>