分页显示是列表控件常用功能,在没有使用其他前端JS工具实现页面情况下,需要自己实现分页显示逻辑,这里也涉及到数据库表的分页查询功能,Mysql数据库在SQL中使用Limits关键字实现分页查询,但其他数据库如:Oracle,Mssql不支持此关键字,所以我们使用Mybatis的分页插件实现数据库的分页查询,这样代码比较通用。
工具类PageUtil
public class PageUtil {
private Integer page = 1;//默认显示第一页
private Integer rows = 4;//每页显示记录数
private Long total = null;//总行数
private String url = null;//点击页码跳转url
/**
*
* @param url 点击页码跳转url
* @param page 当前页码
* @param rows 每页显示记录数
* @param total 总行数
*/
public PageUtil(String url,Integer page,Integer rows,Long total)
{
this.url = url;
this.page = page;
this.rows = rows;
this.total = total;
}
/**
* 根据CSS样式定义生成HTML代码片段
* @return
*/
public String toHtml()
{
StringBuffer sb = new StringBuffer();
//计算总页数
int pages = 0;
if(total % rows == 0)
pages = total.intValue() / rows;
else
pages = (total.intValue() / rows) + 1;
//定义分页工具条DIV层
sb.append("<div id='pagediv'>\r\n");
String firstUrl = null;
//判断URL是否带有参数,如果带有参数使用&连接分页参数
//否则使用?连接参数
if(url.indexOf("?")>0)
firstUrl = url + "&page=1&rows="+rows;
else
firstUrl = url + "?page=1&rows="+rows;
sb.append("<a href='"+firstUrl+"'>首页</a>\r\n");
//定义上一页连接
String backUrl = null;
if(url.indexOf("?")>0)
backUrl = url + "&page="+(page==1?1:(page-1))+"&rows="+rows;
else
backUrl = url + "?page="+(page==1?1:(page-1))+"&rows="+rows;
sb.append("<a href='"+backUrl+"'>上一页</a>\r\n");
//显示页面超链接
for(int i=1;i<=pages;i++)
{
String pageUrl = null;
if(url.indexOf("?")>0)
pageUrl = url + "&page="+i+"&rows="+rows;
else
pageUrl = url + "?page="+i+"&rows="+rows;
if(i == page)
sb.append("<a href='"+pageUrl+"'><b><font color='red'>"+i+"</font></b></a>\r\n");
else
sb.append("<a href='"+pageUrl+"'>"+i+"</a>\r\n");
}
//定义下一页连接
String nextUrl = null;
if(url.indexOf("?")>0)
nextUrl = url + "&page="+(page==pages?pages:(page+1))+"&rows="+rows;
else
nextUrl = url + "?page="+(page==pages?pages:(page+1))+"&rows="+rows;
sb.append("<a href='"+nextUrl+"'>下一页</a>\r\n");
//定义尾页连接
String lastUrl = null;
if(url.indexOf("?")>0)
lastUrl = url + "&page="+pages+"&rows="+rows;
else
lastUrl = url + "?page="+pages+"&rows="+rows;
sb.append("<a href='"+lastUrl+"'>尾页</a>\r\n");
//定义其他显示信息
sb.append(" 第"+page+"/"+pages+"页\r\n");
sb.append(" 共"+total+"条记录\r\n");
sb.append("</div>\r\n");
return sb.toString();
}
}
配置Page分页插件
<!-- 分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.1.2</version>
</dependency>
Mybatis配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.test.mapper.GoodMapper">
<select id="findGood" resultType="com.test.bean.GoodInfo">
select g.*,t.name typeName from t_good g,t_type t where g.typeid=t.id and
(g.name like '%${gname}%' and t.fullname like '%${tname}%')
order by g.price ${sort}
</select>
Controller类中定义
@RequestMapping("/list")
public String list(HttpServletRequest req,Integer page,Integer rows)
{
//从前端页面接收的分页参数
if(page == null)
page = 1;
if(rows == null)
rows = 4;
//查询字段定义
String gname = req.getParameter("gname");
String tname = req.getParameter("tname");
String sort = req.getParameter("sort");
if(sort == null || "".equals(sort))
sort = "asc";
System.out.println("gname="+gname+",tname="+tname+",sort="+sort);
//分页插件,一定在执行数据库查找之前调用
//原理是通过动态代理模式重新定义执行的SQL
PageHelper.startPage(page, rows);
//执行数据库查询
List<GoodInfo> list = serv.findGood(gname, tname,sort);
//定义分页对象,存放查询结果集
PageInfo<GoodInfo> pi = new PageInfo<GoodInfo>(list);
Long total = pi.getTotal();
List<GoodInfo> goods = pi.getList();
//page 当前页
//rows 每页记录数
//total 全部记录数
//url 列表URL
String url = "/list";
//String pageHtml = PageUtil.toHtml(url, page, rows, total);
PageUtil pu2 = new PageUtil(url, page, rows, total);
String pageHtml = pu2.toHtml();
req.setAttribute("pageHtml", pageHtml);
req.setAttribute("goods", goods);
req.setAttribute("gname", gname);
req.setAttribute("tname", tname);
req.setAttribute("sort", sort);
return "good";
}