页面数据之分页查询

本文提示,因为细节太多,最好有一定基础的码友,因为其中我封装了其他方法!大家可以从我这里看一部分比较重要的代码!

 

这里我说一下,分页的主要流程:

流程1:设置为存储分页信息的PageBean

在servlet层:

在service层和dao层:

jsp页面::我就不说明了,因为其中代码注释已近很详细了,可以直接看代码!

 

接下来,把我的源码给大家:

PageBean:



import java.util.List;

public class PageBean<T> {
	
	private int currentPage;//当前页码
//	private int toatalPage;//总页数
	private int totalData;//总数据条数
	private int pageSize;//每页的大小
	private List<T> beanList;//每页的数据
	
	
	
	public int getCurrentPage() {
		return currentPage;
	}
	public void setCurrentPage(int currentPage) {
		this.currentPage = currentPage;
	}
	
	//总页数不需要指定(由 总数据/每页 大小可得)
	public int getTotalPage() {
		int totalPage = totalData/pageSize;
		//如果正好,则返回,如果多余,则多余的再加一页!
		return totalData%pageSize==0?totalPage:totalPage+1;
	}
	
	public int getTotalData() {
		return totalData;
	}
	public void setTotalData(int totalData) {
		this.totalData = totalData;
	}
	
	public int getPageSize() {
		return pageSize;
	}
	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}
	
	public List<T> getBeanList() {
		return beanList;
	}
	public void setBeanList(List<T> beanList) {
		this.beanList = beanList;
	}
	
	
}

dao代码:我就把调用的那个方法拿出来给大家看下(其他部分的代码跟我们的题目没有关系):

