Java分页技术

[java]  view plain copy
  1. package cn.pdsu;  
  2.   
  3. /** 
  4.  * 类说明:学生信息封装 
  5.  *  
  6.  * @author 作者: LiuJunGuang 
  7.  * @version 创建时间:2011-11-9 下午02:30:50 
  8.  */  
  9. public class Student {  
  10.     private int id;  
  11.     private String name;  
  12.     private String sex;  
  13.     private String resume;  
  14.   
  15.     public Student(int id, String name, String sex, String resume) {  
  16.         super();  
  17.         this.id = id;  
  18.         this.name = name;  
  19.         this.sex = sex;  
  20.         this.resume = resume;  
  21.     }  
  22.   
  23.     public Student() {  
  24.         super();  
  25.     }  
  26.   
  27.     public int getId() {  
  28.         return id;  
  29.     }  
  30.   
  31.     public void setId(int id) {  
  32.         this.id = id;  
  33.     }  
  34.   
  35.     public String getName() {  
  36.         return name;  
  37.     }  
  38.   
  39.     public void setName(String name) {  
  40.         this.name = name;  
  41.     }  
  42.   
  43.     public String getSex() {  
  44.         return sex;  
  45.     }  
  46.   
  47.     public void setSex(String sex) {  
  48.         this.sex = sex;  
  49.     }  
  50.   
  51.     public String getResume() {  
  52.         return resume;  
  53.     }  
  54.   
  55.     public void setResume(String resume) {  
  56.         this.resume = resume;  
  57.     }  
  58.   
  59.     @Override  
  60.     public String toString() {  
  61.         return "Student [id=" + id + ", name=" + name + ", sex=" + sex  
  62.                 + ", resume=" + resume + "]";  
  63.     }  
  64.   
  65. }  
[java]  view plain copy
  1. package cn.pdsu;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.List;  
  5.   
  6. import javax.servlet.ServletException;  
  7. import javax.servlet.http.HttpServlet;  
  8. import javax.servlet.http.HttpServletRequest;  
  9. import javax.servlet.http.HttpServletResponse;  
  10.   
  11. /** 
  12.  * 类说明:分页控制器 
  13.  *  
  14.  * @author 作者: LiuJunGuang 
  15.  * @version 创建时间:2011-11-9 下午03:47:59 
  16.  */  
  17. public class ControlServlet extends HttpServlet {  
  18.   
  19.     public ControlServlet() {  
  20.     }  
  21.   
  22.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  23.             throws ServletException, IOException {  
  24.         DataSourceDAO dataSourceDAO = new DataSourceDAO();  
  25.         int countRecord = dataSourceDAO.count();  
  26.         request.setCharacterEncoding("UTF-8");  
  27.         // 得到当前页  
  28.         String currentPage = request.getParameter("page");  
  29.         if (currentPage == null)  
  30.             currentPage = "1";  
  31.         int cp = Integer.parseInt(currentPage);// 当前页码  
  32.         Page<Student> p = new Page<Student>(cp, countRecord);  
  33.         // 数据库中的查询结果  
  34.         List<Student> list = dataSourceDAO.findStudent(p.getStartIndex(),  
  35.                 p.getOnePageCount());  
  36.         p.setList(list);// 设置结果集  
  37.         // 设置页码显示类型  
  38.         PageModel<Student> pageModel = new PageModel<Student>(p,  
  39.                 "servlet/ControlServlet", PageModel.NUM_MODEL);  
  40.         request.setAttribute("pageObject", pageModel);  
  41.         getServletContext().getRequestDispatcher("/show.jsp").forward(request,  
  42.                 response);  
  43.   
  44.     }  
  45.   
  46.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  47.             throws ServletException, IOException {  
  48.         doGet(request, response);  
  49.     }  
  50.   
  51. }  

