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

 public class Page implements Serializable {
private static final long serialVersionUID = -3198048449643774660L;
private int pageNow = 1; // 当前页数
private int pageSize = 10; // 每页显示记录的条数
private int totalCount; // 总记录条数
private int totalPageCount; // 总页数
private int startPos; // 开始位置,从0开始
//构造函数,参数:总记录数和当前页
public Page(int totalCount, int pageNow) {
this.totalCount = totalCount;
this.pageNow = pageNow;
}
//计算总页数,总页数=总记录数/每页显示记录的条数
public int getTotalPageCount() {
totalPageCount = getTotalCount() / getPageSize();
return (totalCount % pageSize == 0) ? totalPageCount : totalPageCount + 1;
}
public void setTotalPageCount(int totalPageCount) {
this.totalPageCount = totalPageCount;
}
public int getPageNow() {
return pageNow;
}
public void setPageNow(int pageNow) {
this.pageNow = pageNow;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getTotalCount() {
return totalCount;
}
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}
//取得选择记录的初始位置
public int getStartPos() {
return (pageNow - 1) * pageSize;
}
}

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

 // 获取总的记录数
public static int getCount() throws SQLException {
Connection conn = DBUtil.getConn();
PreparedStatement pst = null;
String sql = "select count(*) from users";
pst = conn.prepareStatement(sql);
ResultSet rs = pst.executeQuery();
int count=0;
if(rs.next()){
count=rs.getInt(1);
}
DBUtil.close(conn, pst, rs);
return count;
}
// 分页查找
public static ArrayList<Users> findByPage(int pos, int size) throws SQLException {
Connection conn = DBUtil.getConn();
ArrayList<Users> userList = new ArrayList<Users>();
PreparedStatement pst = null;
String sql = "select * from users limit ?,?";
pst = conn.prepareStatement(sql);
pst.setInt(1, pos);
pst.setInt(2, size);
ResultSet rs = pst.executeQuery();
while (rs.next()) {
Users user = new Users();
user.setUserid(rs.getInt(1));
user.setUsername(rs.getString(2));
}
DBUtil.close(conn, pst, rs);
return userList;
}

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

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

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

 <body>
