JSP分页

MySQL的limit子句。

格式:select .... limit [偏移量],<记录个数>

一、设计一个分页类Pager.java

package com.nba.player;

public class Pager {
    private int pageSize=10;// 默认每页记录数
    private int pageNosDisplay=10;// 默认每次显示的页码数
    private int totalPages;// 总页数
    private int pageNo = 1;// 当前页码数

    public int getPageSize() {
        return pageSize;
    }

    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }

    public int getPageNosDisplay() {
        return pageNosDisplay;
    }

    public void setPageNosDisplay(int pageNosDisplay) {
        this.pageNosDisplay = pageNosDisplay;
    }

    public int getTotalPages() {
        return totalPages;
    }
    
    //通过传入的表名得到总页数
    public void setTotalPages(String tableName) {
     int totalRecords=getTotalRecords(tableName); totalPages
= totalRecords % pageSize == 0 ? totalRecords / pageSize : totalRecords / pageSize + 1; } public int getPageNo() { return pageNo; } public void setPageNo(int pageNo) { this.pageNo = pageNo; }
  

  //获得某表的记录总数
  private int getTotalRecords(String tableName) {
    int totalRecords=0;
    Connection connection=DB.getConnection();
    ResultSet rs=null;
    Statement st=null;

    String sql="select count(*) from "+tableName;
    try {
      st=connection.createStatement();
      rs=st.executeQuery(sql);
      if(rs.next())
        totalRecords=rs.getInt(1);
      rs.close();
      st.close();
      connection.close();
    } catch (Exception e) {
      e.printStackTrace();
    }
    return totalRecords;
  }


}

 

二、设计实体类Player.java

package com.nba.player;

public class Player {
    private int id;
    private String headimgurl;
    private String chinesename;
    private String englishname;
    private String number;
    private String position;
    private double height;
    private double weight;
    private int age;
    private int playAge;
    private int teamid;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getHeadimgurl() {
        return headimgurl;
    }
    public void setHeadimgurl(String headimgurl) {
        this.headimgurl = headimgurl;
    }
    public String getChinesename() {
        return chinesename;
    }
    public void setChinesename(String chinesename) {
        this.chinesename = chinesename;
    }
    public String getEnglishname() {
        return englishname;
    }
    public void setEnglishname(String englishname) {
        this.englishname = englishname;
    }
    public String getNumber() {
        return number;
    }
    public void setNumber(String number) {
        this.number = number;
    }
    public String getPosition() {
        return position;
    }
    public void setPosition(String position) {
        this.position = position;
    }
    public double getHeight() {
        return height;
    }
    public void setHeight(double height) {
        this.height = height;
    }
    public double getWeight() {
        return weight;
    }
    public void setWeight(double weight) {
        this.weight = weight;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public int getPlayAge() {
        return playAge;
    }
    public void setPlayAge(int playAge) {
        this.playAge = playAge;
    }
    public int getTeamid() {
        return teamid;
    }
    public void setTeamid(int teamid) {
        this.teamid = teamid;
    }
    
}

 

三、设计业务类PlayerService.java

package com.nba.player;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;


public class PlayerService {
    
    //获得数据库连接
    private static Connection getConnection() {
        Connection connection=null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            connection=DriverManager.getConnection("jdbc:mysql://sh-cdb-qego3b2a.sql.tencentcdb.com:61551/study", "student", "student");
        } catch (Exception e) {
            System.out.println("数据库连接出错!");
            e.printStackTrace();
        }
        return connection;
    }
    