[java]  view plain copy
  1. package cn.pdsu;  
  2.   
  3. import java.util.LinkedList;  
  4. import java.util.List;  
  5.   
  6. /** 
  7.  * 类说明:数据的封装 
  8.  *  
  9.  * @author 作者: LiuJunGuang 
  10.  * @version 创建时间:2011-11-9 下午02:28:27 
  11.  */  
  12. public class DataSourceDAO {  
  13.     private static List<Student> list = new LinkedList<Student>();  
  14.     static {  
  15.         for (int i = 0; i < 20; i++) {  
  16.             list.add(new Student(i, "张山" + i, "男""学生" + i));  
  17.         }  
  18.     }  
  19.   
  20.     /** 
  21.      * 模拟数据库中分页查询 
  22.      *  
  23.      * @param startIndex 
  24.      *            要查询的开始索引 
  25.      * @param count 
  26.      *            查询的总记录数 
  27.      * @return 查询出的学生记录 
  28.      */  
  29.     public List<Student> findStudent(int startIndex, int count) {  
  30.         int num = count + startIndex;  
  31.         if (num > list.size())  
  32.             num = list.size();  
  33.         return list.subList(startIndex, num);  
  34.     }  
  35.   
  36.     /** 
  37.      * 模拟数据库中查询总记录数 
  38.      *  
  39.      * @return 总的记录数 
  40.      */  
  41.     public int count() {  
  42.         return list.size();  
  43.     }  
  44. }  

[java]  view plain copy
  1. package cn.pdsu;  
  2.   
  3. import java.util.List;  
  4.   
  5. /** 
  6.  * 类说明:分页方法封装 
  7.  *  
  8.  * @author 作者: LiuJunGuang 
  9.  * @version 创建时间:2011-11-9 下午02:22:35 
  10.  */  
  11. public class Page<T> {  
  12.     /** 
  13.      * 总页数,通过总记录数和每页显示记录条数计算获得 
  14.      */  
  15.     private int countPage;  
  16.     /** 
  17.      * 总记录数 
  18.      */  
  19.     private int countRecord;  
  20.     /** 
  21.      * 当前页,默认是第一页 
  22.      */  
  23.     private int currentPage = 1;  
  24.     /** 
  25.      * 结果列表 
  26.      */  
  27.     private List<T> list = null;  
  28.     /** 
  29.      * 每页显示记录条数 ,默认是每页显示13条记录 
  30.      */  
  31.     private int onePageCount = 3;  
  32.     /** 
  33.      * 开始索引,通过当前页和每页显示记录条数计算获得 
  34.      */  
  35.     private int startIndex;  
  36.   
  37.     public Page() {  
  38.     }  
  39.   
  40.     /** 
  41.      * 两个参数的构造方法,调用该构造方法需要另行设置结果list 
  42.      *  
  43.      * @param currentPage 
  44.      *            当前页 
  45.      * @param countRecord 
  46.      *            总页数 
  47.      */  
  48.     public Page(int currentPage, int countRecord) {  
  49.         this.currentPage = currentPage;  
  50.         this.countRecord = countRecord;  
  51.         calculate();  
  52.     }  
  53.   
  54.     /** 
  55.      * 能够设置一页显示多少条记录的构造方法 
  56.      *  
  57.      * @param currentPage 
  58.      *            当前页 
  59.      * @param countRecord 
  60.      *            总记录数 
  61.      * @param onePageCount 
  62.      *            每页最多显示的记录条数 
  63.      */  
  64.     public Page(int currentPage, int countRecord, int onePageCount) {  
  65.         super();  
  66.         this.countRecord = countRecord;  
  67.         this.currentPage = currentPage;  
  68.         this.onePageCount = onePageCount;  
  69.         calculate();  
  70.     }  
  71.   
  72.     /** 
  73.      * 计算开始索引和总页数 
  74.      */  
  75.     private void calculate() {  
  76.         // 计算开始索引  
  77.         this.startIndex = (currentPage - 1) * onePageCount;  
  78.         // 计算总页数  
  79.         this.countPage = (countRecord % onePageCount == 0) ? (countRecord / onePageCount)  
  80.                 : (countRecord / onePageCount + 1);  
  81.     }  
  82.   
  83.     public int getCountPage() {  
  84.         return countPage;  
  85.     }  
  86.   
  87.     public int getCountRecord() {  
  88.         return countRecord;  
  89.     }  
  90.   
  91.     public int getCurrentPage() {  
  92.         return currentPage;  
  93.     }  
  94.   
  95.     public List<T> getList() {  
  96.         return list;  
  97.     }  
  98.   
  99.     public int getOnePageCount() {  
  100.         return onePageCount;  
  101.     }  
  102.   
  103.     public int getStartIndex() {  
  104.         return startIndex;  
  105.     }  
  106.   
  107.     public void setCountPage(int countPage) {  
  108.         this.countPage = countPage;  
  109.     }  
  110.   
  111.     public void setCountRecord(int countRecord) {  
  112.         this.countRecord = countRecord;  
  113.     }  
  114.   
  115.     public void setCurrentPage(int currentPage) {  
  116.         this.currentPage = currentPage;  
  117.     }  
  118.   
  119.     public void setList(List<T> list) {  
  120.         this.list = list;  
  121.     }  
  122.   
  123.     public void setOnePageCount(int onePageCount) {  
  124.         this.onePageCount = onePageCount;  
  125.     }  
  126.   
  127.     public void setStartIndex(int startIndex) {  
  128.         this.startIndex = startIndex;  
  129.     }  
  130. }  

