Java 实现分页功能
2017-02-15 19:56 甘雨路 阅读(48571) 评论(4) 编辑 收藏 举报driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/test?allowMultiQueries=true&useUnicode=true&characterEncoding=utf8 user=LF password=LF
package cn.zr.testpage.entity; public class User { private String name; private int age; private String hobby; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getHobby() { return hobby; } public void setHobby(String hobby) { this.hobby = hobby; } public User() { } public User(String name, int age, String hobby) { this.name = name; this.age = age; this.hobby = hobby; } @Override public String toString() { return "User [name=" + name + ", age=" + age + ", hobby=" + hobby + "]"; } }
package cn.zr.testpage.service; import java.util.List; import cn.zr.testpage.entity.User; import cn.zr.testpage.utils.Page; public interface UserService { /** * 获取总数量 * @return 返回总数 */ int getAmount(); /** * 获取当前页的数据 * @param page * @return 返回前页的数据 */ List<User> getUserInfo(Page page); }
package cn.zr.testpage.service.impl; import java.util.List; import cn.zr.testpage.dao.UserDao; import cn.zr.testpage.dao.impl.UserDaoImpl; import cn.zr.testpage.entity.User; import cn.zr.testpage.service.UserService; import cn.zr.testpage.utils.Page; public class UserServiceImpl implements UserService { private UserDao userDao; // 通过代码块加载实现类 { userDao = new UserDaoImpl(); } @Override public int getAmount() { return userDao.getAmount(); } @Override public List<User> getUserInfo(Page page) { return userDao.getUserInfo(page); } }
package cn.zr.testpage.dao; import java.util.List; import cn.zr.testpage.entity.User; import cn.zr.testpage.utils.Page; public interface UserDao { /** * 获取总数量 * @return 返回总数 */ int getAmount(); /** * 获取当前页的数据 * @param page * @return 返回前页的数据 */ List<User> getUserInfo(Page page); }
package cn.zr.testpage.dao.impl; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import cn.zr.testpage.dao.UserDao; import cn.zr.testpage.entity.User; import cn.zr.testpage.utils.JdbcUtils; import cn.zr.testpage.utils.Page; import cn.zr.testpage.utils.UserBasicalImpl; public class UserDaoImpl extends UserBasicalImpl implements UserDao{ /** * 获取总数 */ @Override public int getAmount() { connection = JdbcUtils.getConnection(); String sql = "SELECT COUNT(*) FROM USERINFO"; int count = 0; try { pStatement = connection.prepareStatement(sql); rSet = pStatement.executeQuery(); if(rSet.next()){ count = rSet.getInt(1); } } catch (SQLException e) { e.printStackTrace(); }finally{ // 调用父类方法关闭资源 super.close(); } return count; } /** * 获取当前页的数据 * @param page * @return 返回前页的数据 */ @Override public List<User> getUserInfo(Page page) { connection = JdbcUtils.getConnection(); //基于MySQL的函数的分页 String sql = "SELECT 姓名,年龄,爱好 FROM USERINFO LIMIT ?,?"; // 创建集合 List<User> list = new ArrayList<User>(); try { pStatement = connection.prepareStatement(sql); //设置相关参数 pStatement.setInt(1, page.getStart()); pStatement.setInt(2, page.getSize()); rSet = pStatement.executeQuery(); while(rSet.next()){ User user = new User(); user.setName(rSet.getString("姓名")); user.setAge(rSet.getInt("年龄")); user.setHobby(rSet.getString("爱好")); list.add(user); } } catch (SQLException e) { e.printStackTrace(); }finally{ // 调用父类方法关闭资源 super.close(); } return list; } }
package cn.zr.testpage.servlet; import java.io.IOException; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import cn.zr.testpage.entity.User; import cn.zr.testpage.service.UserService; import cn.zr.testpage.service.impl.UserServiceImpl; import cn.zr.testpage.utils.BaseServlet; import cn.zr.testpage.utils.Page; public class ListServlet extends BaseServlet{ private static final long serialVersionUID = 1L; @Override public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("...doGet..."); // 获取当前页 String curpage = req.getParameter("curpage"); UserService userService = new UserServiceImpl(); // 获取总数量 int count = userService.getAmount(); //字符串转成整型 int currentpage = super.currentPage(curpage); // 创建page对象 Page page = new Page(count, currentpage, pagesize); // 获取当前页的数据 List<User> users = userService.getUserInfo(page); //将相关数据存储起来 req.setAttribute("page", page); req.setAttribute("users", users); System.out.println(count); System.out.println(users); //转发 req.getRequestDispatcher("/WEB-INF/jsp/list.jsp").forward(req, resp); } }
package cn.zr.testpage.utils; import javax.servlet.http.HttpServlet; public class BaseServlet extends HttpServlet { public int pagesize = 2; public int currentPage(String cpage){ int currentpage = cpage!=null && !"".equals(cpage) && isint(cpage)? currentpage=Integer.parseInt(cpage):1; return currentpage; } public boolean isint(String str){ boolean bo = true; try { Integer.parseInt(str); } catch (Exception e) { bo = false; } return bo; } }
package cn.zr.testpage.utils; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; /** * * @author lf * */ public class JdbcUtils { // 获取数据库连接 public static Connection getConnection() { String url="jdbc:mysql://localhost:3306/test?allowMultiQueries=true&useUnicode=true&characterEncoding=utf8"; String user="LF"; String password ="LF"; Connection connection = null; try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } try { connection = DriverManager.getConnection(url, user, password); } catch (SQLException e) { e.printStackTrace(); } return connection; } }
package cn.zr.testpage.utils; public class Page { // 页数(第几页) private int currentpage; // 查询数据库里面对应的数据有多少条 private int total;// 从数据库查处的总记录数 // 每页查询的数量条 private int size; // 下页 private int next; // 最后一页 private int last; private int lpage; private int rpage; //从哪条开始查 private int start; public Page() { super(); } public int getCurrentpage() { return currentpage; } /**** * * @param currentpage * @param total * @param pagesize */ public void setCurrentpage(int currentpage,int total,int pagesize) { //如果整除表示正好分N页,如果不能整除在N页的基础上+1页 int totalPages = total%pagesize==0? total/pagesize : (total/pagesize)+1; //总页数 this.last = totalPages; //判断当前页是否越界,如果越界,我们就查最后一页 if(currentpage>totalPages){ this.currentpage = totalPages; }else{ this.currentpage=currentpage; } if(currentpage<=0){ this.currentpage=1; } //计算start 1----0 2 ------ 5 this.start = (this.currentpage-1)*pagesize; } public int getTotal() { return total; } public void setTotal(int total) { this.total = total; } public int getSize() { return size; } public void setSize(int size) { this.size = size; } public int getNext() { return currentpage<last? currentpage+1: last; } //上一页 public int getUpper() { return currentpage>1? currentpage-1: currentpage; } public int getLast() { return last; } //总共有多少页,即末页 public void setLast(int last) { this.last = total%size==0? total/size : (total/size)+1; } public int getLpage() { return lpage; } public void setLpage(int lpage) { this.lpage = lpage; } public int getRpage() { return rpage; } public void setRpage(int rpage) { this.rpage = rpage; } /**** * * @param total 总记录数 * @param currentpage 当前页 * @param pagesize 每页显示多少条 */ public Page(int total,int currentpage,int pagesize) { //总记录数 this.total = total; //每页显示多少条 this.size=pagesize; //计算当前页和数据库查询起始值以及总页数 setCurrentpage(currentpage, total, pagesize); //分页计算 int leftcount =5, //需要向上一页执行多少次 rightcount =4; //起点页 this.lpage =currentpage; //结束页 this.rpage =currentpage; //2点判断 this.lpage = currentpage-leftcount; //正常情况下的起点 this.rpage = currentpage+rightcount; //正常情况下的终点 //页差=总页数和结束页的差 int topdiv = this.last-rpage; //判断是否大于最大页数 /*** * 起点页 * 1、页差<0 起点页=起点页+页差值 * 2、页差>=0 起点和终点判断 */ this.lpage=topdiv<0? this.lpage+topdiv:this.lpage; /*** * 结束页 * 1、起点页<=0 结束页=|起点页|+1 * 2、起点页>0 结束页 */ this.rpage=this.lpage<=0? this.rpage+(this.lpage*-1)+1: this.rpage; /*** * 当起点页<=0 让起点页为第一页 * 否则不管 */ this.lpage=this.lpage<=0? 1:this.lpage; /*** * 如果结束页>总页数 结束页=总页数 * 否则不管 */ this.rpage=this.rpage>last? this.last:this.rpage; } public int getStart() { return start; } }
package cn.zr.testpage.utils; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class UserBasicalImpl { protected Connection connection; protected PreparedStatement pStatement; protected ResultSet rSet; public void close(){ // 关闭资源 try { if (rSet!=null) { rSet.close(); } if (pStatement!=null) { pStatement.close(); } if (connection!=null) { connection.close(); } } catch (SQLException e) { e.printStackTrace(); } } }
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>用户信息</title> </head> <body> <table> <tr> <th>姓名</th> <th>年龄</th> <th>爱好</th> </tr> <c:forEach items="${users }" var="user" varStatus="userindex"> <tr> <td>${user.name }</td> <td>${user.age }</td> <td>${user.hobby }</td> </tr> </c:forEach> </table> <div> <a href="?curpage=1">首页</a> <c:forEach begin="${page.lpage}" end="${page.rpage}" var="pageNum"> <a href="?curpage=${pageNum }">${pageNum }</a> </c:forEach> <a href="?curpage=${page.last }">尾页</a> </div> </body> </html>