/**
	 * 查询所有的用户
	 * 用户保存在list集合中
	 * @return
	 */
	public PageBean<Customer> findAll(int currentPage, int pageSize) {
		
		PageBean<Customer> pageBean = new PageBean<>();
		
		String sql1 = "select count(*) from t_customer";
		
		Number num;
		try {
			num = (Number)qr.query(sql1, new ScalarHandler<Integer>());
			//设置总的数据条数
			pageBean.setTotalData(num.intValue());
		} catch (SQLException e1) {
			e1.printStackTrace();
		}
		
		String sql2 = "select * from t_customer order by cname limit ?,?";
		
		//设置从当前页面开始查询条数
		int begin = (currentPage-1)*pageSize;
		int step = pageSize;
		
		Object params[] = {begin,step};
		try {
			pageBean.setBeanList(qr.query(sql2, new BeanListHandler<Customer>(Customer.class),params));
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return pageBean ;
	}

 

seevice层代码:

/**
	 * 查询pageBean信息
	 * 返回一个pageBean
	 * @return
	 */
	public PageBean<Customer> findAll(int currentPage, int pageSize){
		return customerDao.findAll(currentPage,pageSize);
	}
	


servlet层代码:

/**
	 * 分页查询(查询所有用户,分页显示)
	 * @param request
	 * @param response
	 * @return
	 * @throws ServletException
	 * @throws IOException
	 */
	public String findAll(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		//设置每页的数据条数(10)
		int pageSize = 10;
		//设置当前的页数
		int currentPage = getPc(request) ;
		
		//从service得到的pageBean中已经有了totalData,和beanlist(每页的数据)
		PageBean<Customer> pageBean = customerService.findAll(currentPage,pageSize);
		
		//再设置     每页的数据条数和当前的页数
		//那么此时的pageBean就是完整的了
		pageBean.setPageSize(pageSize);
		pageBean.setCurrentPage(currentPage);
		
		//保存pageBean
		request.setAttribute("pageBean",pageBean);
		
		return "f:/list.jsp";
	}
	
	/**
	 * 从请求的参数里面获取当前页面值
	 * @return
	 */
	public int getPc(HttpServletRequest request) {
		String pageCode = request.getParameter("pc");
		int pc = 1;
		if(pageCode != null && !pageCode.trim().isEmpty()) {
			pc = Integer.parseInt(pageCode);
		}
		return pc;
	}
	

 

jsp页面代码:

<table border="1" width="70%" align="center">
	<tr>
		<th>客户姓名</th>
		<th>性别</th>
		<th>生日</th>
		<th>手机</th>
		<th>邮箱</th>
		<th>描述</th>
		<th>操作</th>
	</tr>
	<c:forEach items="${pageBean.beanList }" var="customer">
		<tr>
			<td>${customer.cname }</td>
			<td>${customer.gender }</td>
			<td>${customer.birthday }</td>
			<td>${customer.cellphone }</td>
			<td>${customer.email }</td>
			<td>${customer.description }</td>
			<td>
				<a href="<c:url value='/CustomerServlet?method=findCustomerByCid&cid=${customer.cid }'/>">编辑</a>
				<a href="<c:url value='/CustomerServlet?method=delete&cid=${customer.cid }'/>">删除</a>
			</td>
		</tr>
	</c:forEach>
	
</table>
<br>
<center>
	
	第${pageBean.currentPage }页/共${pageBean.totalPage }页
	
	
	<c:choose>
		<c:when test="${pageBean.currentPage eq 1} ">
			首页
		</c:when>
		<c:otherwise>
			
		</c:otherwise>
	</c:choose>
	
	
	<%-- 如果已经是第一页了,那么就不需要上一页了 --%>
	<%-- 也就那么就不需要首页的超链接了 --%>
	<c:choose>
		<c:when test="${pageBean.currentPage eq 1 }">
		
		</c:when>
		<c:otherwise>
			<a href="<c:url  value='/CustomerServlet?method=findAll&pc=1' />">首页</a>
			<a href="<c:url  value='/CustomerServlet?method=findAll&pc=${pageBean.currentPage-1 }' />">上一页</a>
		</c:otherwise>
	</c:choose>
	
	
	
		
	<%-- 这一个choose是处理begin(开始的页面)end(结束的页码数) --%>
	<c:choose >
		<%-- 如果总页数小于10 那么页码就是固定的(1 2 3 4 5 6 7 8 9 10) --%>
		<c:when test="${pageBean.totalPage < 10 }">
			<c:set var="begin" value="1"></c:set>
			<c:set var="end" value="${pageBean.totalPage }"></c:set>
		</c:when>
		
		<%-- 否则就会随着当前页数发生变化 --%>
		<c:otherwise>
			<%-- 
				测试下面的公式 
			 	假如当前页面为6,则有
			 	2 3 4 5 (6) 7 8 9 10 11 
			--%>
			<%-- 这里又会发生  头溢出 或者 尾溢出   --%>
			<c:set var="begin" value="${pageBean.currentPage-4 }"></c:set>
			<c:set var="end" value="${pageBean.currentPage+5 }"></c:set>
			
			<c:choose>
				<%-- 头溢出:说明 1-10页还可以表示  ( 因为   begin-4 <1 )--%>
				<c:when test="${begin < 1 }">
					<c:set var="begin" value="1"></c:set>
					<c:set var="end" value="10"></c:set>
				</c:when>	
						
				<%-- 尾溢出:说明用不到当前页面+5 就可以显示结束  --%>
				<c:when test="${end > pageBean.totalPage }">
					<c:set var="begin" value="${pageBean.totalPage-9 }"></c:set>
					<c:set var="end" value="${pageBean.totalPage }"></c:set>
				</c:when>	
			</c:choose>
			
		</c:otherwise>
	</c:choose>
	
	
	<%-- 这个forEach从上面获得begin和end  那么就可以输出导航页面了--%>
	
	<c:forEach begin="${begin }" end="${end }" var="i">
		<c:choose>
			<c:when test="${i == pageBean.currentPage }">
				${i }
			</c:when>
			<c:otherwise>
				<a href="${pageBean.url }&pc=${i}">${i }</a>
			</c:otherwise>
		</c:choose>
	</c:forEach>
	
	<%-- 如果已经是尾页了,那么就不需要下一页了 --%>
	<%-- 也就就不需要尾页的超链接了 --%>
	<c:choose>
		<c:when test="${pageBean.currentPage eq pageBean.totalPage }">
		
		</c:when>
		<c:otherwise>
			<a href="<c:url  value='/CustomerServlet?method=findAll&pc=${pageBean.currentPage+1 } '/>">下一页</a>
			<a href="<c:url  value='/CustomerServlet?method=findAll&pc=${pageBean.totalPage } ' />">尾页</a>
		</c:otherwise>
	</c:choose>
	

	
	
</center>
</body>

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值