<div class="page_nav">
<c:choose>
<c:when test="${page.totalPageCount <= 10}"><!-- 如果总页数小于10,则全部显示 -->
<c:set var="begin" value="1"></c:set>
<c:set var="end" value="${page.totalPageCount }"></c:set>
</c:when>
<c:when test="${page.pageNow <= 5 }"><!-- 如果总页数小于5,则显示1-10页 -->
<c:set var="begin" value="1"></c:set>
<c:set var="end" value="10"></c:set>
</c:when>
<c:otherwise><!-- 否则,显示前5页和后5页,保证当前页在中间 -->
<c:set var="begin" value="${page.pageNow-5 }"></c:set>
<c:set var="end" value="${page.pageNow+5 }"></c:set>
<c:if test="${end > page.totalPageCount }"><!-- 如果end值小于总的记录数,则显示最后10页 -->
<c:set var="end" value="${page.totalPageCount}"></c:set>
<c:set var="begin" value="${end-10 }"></c:set>
</c:if>
</c:otherwise>
</c:choose>
<c:choose>
<c:when test="${page.pageNow != 1 }"><!-- 如果当前页为1,则不显示首页和上一页 -->
<a href="?oper=login&pageNow=1">首页</a>
<a href="?oper=login&pageNow=${page.pageNow-1 }">上一页</a>
</c:when>
</c:choose>
<!-- 遍历页码 -->
<c:forEach begin="${begin }" end="${end }" var="index">
<c:choose>
<c:when test="${page.pageNow == index }"><!-- 如果为当前页,则特殊显示 -->
<a style="height:24px; margin:0 3px; border:none; background:#C00;">${index}</a>
</c:when>
<c:otherwise><!-- 否则,普通显示 -->
<a href="?oper=login&pageNow=${index }">${index }</a>
</c:otherwise>
</c:choose>
</c:forEach>
<c:choose>
<c:when test="${page.pageNow != page.totalPageCount }"><!-- 如果当前页为总的记录数,则不显示末页和下一页 -->
<a href="?oper=login&pageNow=${page.pageNow+1 }">下一页</a>
<a href="?oper=login&pageNow=${page.totalPageCount }">末页</a>
</c:when>
</c:choose>
共${page.totalPageCount }页,${page.totalCount }条记录 到第<input
value="${page.pageNow }" name="pn" id="pn_input" />页 <input
id="pn_btn" type="button" value="确定">
<script type="text/javascript">
//为按钮绑定一个单击响应函数
$("#pn_btn").click(function() {
//获取到要跳转的页码
var pageNow = $("#pn_input").val();
//通过修改window.location属性跳转到另一个页面
window.location = "?oper=login&pageNow=" + pageNow;
});
</script>
</div>
</body>

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

 package com.bwlu.common;

 import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException; public class DBUtil { private static String DRIVER = null; private static String URL = null; private static String USERNAME = null; private static String PASSWORD = null; static {
DRIVER = "com.mysql.jdbc.Driver";
URL = "jdbc:mysql://localhost:3306/mytest";
USERNAME = "root";
PASSWORD = "mysql";
} public static Connection getConn() {
Connection conn = null;
try {
/* 加载驱动 */
// System.out.println(DRIVER);
Class.forName(DRIVER);
/* 获取连接 */
conn = DriverManager.getConnection(URL, USERNAME, PASSWORD); } catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
} // 关闭连接
public static void close(Connection conn, PreparedStatement ps, ResultSet rs) {
try {
if (rs != null) {
rs.close();
}
if (ps != null) {
ps.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}

DBUtil

SSM框架中【MyBatis分页语句】

UsersMapper.java

 public interface UsersMapper {
// 获取分页记录,startPos:从第几行开始获取,pageSize:获取的条数
List<Users> selectByPage(@Param(value = "startPos") Integer startPos,
@Param(value = "pageSize") Integer pageSize);
// 获取数据库总的记录数,返回users表中总的记录条数
int getCount();
}

UsersMapper.xml

 <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.bwlu.mapper.UsersMapper" >
<resultMap id="BaseResultMap" type="com.bwlu.bean.Users" >
<id column="userId" property="userid" jdbcType="INTEGER" />
<result column="userName" property="username" jdbcType="VARCHAR" />
<result column="password" property="password" jdbcType="VARCHAR" />
<result column="userEmail" property="useremail" jdbcType="VARCHAR" />
<result column="permission" property="permission" jdbcType="INTEGER" />
</resultMap> <!-- 分页SQL语句 -->
<select id="selectByPage" resultMap="BaseResultMap">
select * from Users limit #{startPos},#{pageSize}
</select>
<!-- 取得记录的总数 -->
<select id="getCount" resultType="java.lang.Integer">
SELECT COUNT(*) FROM Users
</select>
</mapper>

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

  1. Java操作文件夹的工具类

    Java操作文件夹的工具类 import java.io.File; public class DeleteDirectory { /** * 删除单个文件 * @param fileName 要删除 ...

  2. Java汉字转成汉语拼音工具类

    Java汉字转成汉语拼音工具类,需要用到pinyin4j.jar包. import net.sourceforge.pinyin4j.PinyinHelper; import net.sourcefo ...

  3. java中excel导入\导出工具类

    1.导入工具 package com.linrain.jcs.test; import jxl.Cell; import jxl.Sheet; import jxl.Workbook; import ...

  4. java中定义一个CloneUtil 工具类

    其实所有的java对象都可以具备克隆能力,只是因为在基础类Object中被设定成了一个保留方法(protected),要想真正拥有克隆的能力, 就需要实现Cloneable接口,重写clone方法.通 ...

  5. java代码行数统计工具类

    package com.syl.demo.test; import java.io.*; /** * java代码行数统计工具类 * Created by 孙义朗 on 2017/11/17 0017 ...

  6. Java加载Properties配置文件工具类

    Java加载Properties配置文件工具类 import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; ...

  7. Java 操作Redis封装RedisTemplate工具类

    package com.example.redisdistlock.util; import org.springframework.beans.factory.annotation.Autowire ...

  8. 【转】Java压缩和解压文件工具类ZipUtil

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...

  9. DateHandler日期处理工具(JSP中使用后台工具类)

    1.DateHandler.java package Utils.dateHandler; import java.text.ParseException; import java.text.Simp ...

随机推荐

  1. leetcode 326 Power of Three (python)

    原题: Given an integer, write a function to determine if it is a power of three. Follow up: Could you ...

  2. Software Defined Networking For Dummies, Cisco Special Edition

    从接触SDN开始,不论是硬件还是软件,一直都是从具体的点开始,慢慢的勾勒出自己认为的SDN的样子,相信读完这本思科出的关于SDN的书会对其有新的认识 这本书的名字就是Software Defined ...

  3. [USACO5.5]隐藏口令Hidden Password

    题目链接:传送门 题目大意:给你一个长度 N 的字符串,5<=N<=5,000,000,将首尾合并成环,断环成链并满足字典序最小,输出此时首字母在原串中的位置-1: 题目思路:最小表示法 ...

  4. AngularJs 解决浏览器在初始化代码未加载完毕时 而出现闪烁的问题

    1. ng-cloak; 因浏览器会先加载dom元素 而针对于{{pression}} 由于angularjs 还没加载完,会在页面出现闪烁 2.ng-bind; 用ng-bind代替{{expres ...

  5. 爬虫实战【13】获取自己的动态代理ip池

    在爬取一些比较友好的网站时,仍然有可能因为单位时间内访问次数过多,使服务器认定为机器访问,导致访问失败或者被封.如果我们使用不同的ip来访问网站的话,就可以绕过服务器的重复验证,使服务器以为使不同的人 ...

  6. spring + quartz 定时

    springConfig配置文件: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=& ...

  7. 第二课补充01——redis-cli命令行详解、string类型、list类型、hash类型命令操作详解

    一. redis-cli命令行参数 1.-x参数:从标准输入读取一个参数: [问题] [解决] 因为echo命令是默认带有回车\n的,不带回车需要echo –n命令: echo -n "ha ...

  8. pre 布局

    w

  9. linux运维 vi vim q 的间接注释

    w q  --不发生写的写,无增删效果. 点q后,再次执行 vi /var/www/share/w.php 仍然会‘ Found a swap file by the name "/var/ ...

  10. The Log: What every software engineer should know about real-time data's unifying abstraction

    http://engineering.linkedin.com/distributed-systems/log-what-every-software-engineer-should-know-abo ...