[java]  view plain copy
  1. package cn.pdsu;  
  2.   
  3. /** 
  4.  * 开始页,结束页封装 
  5.  *  
  6.  * @author 作者:user 
  7.  * @version 创建时间:2011-7-19 上午03:08:25 
  8.  */  
  9. public class PageIndex {  
  10.     /** 
  11.      * 结束页 
  12.      */  
  13.     private int endIndex;  
  14.   
  15.     /** 
  16.      * 开始页 
  17.      */  
  18.     private int startIndex;  
  19.   
  20.     /** 
  21.      * 计算开始页和结束页 
  22.      *  
  23.      * @param viewpagecount 
  24.      *            页面中要显示的页面个数 
  25.      * @param currentPage 
  26.      *            当前页 
  27.      * @param totalpage 
  28.      *            总页面数 
  29.      * @return PageIndex 记录开始页(startindex)和结束页(endindex) 
  30.      */  
  31.     public static PageIndex getPageIndex(int viewpagecount, int currentPage,  
  32.             int totalpage) {  
  33.         int startpage = currentPage  
  34.                 - (viewpagecount % 2 == 0 ? viewpagecount / 2 - 1  
  35.                         : viewpagecount / 2);  
  36.         int endpage = currentPage + viewpagecount / 2;  
  37.         if (startpage < 1) {  
  38.             startpage = 1;  
  39.             if (totalpage >= viewpagecount)  
  40.                 endpage = viewpagecount;  
  41.             else  
  42.                 endpage = totalpage;  
  43.         }  
  44.         if (endpage > totalpage) {  
  45.             endpage = totalpage;  
  46.             if ((endpage - viewpagecount) > 0)  
  47.                 startpage = endpage - viewpagecount + 1;  
  48.             else  
  49.                 startpage = 1;  
  50.         }  
  51.         return new PageIndex(startpage, endpage);  
  52.     }  
  53.   
  54.     public PageIndex(int startIndex, int endIndex) {  
  55.         this.startIndex = startIndex;  
  56.         this.endIndex = endIndex;  
  57.     }  
  58.   
  59.     public int getEndIndex() {  
  60.         return endIndex;  
  61.     }  
  62.   
  63.     public void setEndIndex(int endIndex) {  
  64.         this.endIndex = endIndex;  
  65.     }  
  66.   
  67.     public int getStartIndex() {  
  68.         return startIndex;  
  69.     }  
  70.   
  71.     public void setStartIndex(int startIndex) {  
  72.         this.startIndex = startIndex;  
  73.     }  
  74.   
  75. }  

