java分页技术实现详解
1.编写通用的分页工具
- public class PageUtil {
- /*参数需要页面传入*/
- private Integer pageSize=10;//每页显式多少条记录
- private Integer currentPage=1;//当前页号
- /*参数需要从数据查询*/
- private Integer allRowsAmount=0;//总记录数
- private List<?> items;//记录集合
- /*这些参数由计算得出*/
- private Integer allPageAmount;//总页数
- private Integer currentPageStartRow=1;//当前页面的开始行
- private Integer currentPageEndRow;//当前页面的结束行
- private Integer firstPage=1;//首页的页号
- private Integer lastPage;//末页的页号
- private Integer prevPage;//上一页页号
- private Integer nextPage;//下一页页号
- private Integer startPageNum;//导航开始页号
- private Integer endPageNum;//导航结束页号
- private Integer maxPageAmount =10;//最多显示多少页
- public List<Integer> showPageNums =new ArrayList<Integer>();//要显示的页号
- public PageUtil() {
- super();
- // TODO Auto-generated constructor stub
- }
- /*设置当前页*/
- public void setCurrentPage(int currentPage){
- if(currentPage <1){
- this.currentPage=1;
- }else{
- this.currentPage=currentPage;
- }
- }
- /*设置每页记录数,默认10条*/
- public void setPageSize(int pageSize) {
- this.pageSize = pageSize;
- }
- /*设置总记录数*/
- public void setAllRowsAmount(int allRowsAmount) {
- this.allRowsAmount = allRowsAmount;
- }
- /*设置分页内容*/
- public void setItems(List<?> items) {
- this.items = items;
- }
- /*设置导航页数量*/
- public void setMaxPageAmount(int maxPageAmount) {
- this.maxPageAmount = maxPageAmount;
- }
- public void calculatePage(){
- //计算总页数
- if(this.allRowsAmount % this.pageSize ==0){
- this.allPageAmount=this.allRowsAmount/this.pageSize;
- }else{
- this.allPageAmount=this.allRowsAmount/this.pageSize+1;
- }
- //设置首页
- this.firstPage=1;
- //设置末页
- this.lastPage=this.allPageAmount;
- if(this.currentPage *pageSize <allRowsAmount){
- this.currentPageEndRow =this.currentPage*pageSize;
- this.currentPageStartRow =(this.currentPage-1)*pageSize+1;
- }else{
- this.currentPageEndRow =this.allRowsAmount;
- this.currentPageStartRow =(this.allPageAmount-1)*pageSize+1;
- if(this.currentPageStartRow <0){
- this.currentPageStartRow=0;
- }
- }
- //设置前一页
- if(this.currentPage >1){
- this.prevPage=this.currentPage-1;
- }else{
- this.prevPage=this.currentPage;
- }
- //设置下一页
- if(this.currentPage <this.lastPage){
- this.nextPage=this.currentPage+1;
- }else{
- this.nextPage=this.lastPage;
- }
- //计算数字导航页
- startPageNum =Math.max(this.currentPage-maxPageAmount/2, firstPage);
- endPageNum =Math.min(startPageNum+maxPageAmount, lastPage);
- if(endPageNum-startPageNum <maxPageAmount){
- startPageNum =Math.max(endPageNum -maxPageAmount , 1);
- }
- for(int i=startPageNum ;i<=endPageNum;i++){
- showPageNums.add(i);
- }
- }
- //以下get方法是对外提供的方法用来获取参数值
- public Integer getPageSize() {
- return pageSize;
- }
- public Integer getCurrentPage() {
- return currentPage;
- }
- public Integer getAllRowsAmount() {
- return allRowsAmount;
- }
- public List<?> getItems() {
- return items;
- }
- public Integer getAllPageAmount() {
- return allPageAmount;
- }
- public Integer getCurrentPageStartRow() {
- return currentPageStartRow;
- }
- public Integer getCurrentPageEndRow() {
- return currentPageEndRow;
- }
- public Integer getFirstPage() {
- return firstPage;
- }
- public Integer getLastPage() {
- return lastPage;
- }
- public Integer getPrevPage() {
- return prevPage;
- }
- public Integer getNextPage() {
- return nextPage;
- }
- public Integer getStartPageNum() {
- return startPageNum;
- }
- public Integer getEndPageNum() {
- return endPageNum;
- }
- public Integer getMaxPageAmount() {
- return maxPageAmount;
- }
- public List<Integer> getShowPageNums() {
- return showPageNums;
- }
- @Override
- public String toString() {
- return "PageUtil [pageSize=" + pageSize + ", currentPage="
- + currentPage + ", allRowsAmount=" + allRowsAmount + ", 每页内容items="
- + items + ", allPageAmount=" + allPageAmount
- + ", currentPageStartRow=" + currentPageStartRow
- + ", currentPageEndRow=" + currentPageEndRow + ", firstPage="
- + firstPage + ", lastPage=" + lastPage + ", prevPage="
- + prevPage + ", nextPage=" + nextPage + ", startPageNum="
- + startPageNum + ", endPageNum=" + endPageNum + ", maxPageAmount="
- + maxPageAmount + ", 页号list=" + showPageNums + "]";
- }
- public static void main(String[] args) {
- List<String> items =new ArrayList<String>();
- for(int i=0;i<10;i++){
- items.add("str"+i);
- }
- PageUtil pageUtil =new PageUtil();
- pageUtil.setCurrentPage(1);
- //pageUtil.setItems(items);
- pageUtil.setAllRowsAmount(33);
- pageUtil.calculatePage();
- System.out.println(pageUtil);
- }
- }
2.servlet+c3p0+mysql实现分页
工程目录:
环境搭建:
- <dependencies>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>3.8.1</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>com.mchange</groupId>
- <artifactId>c3p0</artifactId>
- <version>0.9.2.1</version>
- </dependency>
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- <version>5.1.22</version>
- </dependency>
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>jstl</artifactId>
- <version>1.2</version>
- </dependency>
- </dependencies>
c3p0配置文件:
- <c3p0-config>
- <!-- 默认配置 -->
- <default-config>
- <property name="jdbcUrl">jdbc:mysql://localhost:3306/basicjdbc?characterEncoding=utf-8</property>
- <property name="driverClass">com.mysql.jdbc.Driver</property>
- <property name="user">root</property>
- <property name="password"></property>
- <property name="initialPoolSize">3</property>
- <property name="maxPoolSize">6</property>
- <property name="maxIdleTime">1000</property>
- </default-config>
- <!-- 以下的配置用于个人需要再配置 -->
- <name-config name="my_config">
- <property name="jdbcUrl">jdbc:mysql://localhost:3306/basicjdbc?characterEncoding=utf-8</property>
- <property name="driverClass">com.mysql.jdbc.Driver</property>
- <property name="user">root</property>
- <property name="password"></property>
- <property name="initialPoolSize">3</property>
- <property name="maxPoolSize">6</property>
- <property name="maxIdleTime">1000</property>
- </name-config>
- </c3p0-config>
使用c3p0连接池的工具类:
dao层:主要是获取记录的总数便于计算其他值,还有就是获取每页显示的数据。
- public class UserDaoImpl implements IUserDao{
- //从数据库查询记录的总条数
- public Integer getAllRowsAmount() throws Exception{
- String sql="select count(*) from myuser";
- Connection conn =DbUtil.getConnection();
- PreparedStatement pstmt =conn.prepareStatement(sql);
- ResultSet rs =pstmt.executeQuery();
- Integer allRowsAmount=0;
- if(rs.next()){
- allRowsAmount =rs.getInt("count(*)");
- }
- DbUtil.close(conn, pstmt, rs);
- return allRowsAmount;
- }
- //通过当前页号查询条件记录
- public List<User> getUserByCurrentPage(Integer currentPageStartRow, Integer pageSize) throws Exception{
- String sql="select id,username,gender from myuser limit "+(currentPageStartRow-1)+","+pageSize;
- Connection conn =DbUtil.getConnection();
- PreparedStatement pstmt =conn.prepareStatement(sql);
- ResultSet rs =pstmt.executeQuery();
- List<User> list =new ArrayList<User>();
- while(rs.next()){
- User user =new User();
- user.setId(rs.getInt("id"));
- user.setUsername(rs.getString("username"));
- user.setGender(rs.getString("gender"));
- list.add(user);
- }
- DbUtil.close(conn, pstmt, rs);
- return list;
- }
- public static void main(String[] args) throws Exception {
- UserDaoImpl userDaoImpl =new UserDaoImpl();
- PageUtil pageUtil =new PageUtil();
- pageUtil.setAllRowsAmount(userDaoImpl.getAllRowsAmount());
- pageUtil.calculatePage();
- for(User user :userDaoImpl.getUserByCurrentPage(pageUtil.getStartPageNum(), pageUtil.getPageSize())){
- System.out.println(user.getId()+","+user.getUsername()+","+user.getGender());
- }
- System.out.println(userDaoImpl.getAllRowsAmount());
- }
- }
dao接口:
- public interface IUserDao {
- public Integer getAllRowsAmount() throws Exception;
- public List<User> getUserByCurrentPage(Integer currentPageStartRow, Integer pageSize) throws Exception;
- }
model类:
User.java:
- public class User {
- private int id;
- private String username;
- private String gender;
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getUsername() {
- return username;
- }
- public void setUsername(String username) {
- this.username = username;
- }
- public String getGender() {
- return gender;
- }
- public void setGender(String gender) {
- this.gender = gender;
- }
- }
页面显示的模型Page.java:
- public class Page {
- private Integer currentPage;
- private Integer prevPage;
- private Integer nextPage;
- private List<User> showUsers =new ArrayList<User>();
- private List<Integer> showPageNums =new ArrayList<Integer>();
- public Integer getCurrentPage() {
- return currentPage;
- }
- public void setCurrentPage(Integer currentPage) {
- this.currentPage = currentPage;
- }
- public Integer getPrevPage() {
- return prevPage;
- }
- public void setPrevPage(Integer prevPage) {
- this.prevPage = prevPage;
- }
- public Integer getNextPage() {
- return nextPage;
- }
- public void setNextPage(Integer nextPage) {
- this.nextPage = nextPage;
- }
- public List<User> getShowUsers() {
- return showUsers;
- }
- public void setShowUsers(List<User> showUsers) {
- this.showUsers = showUsers;
- }
- public List<Integer> getShowPageNums() {
- return showPageNums;
- }
- public void setShowPageNums(List<Integer> showPageNums) {
- this.showPageNums = showPageNums;
- }
- }
service层:通过页面传入当前页号数据,来查询需要的值。
UserService.java:
- public class UserServiceImpl implements IUserService{
- private IUserDao userDao =new UserDaoImpl();
- public Page pageUsers(String currentPage) throws Exception{
- int allRowsAmount =userDao.getAllRowsAmount();
- PageUtil pageUtil =new PageUtil();
- pageUtil.setAllRowsAmount(allRowsAmount);
- if(currentPage !=null){
- pageUtil.setCurrentPage(Integer.parseInt(currentPage));
- }
- pageUtil.calculatePage();
- List<User> list =userDao.getUserByCurrentPage(pageUtil.getCurrentPageStartRow(), pageUtil.getPageSize());
- Page page =new Page();
- page.setPrevPage(pageUtil.getPrevPage());
- page.setNextPage(pageUtil.getNextPage());
- page.setShowUsers(list);
- page.setShowPageNums(pageUtil.getShowPageNums());
- page.setCurrentPage(pageUtil.getCurrentPage());
- return page;
- }
- }
Service接口:
- public interface IUserService {
- public Page pageUsers(String currentPage) throws Exception;
- }
Controller层:
- public class UserController extends HttpServlet{
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private IUserService userService =new UserServiceImpl();
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- String currentPage =req.getParameter("currentPage");
- Page page =null;
- try {
- page =userService.pageUsers(currentPage);
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- req.setAttribute("page", page);
- req.getRequestDispatcher("/page.jsp").forward(req, resp);
- }
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- super.doPost(req, resp);
- }
- }
Page.jsp文件:
- <%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
- <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <script type="text/javascript" src="js/jquery-2.1.3.js"></script>
- <script type="text/javascript" src="js/jquery-2.1.3.min.js"></script>
- <title>分页</title>
- <style type="text/css">
- a{
- font-size:14px;
- text-decoration:none;
- }
- td{
- text-align:center;
- }
- #prevPage{
- padding:6px;
- color:blue;
- width:24px;
- height:24px;
- border:1px solid #ccc;
- }
- #pageNum{
- padding-top:6px;
- padding-left:12px;
- color:blue;
- border:1px solid #ccc;
- padding-right:12px;
- padding-bottom:6px;
- }
- #nextPage{
- padding:6px;
- color:blue;
- width:24px;
- height:24px;
- border:1px solid #ccc;
- }
- </style>
- </head>
- <body>
- <div class="container" id="pagenation" align="center">
- <table border="1" width="80%" cellpadding="5" cellspacing="0">
- <tr>
- <th>序号</th>
- <th>用户名</th>
- <th>性别</th>
- </tr>
- <c:forEach items="${page.showUsers}" var="user">
- <tr>
- <td>${user.id}</td>
- <td>${user.username}</td>
- <td>${user.gender}</td>
- </tr>
- </c:forEach>
- </table>
- </div>
- <div>
- <c:when test="${page.currentPage==1}">
- <上一页
- </c:when>
- <c:otherwise>
- <a href="http://localhost:8080/paging/user.htm?currentPage=${page.prevPage}" id="prevPage"><上一页</a>
- </c:otherwise>
- <c:forEach items="${page.showPageNums}" var="pageNum">
- <a href="http://localhost:8080/paging/user.htm?currentPage=${pageNum}" id="pageNum">${pageNum}</a>
- </c:forEach>
- <a href="http://localhost:8080/paging/user.htm?currentPage=${page.nextPage}" id="nextPage">下一页></a>
- </div>
- </body>
- <script type="text/javascript">
- $(function(){
- $("#prevPage").mousemove(function(){
- $("#prevPage").css("border-color","#4a86e8");
- $("#prevPage").css("background","#d5dce8");
- });
- $("#prevPage").mouseout(function(){
- $("#prevPage").css("border-color","#ccc");
- $("#prevPage").css("background","white");
- });
- $("#nextPage").mousemove(function(){
- $("#nextPage").css("border-color","#4a86e8");
- $("#nextPage").css("background","#d5dce8");
- });
- $("#nextPage").mouseout(function(){
- $("#nextPage").css("border-color","#ccc");
- $("#nextPage").css("background","white");
- });
- });
- </script>
- </html>