java分页的实现(后台工具类和前台jsp页面)

1、首先,新建一个类Page.java

 1 public class Page implements Serializable {
 2     private static final long serialVersionUID = -3198048449643774660L;
 3     private int pageNow = 1; // 当前页数
 4     private int pageSize = 10; // 每页显示记录的条数
 5     private int totalCount; // 总记录条数
 6     private int totalPageCount; // 总页数
 7     private int startPos; // 开始位置,从0开始
 8     //构造函数,参数:总记录数和当前页
 9     public Page(int totalCount, int pageNow) {
10         this.totalCount = totalCount;
11         this.pageNow = pageNow;
12     }
13     //计算总页数,总页数=总记录数/每页显示记录的条数
14     public int getTotalPageCount() {
15         totalPageCount = getTotalCount() / getPageSize();
16         return (totalCount % pageSize == 0) ? totalPageCount : totalPageCount + 1;
17     }
18     public void setTotalPageCount(int totalPageCount) {
19         this.totalPageCount = totalPageCount;
20     }
21     public int getPageNow() {
22         return pageNow;
23     }
24     public void setPageNow(int pageNow) {
25         this.pageNow = pageNow;
26     }
27     public int getPageSize() {
28         return pageSize;
29     }
30     public void setPageSize(int pageSize) {
31         this.pageSize = pageSize;
32     }
33     public int getTotalCount() {
34         return totalCount;
35     }
36     public void setTotalCount(int totalCount) {
37         this.totalCount = totalCount;
38     }
39     //取得选择记录的初始位置
40     public int getStartPos() {
41         return (pageNow - 1) * pageSize;
42     }
43 }

2、在Dao层加入两个方法,分别获取总的记录数和每页显示的list集合,DBUtil.java是数据库工具类。

 1 // 获取总的记录数
 2 public static int getCount() throws SQLException {
 3     Connection conn = DBUtil.getConn();
 4     PreparedStatement pst = null;
 5     String sql = "select count(*) from users";
 6     pst = conn.prepareStatement(sql);
 7     ResultSet rs = pst.executeQuery();
 8     int count=0;
 9     if(rs.next()){
10         count=rs.getInt(1);
11     }
12     DBUtil.close(conn, pst, rs);
13     return count;
14 }
15 // 分页查找
16 public static ArrayList<Users> findByPage(int pos, int size) throws SQLException {
17     Connection conn = DBUtil.getConn();
18     ArrayList<Users> userList = new ArrayList<Users>();
19     PreparedStatement pst = null;
20     String sql = "select * from users limit ?,?";
21     pst = conn.prepareStatement(sql);
22     pst.setInt(1, pos);
23     pst.setInt(2, size);
24     ResultSet rs = pst.executeQuery();
25     while (rs.next()) {
26         Users user = new Users();
27         user.setUserid(rs.getInt(1));
28         user.setUsername(rs.getString(2));
29     }
30     DBUtil.close(conn, pst, rs);
31     return userList;
32 }

3、在Servlet中调用Dao层的方法,并向页面传递参数,

 1 String pageNow=request.getParameter("pageNow");//获取当前页
 2 int totalCount=UsersDao.getCount();//获取总的记录数
 3 List<Users> userList=new ArrayList<Users>();
 4 Page page=null;
 5 if(pageNow!=null){
 6     page=new Page(totalCount, Integer.parseInt(pageNow));
 7     userList=UsersDao.findByPage(page.getStartPos(), page.getPageSize());//从startPos开始,获取pageSize条数据
 8 }else{
 9     page=new Page(totalCount, 1);//初始化pageNow为1
10     userList=UsersDao.findByPage(page.getStartPos(), page.getPageSize());//从startPos开始,获取pageSize条数据
11 }
12 request.setAttribute("page", page);
13 request.setAttribute("userList", userList);
14 request.getRequestDispatcher("/WEB-INF/views/homePage.jsp").forward(request, response);