    //获得记录总数
    public static int getPlayersTotalRecords() {
        int totalRecords=0;
        Connection connection=getConnection();
        ResultSet rs=null;
        Statement st=null;
        
        String sql="select count(*) from player";
        try {
            st=connection.createStatement();
            rs=st.executeQuery(sql);
            if(rs.next())
                totalRecords=rs.getInt(1);
            rs.close();
            st.close();
            connection.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return totalRecords;
    }
    
    //得到分页记录
    public static List<Player> getPlayers(Pager pager) {
        List<Player> players=new ArrayList<Player>();
        ResultSet rs=null;
        PreparedStatement ps=null;
        Connection connection=getConnection();
        try {
            String sql="select headimgurl, number, englishname,chinesename,position,height from player limit ?,?";
            ps=connection.prepareStatement(sql);
            ps.setInt(1, (pager.getPageNo()-1)*pager.getPageSize());
            ps.setInt(2, pager.getPageSize());
            rs=ps.executeQuery();
            while (rs.next()) {
                String headImgUrl=rs.getString("headimgurl");
                String number=rs.getString("number");
                String englishName=rs.getString("englishname");
                String chineseName=rs.getString("chinesename");
                String position=rs.getString("position");
                double height=rs.getDouble("height");
                
                Player p=new Player();
                p.setHeadimgurl(headImgUrl);
                p.setChinesename(chineseName);
                p.setEnglishname(englishName);
                p.setNumber(number);
                p.setPosition(position);
                p.setHeight(height);
                
                players.add(p);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                ps.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return players;
    }
}

 

四、设计控制器GetPlayersServlet.java

package com.nba.player;

import java.io.IOException;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class GetPlayersServlet
 */
@WebServlet("/GetPlayersServlet")
public class GetPlayersServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public GetPlayersServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) {
        Pager pager=new Pager();//建立分页对象
        
        //获得当前页
        String strPageNo = request.getParameter("pageNo");
        int pageNo=1;
        if (strPageNo != null && !strPageNo.equals("")) {
            try {
                pageNo = Integer.parseInt(strPageNo);
            } catch (NumberFormatException e) {
                pageNo = 1;
            }
        }
        if (pageNo <= 0) {
            pageNo = 1;
        }
        pager.setPageNo(pageNo);
        
        //获得总页数
        pager.setTotalPages(player);//通过表名得到总页数
        
        //获得某一页的球员列表
        List<Player> players=PlayerService.getPlayers(pager);
        
        //将以下数据带入视图
        request.setAttribute("players", players);//球员数据
        request.setAttribute("pager", pager);//分页数据
        request.setAttribute("servlet", request.getContextPath()+request.getServletPath());//处理请求的servlet
        
        //视图
        RequestDispatcher rd=request.getRequestDispatcher("player/PlayerList.jsp");
        try {
            rd.forward(request, response);
        } catch (ServletException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}

 

五、分页控件前端展示文件Pager.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<ul class="pagination">
    <!-- 上一页 (当页码小于等于1时)-->
    <c:if test="${pager.pageNo le 1}">
        <li class="disabled"><a>&laquo;</a></li>
    </c:if>

    <!-- 上一页(当页码大于1时) -->
    <c:if test="${pager.pageNo gt 1}">
        <li><a href="${servlet }?pageNo=${pager.pageNo-1}">&laquo;</a>
    </c:if>

    <!-- 计算要显示超始页码 (15-1)/10*10+1=11 -->
    <c:set var="num" value="${(pager.pageNo-1) / pager.pageNosDisplay}" />
    <!-- 向下取整 -->
    <fmt:formatNumber var="n" value="${ num + (num % 1 == 0 ? 0 : -0.5)}" pattern="#"></fmt:formatNumber>
    <c:set var="start" value="${n * pager.pageNosDisplay+1 }" />
    
    <c:set var="ii" /><!-- 记循环变量i的值 -->
    
    <!-- 是否加1... -->
    <c:if test="${start gt pager.pageNosDisplay }">
        <li><a href="${servlet}?pageNo=1">1</a></li> 
        <li> <a>...</a></li>
    </c:if>
    
    <!--要显示的页码段 << 1...11,12,13,14,15,16,17,18,19,20...44 >> (设共44页) -->
    <c:forEach var="i" begin="${start}" end="${start-1 + pager.pageNosDisplay }">
        <c:if test="${i le pager.totalPages}">
            <c:set var="ii" value="${i}" />
            <c:if test="${i eq pager.pageNo }">
                <li class="active"><a>${i}</a><!-- 当前页不作链接 -->
            </c:if>
            <c:if test="${i ne pager.pageNo }">
                <li><a href="${servlet }?pageNo=${i}">${i}</a></li>
            </c:if>
        </c:if>
    </c:forEach>

    <!-- 是否加...[totalPages] -->
    <c:if test="${ii lt pager.totalPages}">
        <c:set var="num1" value="${(pager.totalPages-1) / pager.pageNosDisplay}" />
        <!-- 向下取整 -->
        <fmt:formatNumber var="n1" value="${ num1 + (num1 % 1 == 0 ? 0 : -0.5)}" pattern="#"></fmt:formatNumber>
        <c:if test="${n ne n1 }"><!-- << 1...41,42,43,44 >> -->
            <li><a>...</a></li>
        </c:if>
        <li><a href="${servlet }?pageNo=${pager.totalPages}">${pager.totalPages}</a></li>
    </c:if>


    <!-- 下一页(页码等于总页) -->
    <c:if test="${pager.pageNo eq pager.totalPages }">
        <li class="disabled"><a>&raquo;</a></li>
    </c:if>
    <!-- 下一页(页码小于总页) -->
    <c:if test="${pager.pageNo lt pager.totalPages }">
        <li><a href="${servlet }?pageNo=${pager.pageNo+1}">&raquo;</a></li>
    </c:if>
</ul>

 

六、视图文件PlayerList.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>
<html>
<head>
<meta charset="UTF-8">
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<title>球员列表</title>
</head>
<body>
    <table class="table table-hover table-striped">
        <tr>
            <th>序号</th>
            <th>头像</th>
            <th>中文名</th>
            <th>英文名</th>
            <th>号码</th>
            <th>位置</th>
            <th>身高</th>
        </tr>
        <c:set var="i" value="1" />
        <c:forEach  items="${players}" var="player">
            <tr>
                <td>${i}</td>
                <td><img src="${player.headimgurl}" width="58" height="46"></td>
                <td>${player.chinesename}</td>
                <td>${player.englishname}</td>
                <td>${player.number}</td>
                <td>${player.position}</td>
                <td>${player.height}</td>
            </tr>
            <c:set var="i" value="${i+1 }" />
        </c:forEach>
    </table>
    <%@ include file="../Pager.jsp" %>
</body>
</html>

 

七、运行效果

 

posted @ 2020-04-11 20:30  框框A  阅读(450)  评论(0编辑  收藏  举报