分页挺难的,看了两遍我都有点没搞懂,这个逻辑过程挺复杂的,算是我学这个来最大的问题了。
下面我们分步骤来详细介绍分页技术。
(刚才准备分页代码的时候出现这么一个错误:Connection fails with "Public Key Retrieval is not allowed" for native auth,明明昨天还是好好的,今天却出现这么一个问题,于是搜索一番后,得知这个错误的意思是:不允许公开密钥检索,好吧,我把配置文件中的url后加上了allowPublicKeyRetrieval=true这么一个参数之后,立刻就好了。之后想看看错误,去掉这个参数之后居然又没错了,真是十分神奇,面向运气编程,名不虚传。)
1.什么是分页?
分页,就是一种美观展示大量数据的逻辑方法,在google上它是这样的:
在百度上,它是这样的:
但是我们今天做的,是这样的:
嘿嘿,有模有样。闲话不多说,开始讲:
(1)设计一个保存数据的Page类:
package cn.itcast.domain; import java.util.List; //封装页面数据 public class Page { private List list; private int totalpage; //记住总页数 private int totalrecord; //页面记录总数 private int pagesize = 1; //设置页面大小 private int pagenum; //代表用户想看的页 private int startindex; //代表用户想看的页的数据从数据库哪个地方开始取 private int startPage; //记住jsp页面显示的起始页码 private int endPage; //记往jsp页面显示的结束页码 private String url; //记住用于处理分页的servlet //构造函数 public Page(int totalrecord,int pagenum){ this.totalrecord = totalrecord; if(this.totalrecord%this.pagesize==0){ this.totalpage = this.totalrecord/this.pagesize; //如果记录总数刚好可以除尽页面大小,页面总数就是结果 }else{ this.totalpage = this.totalrecord/this.pagesize + 1;//如果记录总数除不尽,页面总数就是结果+1 } this.pagenum = pagenum; //1 this.startindex = (this.pagenum-1)*this.pagesize; //在数据库中开始的位置为(用户想看的页-1)*页面大小 //根据用户想看的页pagenum,算出jsp页面的起始和结束页码,这里默认显示10页 if(this.totalpage<=10){ this.startPage = 1; this.endPage = this.totalpage; }else{ //如果超过10页,就调整页码,只显示10页 this.startPage = this.pagenum -4; this.endPage = this.pagenum + 5; //如果经过上面计算之后开始页码小于1,则开始页面设为1 if(this.startPage<1){ this.startPage = 1; this.endPage = 10; } //如果进过上面的运算之后结束页码大于1,则结束页面设为总页面,开始为总页面-1 if(this.endPage > this.totalpage){ this.endPage = this.totalpage; this.startPage = this.totalpage-9; } } } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public int getStartPage() { return startPage; } public void setStartPage(int startPage) { this.startPage = startPage; } public int getEndPage() { return endPage; } public void setEndPage(int endPage) { this.endPage = endPage; } public List getList() { return list; } public void setList(List list) { this.list = list; } public int getTotalpage() { return totalpage; } public void setTotalpage(int totalpage) { this.totalpage = totalpage; } public int getTotalrecord() { return totalrecord; } public void setTotalrecord(int totalrecord) { this.totalrecord = totalrecord; } public int getPagesize() { return pagesize; } public void setPagesize(int pagesize) { this.pagesize = pagesize; } public int getPagenum() { return pagenum; } public void setPagenum(int pagenum) { this.pagenum = pagenum; } public int getStartindex() { return startindex; } public void setStartindex(int startindex) { this.startindex = startindex; } }
(2)在dao中编写对应方法
//获取分页数据 public List<Customer> getPageData(int startindex,int pagesize){ Connection conn = null; PreparedStatement st = null; ResultSet rs = null; try{ conn = JdbcUtils.getConnection(); String sql = "select * from customer limit ?,?"; st = conn.prepareStatement(sql); st.setInt(1, startindex); st.setInt(2, pagesize); rs = st.executeQuery(); List list = new ArrayList(); while(rs.next()){ Customer c = new Customer(); c.setBirthday(rs.getDate("birthday")); c.setCellphone(rs.getString("cellphone")); c.setDescription(rs.getString("description")); c.setEmail(rs.getString("email")); c.setGender(rs.getString("gender")); c.setId(rs.getString("id")); c.setName(rs.getString("name")); c.setPreference(rs.getString("preference")); c.setType(rs.getString("type")); list.add(c); } return list; }catch (Exception e) { throw new DaoException(e); }finally{ JdbcUtils.release(conn, st, rs); } } //得到总记录数 public int getTotalrecord(){ Connection conn = null; PreparedStatement st = null; ResultSet rs = null; try{ conn = JdbcUtils.getConnection(); String sql = "select count(*) from customer"; st = conn.prepareStatement(sql); rs = st.executeQuery(); if(rs.next()){ return rs.getInt(1); } return 0; }catch (Exception e) { throw new DaoException(e); }finally{ JdbcUtils.release(conn, st, rs); } }
(3)在service中调用该方法:
public Page getPageData(String pagenum,String url){ int totalrecord = dao.getTotalrecord(); if(pagenum==null){ //代表用户想看第一页的数据 Page page = new Page(totalrecord,1); //算出了总页数,以及用户想看的页从数据库哪个地方开始取 List list = dao.getPageData(page.getStartindex(), page.getPagesize()); page.setList(list); page.setUrl(url); return page; }else{ //代表用户想看指定的页 Page page = new Page(totalrecord,Integer.parseInt(pagenum)); List list = dao.getPageData(page.getStartindex(), page.getPagesize()); page.setList(list); page.setUrl(url); return page; } }
(4)做出UIservlet转发到jsp
package cn.itcast.web.controller; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import cn.itcast.domain.Page; import cn.itcast.service.impl.BusinessService; /** * Servlet implementation class ListCustomerServlet */ @WebServlet(urlPatterns="/servlet/ListCustomerServlet") public class ListCustomerServlet extends HttpServlet { private static final long serialVersionUID = 1L; public ListCustomerServlet() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub try{ String pagenum = request.getParameter("pagenum"); BusinessService service = new BusinessService(); //获取servlet名称,切分 String[] servletNames = this.getServletName().split("\\."); //制作url Page page = service.getPageData(pagenum,request.getContextPath() + "/servlet/" + servletNames[4]); request.setAttribute("page", page); request.getRequestDispatcher("/WEB-INF/jsp/listcustomer.jsp").forward(request, response); }catch (Exception e) { e.printStackTrace(); request.setAttribute("message", "查询失败!!!"); request.getRequestDispatcher("/message.jsp").forward(request, response); } } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
(5)做出Jsp展示数据:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@taglib uri="/WEB-INF/itcast.tld" prefix="itcast" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>显示所有用户</title> </head> <body style="text-align: center;"> <table border="1" width="90%" frame="border"> <tr> <td>客户姓名</td> <td>性别</td> <td>生日</td> <td>手机号码</td> <td>邮箱</td> <td>爱好</td> <td>类型</td> <td>备注</td> <td>操作</td> </tr> <c:forEach var="c" items="${page.list}"> <tr> <td><c:out value="${c.name }" escapeXml="true"/></td> <td><c:out value="${c.gender }" escapeXml="true"/></td> <td><c:out value="${c.birthday }" escapeXml="true"/></td> <td><c:out value="${c.cellphone }" escapeXml="true"/></td> <td><c:out value="${c.email }" escapeXml="true"/></td> <td><c:out value="${itcast:subString(c.preference,10)}" escapeXml="true"/></td> <td><c:out value="${c.type }" escapeXml="true"/></td> <td><c:out value="${itcast:subString(c.description,10)}" escapeXml="true"/></td> <td> <a href="${pageContext.request.contextPath }/servlet/UpdateCustomerUIServlet?id=${c.id }">修改</a> <a href="javascript:dodelete('${c.id }')">删除</a> </td> </tr> </c:forEach> </table> <br/> <%@include file="/public/page.jsp" %> <script type="text/javascript"> function dodelete(id) { var b = window.confirm("您确认删除吗??"); if(b){ window.location.href="${pageContext.request.contextPath }/servlet/DeleteCustomerServlet?id=" + id; } } </script> </body> </html>
其中,${itcast:subString(String,int)}为一个自定义函数,用于将过长的文本省略展示,以造成页面的美观,展示效果为:
tld文件为:
<?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> <description>A tag library exercising SimpleTag handlers.</description> <tlib-version>1.0</tlib-version> <short-name>SimpleTagLibrary</short-name> <uri>/itcast</uri> <function> <name>subString</name> <function-class>cn.itcast.web.el.ElUtils</function-class> <function-signature>java.lang.String subString( java.lang.String,java.lang.Integer )</function-signature> </function> </taglib>
ELUtils设计为:
package cn.itcast.web.el; public class ElUtils { public static String subString(String source,Integer length){ if(source.length()>length){ return source.substring(0,length) + "......."; } return source; } }这就是分页技术详细过程啦,随便转载!(逃