[java]  view plain copy
  1. package cn.pdsu;  
  2.   
  3. import java.util.List;  
  4.   
  5.   
  6. /** 
  7.  * 类说明:页码显示效果类 。1:TextModel “第一页 上一页 下一页 最后一页”;2:NumModel “第一页 2 3 4 最后一页”; 
  8.  *  
  9.  * @author 作者: LiuJunGuang 
  10.  * @version 创建时间:2011-11-9 下午04:09:22 
  11.  */  
  12. public class PageModel<T> {  
  13.     /** 
  14.      * 文本类型:形如:“第一页 上一页 下一页 最后一页” 
  15.      */  
  16.     public static final int TEXT_MODEL = 1;  
  17.   
  18.     /** 
  19.      * 数字类型:形如:NumModel “第一页 2 3 4 最后一页” 
  20.      */  
  21.     public static final int NUM_MODEL = 2;  
  22.     /** 
  23.      * 页码显示模型 
  24.      */  
  25.     private int model = 1;  
  26.     /** 
  27.      * 页码连接URL,不需要添加页码参数 
  28.      */  
  29.     private String url;  
  30.     /** 
  31.      * 页码信息的封装 
  32.      */  
  33.     private Page page = null;  
  34.     /** 
  35.      * 模型类型的页码 
  36.      */  
  37.     private StringBuffer strHtml = null;  
  38.   
  39.     /** 
  40.      * 数字类型的页码模型中间数字显示个数,例如:第一页 1 2 3 4 5 最后一页,numCount = 5; 默认显示 5个数字 
  41.      */  
  42.     private int numCount = 5;  
  43.   
  44.     /** 
  45.      * 页码的模式默认的文字类型的样式 
  46.      *  
  47.      * @param page 
  48.      *            页面信息 
  49.      * @param url 
  50.      *            页面的url地址 
  51.      */  
  52.     public PageModel(Page page, String url) {  
  53.         super();  
  54.         this.url = url;  
  55.         this.page = page;  
  56.     }  
  57.   
  58.     /** 
  59.      * 页码的模型 
  60.      *  
  61.      * @param page 
  62.      *            页面信息 
  63.      * @param url 
  64.      *            页面的url地址 
  65.      * @param model 
  66.      *            页码的显示样式 
  67.      */  
  68.     public PageModel(Page page, String url, int model) {  
  69.         super();  
  70.         this.model = model;  
  71.         this.url = url;  
  72.         this.page = page;  
  73.     }  
  74.   
  75.     /** 
  76.      * 页码的模型 
  77.      *  
  78.      * @param page 
  79.      *            页面信息 
  80.      * @param url 
  81.      *            页面的url地址 
  82.      * @param model 
  83.      *            页码的显示样式 
  84.      * @param numCount 
  85.      *            数字类型的页码,共显示的个数 
  86.      */  
  87.     public PageModel(Page page, String url, int model, int numCount) {  
  88.         super();  
  89.         this.model = model;  
  90.         this.url = url;  
  91.         this.page = page;  
  92.         this.numCount = numCount;  
  93.     }  
  94.   
  95.     /** 
  96.      * 返回页面的模型 
  97.      *  
  98.      * @return 
  99.      */  
  100.     public String getPageModel() {  
  101.         // 组装页码模型  
  102.         createURL();  
  103.         return createModel();  
  104.     }  
  105.   
  106.     /** 
  107.      * 构建URL 
  108.      */  
  109.     private void createURL() {  
  110.         url = url.contains("?") ? url + "&page=" : url + "?page=";  
  111.     }  
  112.   
  113.     /** 
  114.      * 组装页码模型 
  115.      */  
  116.     private String createModel() {  
  117.         strHtml = new StringBuffer();  
  118.         switch (model) {  
  119.         case TEXT_MODEL:// 文本模型  
  120.             buildTextModel();  
  121.             break;  
  122.         case NUM_MODEL:// 数字模型  
  123.             buildNumModel();  
  124.             break;  
  125.         default:// 文本模型  
  126.             buildTextModel();  
  127.             break;  
  128.         }  
  129.         return strHtml.toString();  
  130.     }  
  131.   
  132.     /** 
  133.      * 组件数字类型的页码模型 
  134.      */  
  135.     private void buildNumModel() {  
  136.         int currentPage = page.getCurrentPage();  
  137.         int countPage = page.getCountPage();  
  138.         strHtml.append(  
  139.                 "<table width='100%'  border='0' cellspacing='0' cellpadding='0'>")  
  140.                 .append("<tr><td height='24' align='center'>");  
  141.         // 构造格式:第一页 1 2 3 4 5 最后一页  
  142.         PageIndex pageIndex = PageIndex.getPageIndex(numCount, currentPage,  
  143.                 countPage);  
  144.         // 不是第一页时,显示首页  
  145.         if (currentPage > 1) {  
  146.             strHtml.append("<a href='").append(url)  
  147.                     .append("1'>首页</a>  ");  
  148.         }  
  149.         if (currentPage <= countPage) {  
  150.             for (int i = pageIndex.getStartIndex(); i <= pageIndex  
  151.                     .getEndIndex(); i++) {  
  152.                 // 当前页加粗  
  153.                 if (currentPage == i) {  
  154.                     strHtml.append("<b>").append(i).append("</b>  ");  
  155.                 } else {  
  156.                     strHtml.append("<a href='").append(url).append(i)  
  157.                             .append("'>").append(i).append("</a>  ");  
  158.                 }  
  159.             }  
  160.             // 不是最后一页显示末页  
  161.             if (currentPage < countPage) {  
  162.                 strHtml.append("<a href='").append(url).append(countPage)  
  163.                         .append("'>末页</a>");  
  164.             }  
  165.         }  
  166.         strHtml.append("</td></tr></table>");  
  167.     }  
  168.   
  169.     /** 
  170.      * 组件文本类型的页码 
  171.      */  
  172.     private void buildTextModel() {  
  173.         int currentPage = page.getCurrentPage();  
  174.         int countPage = page.getCountPage();  
  175.         strHtml.append(  
  176.                 "<table width='100%'  border='0' cellspacing='0' cellpadding='0'>")  
  177.                 .append("<tr> <td height='24' align='center'>当前页数:[")  
  178.                 .append(currentPage).append("/").append(countPage)  
  179.                 .append("]  ");  
  180.         if (currentPage > 1) {  
  181.             strHtml.append("<a href='").append(url).append("1'>首页</a>")  
  182.                     .append("  <a href='").append(url)  
  183.                     .append(currentPage - 1).append("'>上一页</a>");  
  184.         }  
  185.         if (currentPage < countPage) {  
  186.             strHtml.append("  <a href='").append(url)  
  187.                     .append(currentPage + 1)  
  188.                     .append("'>下一页</a>  <a href='").append(url)  
  189.                     .append(countPage).append("'>末页</a>");  
  190.         }  
  191.         strHtml.append("</td></tr></table>");  
  192.     }  
  193.   
  194.     public List<T> getList() {  
  195.         return page.getList();  
  196.     }  
  197. }  