4、在jsp页面中添加如下代码:

 1 <body>
 2     <div class="page_nav">
 3         <c:choose>
 4             <c:when test="${page.totalPageCount <= 10}"><!-- 如果总页数小于10,则全部显示 -->
 5                 <c:set var="begin" value="1"></c:set>
 6                 <c:set var="end" value="${page.totalPageCount }"></c:set>
 7             </c:when>
 8             <c:when test="${page.pageNow <= 5 }"><!-- 如果总页数小于5,则显示1-10页 -->
 9                 <c:set var="begin" value="1"></c:set>
10                 <c:set var="end" value="10"></c:set>
11             </c:when>
12             <c:otherwise><!-- 否则,显示前5页和后5页,保证当前页在中间 -->
13                 <c:set var="begin" value="${page.pageNow-5 }"></c:set>
14                 <c:set var="end" value="${page.pageNow+5 }"></c:set>
15                 <c:if test="${end > page.totalPageCount }"><!-- 如果end值小于总的记录数,则显示最后10页 -->
16                     <c:set var="end" value="${page.totalPageCount}"></c:set>
17                     <c:set var="begin" value="${end-10 }"></c:set>
18                 </c:if>
19             </c:otherwise>
20         </c:choose>
21         <c:choose>
22             <c:when test="${page.pageNow != 1 }"><!-- 如果当前页为1,则不显示首页和上一页 -->
23                 <a href="?oper=login&pageNow=1">首页</a>
24                 <a href="?oper=login&pageNow=${page.pageNow-1 }">上一页</a>
25             </c:when>
26         </c:choose>
27         <!-- 遍历页码 -->
28         <c:forEach begin="${begin }" end="${end }" var="index">
29             <c:choose>
30                 <c:when test="${page.pageNow == index }"><!-- 如果为当前页,则特殊显示 -->
31                     <a style="height:24px; margin:0 3px; border:none; background:#C00;">${index}</a>
32                 </c:when>
33                 <c:otherwise><!-- 否则,普通显示 -->
34                     <a href="?oper=login&pageNow=${index }">${index }</a>
35                 </c:otherwise>
36             </c:choose>
37         </c:forEach>
38         <c:choose>
39             <c:when test="${page.pageNow != page.totalPageCount }"><!-- 如果当前页为总的记录数,则不显示末页和下一页 -->
40                 <a href="?oper=login&pageNow=${page.pageNow+1 }">下一页</a>
41                 <a href="?oper=login&pageNow=${page.totalPageCount }">末页</a>
42             </c:when>
43         </c:choose>
44         共${page.totalPageCount }页,${page.totalCount }条记录 到第<input
45             value="${page.pageNow }" name="pn" id="pn_input" />页 <input
46             id="pn_btn" type="button" value="确定">
47         <script type="text/javascript">
48             //为按钮绑定一个单击响应函数
49             $("#pn_btn").click(function() {
50                 //获取到要跳转的页码
51                 var pageNow = $("#pn_input").val();
52                 //通过修改window.location属性跳转到另一个页面
53                 window.location = "?oper=login&pageNow=" + pageNow;
54             });
55         </script>
56     </div>
57 </body>

最后附上数据库工具类代码DBUtil:

 1 public class DBUtil {
 2     private static String DRIVER = null;
 3     private static String URL = null;
 4     private static String USERNAME = null;
 5     private static String PASSWORD = null;
 6     static {
 7         DRIVER = "com.mysql.jdbc.Driver";
 8         URL = "jdbc:mysql://localhost:3306/test";
 9         USERNAME = "root";
10         PASSWORD = "123456";
11     }
12     public static Connection getConn() {
13         Connection conn = null;
14         try {
15             /* 加载驱动 */
16 //            System.out.println(DRIVER);
17             Class.forName(DRIVER);
18             /* 获取连接 */
19             conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
20
21         } catch (ClassNotFoundException e) {
22             e.printStackTrace();
23         } catch (SQLException e) {
24             e.printStackTrace();
25         }
26         return conn;
27     }
28     // 关闭连接
29     public static void close(Connection conn, PreparedStatement ps, ResultSet rs) {
30         try {
31             if (rs != null) {
32                 rs.close();
33             }
34             if (ps != null) {
35                 ps.close();
36             }
37             if (conn != null) {
38                 conn.close();
39             }
40         } catch (SQLException e) {
41             e.printStackTrace();
42         }
43     }
44 }
时间: 2024-08-24 08:51:26

