分页实现的思路
分页显示的步骤
- 确定每页显示的数据数量
- 确定分页显示所需的总页数
- 编写sql查询语句,实现数据查询
- 在jsp页面中进行分页显示设置
封装Page类
将有关分页的数据封装到page类
public class PageUtil {
private int pageindex=1;//当前页码
private int pagesize=10;//页大小
private int counts=0;//总记录数,总条数
private int pagecount=0;//总页数
private List<T> list;//每页对象的集合
.....//省略getter/setter方法
获取总记录数
select count(1) from 表名;
使用LIMIT子句
select 字段 from 表名 LIMIT num1,num2;
num1:开始的偏移量 num2:每页的大小
起始的下标=(当前页页码-1)*每页显示的数据量
页面设置
- 根据已确认的当前页码设置参数
当前页[${pageutil.pageindex}/${pageutil.pagecount}]
<c:if test="${pageutil.pageindex>1}">
<a href="UserServlet?type=pagelist&pageindex=1">首页</a>
<a href="UserServlet?type=pagelist&pageindex=${pageutil.pageindex-1}">上一页</a>
</c:if>
<c:if test="${pageutil.pageindex<pageutil.pagecount}">
<a href="UserServlet?type=pagelist&pageindex=${pageutil.pageindex+1}">下一页</a>
<a href="UserServlet?type=pagelist&pageindex=${pageutil.pagecount}">尾页</a>
</c:if>
代码操作
- 创建一个项目,在数据库准备好数据
- 在项目创建包:dao层
//查询总量
public int counts();
//分页
public List<News> getPageAll(PageUtil pageUtil);
- 创建daoimpl继承basedao实现接口
public class NewsDaoImpl extends BaseDao implements NewsDao{
@Override
public int counts() {
int count=0;
String sql="select count(1) from newss;";
rs=myexecuteQuery(sql, null);
try {
while(rs.next()) {
count=rs.getInt(1);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
closeAll();
return count;
}
@Override
public List<News> getPageAll(PageUtil pageUtil) {
List<News> list=new ArrayList<News>();
String sql="select * from newss limit ?,?;";
Object [] lists= {(pageUtil.getPageindex()-1)*pageUtil.getPagesize(),pageUtil.getPagesize()};
rs=myexecuteQuery(sql, lists);
try {
while (rs.next()) {
News news=new News(rs.getInt(1), rs.getString(2),rs.getTimestamp(3));
list.add(news);
}
} catch (SQLException e) {
e.printStackTrace();
}
closeAll();
return list;
}
- 在项目创建包:biz层
public interface NewsBiz {
public void getPageAll(PageUtil pageUtil);
}
- 创建bizimpl实现接口
public class NewBizImpl implements NewsBiz {
NewsDao ndao=new NewsDaoImpl();
@Override
public void getPageAll(PageUtil pageUtil) {
//获取总量
int counts=ndao.counts();
//设置总页数
pageUtil.setPageindex(counts);
//判断总量
if (counts>0) {
//设置右边界
if (pageUtil.getPageindex()>pageUtil.getPageCount()) {//如果当前页大于总量
pageUtil.setPageindex(pageUtil.getPageCount());//设置页总量
}
//获取集合
pageUtil.setList(ndao.getPageAll(pageUtil));
}else {
//设置一个空的集合
pageUtil.setList(new ArrayList<News>());
}
}
}
- 创建包:servlet
- 使用doget方法
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf8");
request.setCharacterEncoding("utf-8");
String type=request.getParameter("type");
NewsBiz nBiz=new NewBizImpl();
if ("pagelist".equals(type)) {//分页
String pageindex=request.getParameter("pageindex");
if (pageindex==null) {
pageindex= "1";
}
int index=Integer.parseInt(pageindex);
if (index < 1) {//左边界
index = 1; //左边界小于1 首页默认设置为1
}
PageUtil pageUtil=new PageUtil();
pageUtil.setPageindex(index);
pageUtil.setPageindex(2);//设置每页显示几条数据
nBiz.getPageAll(pageUtil);
//返回主界面
request.setAttribute("pageutil", pageUtil);
request.getRequestDispatcher("index.jsp").forward(request, response);
}
}
- 创建index.jsp页面
<c:if test="${empty pageutil}">
<jsp:forward page="NewServlet?type=pagelist"></jsp:forward>
</c:if>
<h1 align="center">新闻列表</h1>
<ul align="center">
<c:forEach items="${pageutil.list}" var="list" varStatus="statu">
<li>${list.nid }
${list.ntitle }
<fmt:formatDate value="${list.ncreatedate }"/>
</li>
</c:forEach>
</ul>
<ul align="center">
<li>
当前页[${pageutil.pageindex}/${pageutil.pagecount}]
<c:if test="${pageutil.pageindex>1}">
<a href="NewServlet?type=pagelist&pageindex=1 ">首页</a>
<a href="NewServlet?type=pagelist&pageindex=${pageutil.pageindex-1} ">上一页</a>
</c:if>
<c:if test="${pageutil.pageindex<pageutil.pagecount}">
<a href="NewServlet?type=pagelist&pageindex=${pageutil.pageindex+1} ">下一页</a>
<a href="NewServlet?type=pagelist&pageindex=${pageutil.pagecount} ">尾页</a>
</c:if>
</li>
</ul>
最后运行实现以下效果:
总结:
currPageNo=1; 当前页码==》用户决定 范围:左边界(>0)和右边界(<=总页数)
pageSize=15; 页码大小==》用户决定 必须设置默认值
totalCount; 记录总数==》数据库决定 count(1)
totalPageCount; 总页数 ==》计算决定 总数/页大小
List; 每页对象集合==》数据库取得 Limit num1,num2 num1:开始的偏移量 num2:没页大小
开始的偏移量=(页码-1)*页大小