显示页面:

[html]  view plain copy
  1. <%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>  
  2. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>  
  3. <%  
  4. String path = request.getContextPath();  
  5. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  6. %>  
  7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  8. <html>  
  9.   <head>  
  10.     <base href="<%=basePath%>">  
  11.     <title>分页技术</title>  
  12.   </head>  
  13.   <body>  
  14.   <table border="1"  width="50%">  
  15.   <tr><th>ID</th><th>姓名</th><th>性别</th><th>简介</th></tr>  
  16.   <c:forEach items="${ pageObject.list}" var="student" >  
  17.         <tr>  
  18.             <td>${student.id }</td>  
  19.             <td>${student.name }</td>  
  20.             <td>${student.sex }</td>  
  21.             <td>${student.resume }</td>  
  22.         </tr>  
  23.   </c:forEach>  
  24.   </table>  
  25.   ${ pageObject.pageModel}  
  26.   </body>  
  27. </html>  

Java分页技术_第1张图片



Java分页技术_第2张图片

Java分页技术_第3张图片

Java分页技术_第4张图片

Java分页技术_第5张图片

源码下载:http://aimilin6688.iteye.com/blog/1249234(最下面附件部分)

另外csdn下载地址:http://download.csdn.net/detail/afgasdg/3776861(免资源分)

你可能感兴趣的:(Java分页技术)