java分页的实现(后台工具类和前台jsp页面)的相关文章

java中IO写文件工具类

下面是一些根据常用java类进行组装的对文件进行操作的类,平时,我更喜欢使用Jodd.io中提供的一些对文件的操作类,里面的方法写的简单易懂. 其中jodd中提供的JavaUtil类中提供的方法足够我们使用,里面的方法写的非常简练,例如append,read等方法,封装更好,更符合面向对象, 这里面我写的一些方法可多都是模仿jodd,从里面进行抽取出来的. /** * 获取路径文件夹下的所有文件 * @param path * @return */ public static File[] ge

Java随机取字符串的工具类

原文:Java随机取字符串的工具类 源代码下载地址:http://www.zuidaima.com/share/1550463479532544.htm Java 随机取字符串的工具类 可以全部是数字,字符,也可以字符和数字组合的工具类,希望能给大家带来帮助 package com.zuidaima.test; import java.util.Random; public class RandomUtils { public static final String ALLCHAR = "012

java实现发邮件的工具类,方便 好用(需要架包的Send Email To me)

原文:java实现发邮件的工具类,方便 好用(需要架包的Send Email To me) 源代码下载地址:http://www.zuidaima.com/share/1550463394794496.htm package com.zuidaima.util; import java.util.Properties; import javax.mail.BodyPart; import javax.mail.Message; import javax.mail.Multipart; impor

java HTML字符串正则表达式使用工具类

原文:java HTML字符串正则表达式使用工具类 代码下载地址:http://www.zuidaima.com/share/1550463453416448.htm HTML相关的正则表达式工具类 包括过滤HTML标记,转换HTML标记,替换特定HTML标记 package com.zuidaima.common.util; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * <p> * Title: H

Java 基于log4j的日志工具类

Java 基于log4j的日志工具类 对log4j日志类进行了简单封装,使用该封装类的优势在于以下两点: 1.不必在每个类中去创建对象,直接类名 + 方法即可 2.可以很方便的打印出堆栈信息 package com.tradeplatform.receiveorder.util; import java.io.PrintWriter; import java.io.StringWriter; import org.apache.log4j.Logger; /** * @Description 日

JAVA 并发编程-线程同步工具类(十二)

本文主要介绍一些java线程同步工具类,并不进行具体讲解,当有需要时,可以再去结合实例学习. 信号灯(Semaphore) 应用场景举例: 例如公司的打卡系统,如果有一个打卡机,那么一次就只能有一个人打卡,其余的人就被阻塞住,打卡完以后就可由下一个人打卡.如果有3个打卡机,那么一次就允许3个人或者少于三个人打卡,其余的人就得等待打卡机空闲下来才能继续打卡. 结果: 已进入1个线程,还可进入2个 已进入2个线程,还可进入1个 已进入3个线程,还可进入0个 空余出1个 已进入4个线程,还可进入0个

Java:集合框架的工具类

集合框架的工具类 Arrays:里面都是静态方法,直接用来对各种集合进行操作的公有方法. Collections:里面都是静态方法,直接用来对各种集合进行操作的公有方法. 包括: 1.asList将数组变成list集合: static <T> List<T> asList(T... a) 返回一个受指定数组支持的固定大小的列表. //例子1: import java.util.*; class ArraysTest { public static void sop(Object o

Java文件编码自动转换工具类

本篇随笔主要介绍了一个用java语言写的将一个文件编码转换为另一个编码并不改变文件内容的工具类: 通过读取源文件内容,用URLEncoding重新编码解码的方式实现. 1 public class ChangeFileEncoding { 2 public static int fileCount = 0; 3 public static String sourceFileRoot = "替换为要转换的源文件或源目录"; // 将要转换文件所在的根目录 4 public static

Java集合框架:Collections工具类

java.util.Collections工具类提供很多有用的方法,使得程序猿操作集合类的时候更加的方便容易,这些方法都是静态的.整个Collections工具类源码差不多有4000行,我们针对一些典型的方法进行阐述. 1. 调用一个空List,Set,Map public static final List EMPTY_LIST = new EmptyList<>(); public static final Map EMPTY_MAP = new EmptyMap<>(); p