分页实现的思路

分页显示的步骤

  • 确定每页显示的数据数量
  • 确定分页显示所需的总页数
  • 编写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 } 
			&nbsp;&nbsp;&nbsp;&nbsp;
			&nbsp;&nbsp;&nbsp;&nbsp;
			${list.ntitle } 
			&nbsp;&nbsp;&nbsp;&nbsp;
			&nbsp;&nbsp;&nbsp;&nbsp;
			<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)*页大小

更多推荐

Java (jsp分页练习)