JavaWeb分页

本文详细描述了在JavaWeb开发中如何通过封装数据、DAO层的SQL查询、Service层的业务处理以及Controller层的接口调用来实现数据的分页展示,包括查询总数、获取指定页的数据并传递给前端进行显示。
摘要由CSDN通过智能技术生成

项目效果

实现步骤 

1.封装数据

要做到上图效果需先准备好所需要的数据。我们需要的数据有:当前页的页码pageNumber,数据库表中的数据的总条数totalNumber,每一页显示的数据条数pageSize,通过查数据库所得到的教师数据的集合list,将这些数据封装到Page类当中。代码如下

package com.school.domain;


import com.school.dao.TeacherDao;
import com.school.dao.impl.TeacherDaoimpl;
import com.school.utils.ReadFileDemo;

import java.io.Serializable;
import java.util.List;

/**
 * 封装分页显示的数据
 */
public class Page implements Serializable {
    private int pageSize = 10;//自定义查询的数据条数
    private int totalNumber;//从数据库查出总长度
    private int pageNumber;//显示当前页数(前台)
    private int totalPageNumber;//总页数
    private int startIndex;
    private int startPageNumber;//起始位置
    private int endPageNumber;
    private String splitUrl;//处理数据的servlet
    private List<?> list = null;

    public Page(int pageNumber, int totalNumber, int pageSize, String splitUrl) {
        this.pageNumber = pageNumber;
        this.totalNumber = totalNumber;
        this.pageSize = pageSize;
        this.splitUrl = splitUrl;
        //通过总长度和数据条数计算总页数
        if (totalNumber % pageSize == 0){
            totalPageNumber = totalNumber/pageSize;
        }else {
            totalPageNumber = totalNumber/pageSize + 1;
        }
        //下一页所需的数据起始值
        startIndex = (pageNumber-1)*pageSize;

        //总页数小于5的情况
        if (totalPageNumber < 5){
            startPageNumber = 1;
            endPageNumber = totalPageNumber;

        }else {
            //控制显示数字
            if (pageNumber < 3){
                startPageNumber = 1;
                endPageNumber = 5;
            }else {
                if (pageNumber > (totalPageNumber - 3)){
                    startPageNumber = totalPageNumber - 4;
                    endPageNumber = totalPageNumber;
                }else {
                    startPageNumber = pageNumber - 2;
                    endPageNumber = pageNumber + 2;
                }
            }
        }
    }

    public int getPageSize() {
        return pageSize;
    }

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

    public int getTotalNumber() {
        return totalNumber;
    }

    public void setTotalNumber(int totalNumber) {
        this.totalNumber = totalNumber;
    }

    public int getPageNumber() {
        return pageNumber;
    }

    public void setPageNumber(int pageNumber) {
        this.pageNumber = pageNumber;
    }

    public int getTotalPageNumber() {
        return totalPageNumber;
    }

    public void setTotalPageNumber(int totalPageNumber) {
        this.totalPageNumber = totalPageNumber;
    }

    public int getStartPageNumber() {
        return startPageNumber;
    }

    public void setStartPageNumber(int startPageNumber) {
        this.startPageNumber = startPageNumber;
    }

    public int getEndPageNumber() {
        return endPageNumber;
    }

    public void setEndPageNumber(int endPageNumber) {
        this.endPageNumber = endPageNumber;
    }

    public List<?> getList() {
        return list;
    }

    public void setList(List<?> list) {
        this.list = list;
    }

    public int getStartIndex() {
        return startIndex;
    }

    public void setStartIndex(int startIndex) {
        this.startIndex = startIndex;
    }

    public String getSplitUrl() {
        return splitUrl;
    }

    public void setSplitUrl(String splitUrl) {
        this.splitUrl = splitUrl;
    }

    @Override
    public String toString() {
        return "Page{" +
                "pageSize=" + pageSize +
                ", totalNumber=" + totalNumber +
                ", pageNumber=" + pageNumber +
                ", totalPageNumber=" + totalPageNumber +
                ", startIndex=" + startIndex +
                ", startPageNumber=" + startPageNumber +
                ", endPageNumber=" + endPageNumber +
                ", splitUrl='" + splitUrl + '\'' +
                ", list=" + list +
                '}';
    }
}

2.Dao层对数据库查询获得结果集(list) 

/**
     * 分页查询数据
     * 
     */
    @Override
    public List<Teacher> findPagingTeacher(int startPageNumber,int pageSize) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = null;
        List<Teacher> teachers = new ArrayList();
        try {
            conn = DBUtils.getConnection();
            sql = "select id,name,password,email,gender,remark from teacher limit ?,?";
            ps = conn.prepareStatement(sql);
            ps.setInt(1,startPageNumber);
            ps.setInt(2,pageSize);
            rs = ps.executeQuery();
            while (rs.next()){
                Teacher teacher = new Teacher();
                teacher.setId(rs.getInt(1));
                teacher.setName(rs.getString(2));
                teacher.setPassword(rs.getString(3));
                teacher.setEmail(rs.getString(4));
                teacher.setGender(rs.getString(5));
                teacher.setRemark(rs.getString(6));
                teachers.add(teacher);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        //关闭连接
        DBUtils.closeDB(conn,ps,rs);
        return teachers;
    }

    /**
     * 查询所有数据数量
     */
    @Override
    public int findCountTeacher() {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = null;
        int sum = 0;
        try {
            conn = DBUtils.getConnection();
            sql = "select count(*) from teacher";
            ps = conn.prepareStatement(sql);
            rs = ps.executeQuery();
            while (rs.next()){
                sum = rs.getInt(1);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return sum;
    }

3. Service层调用数据库方法实现业务

/**
     * 分页
     */
    @Override
    public Page paging(String splitUrl,int pageNumber, int pageSize) {
        TeacherDao teacherDao = new TeacherDaoimpl();
        int countTeacher = teacherDao.findCountTeacher();
        Page page = new Page(pageNumber,countTeacher,pageSize,splitUrl);
        List<Teacher> teachers = teacherDao.findPagingTeacher(page.getStartIndex();
        page.getPageSize());
        page.setList(teachers);
        return page;
    }

 4.Controller层调用Service层方法给前台传递数据

package com.school.web.controller;

import com.school.domain.Page;
import com.school.service.TeacherService;
import com.school.service.impl.TeacherServiceimpl;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/SplitpageController")
public class SplitpageController extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String Action = req.getParameter("Action");

        //设置每页显示数
        if ("pagesize".equals(Action)){
            //获得前台传递的数据
            int pageSize = Integer.parseInt(req.getParameter("pageSize"));
            req.getSession().setAttribute("pageSize",pageSize);
            //调用Service层的方法
            TeacherService teacherService = new TeacherServiceimpl();
            Page page = teacherService.paging("SplitpageController",1,pageSize);
            //将数据传给前台
            req.setAttribute("page",page);
            req.getRequestDispatcher("/pages/admin_teacher.jsp").forward(req,resp);
        }

        //分页
        if ("splitpage".equals(Action)){
            //获得前台传递的数据
            int pageNumber = Integer.parseInt(req.getParameter("pageNumber"));
            Object pageSize = req.getSession().getAttribute("pageSize");
            //判断每页显示的数据个数,如果是空就设置为默认值10
            if (pageSize==null){
                TeacherService teacherService = new TeacherServiceimpl();
                Page page = teacherService.paging("SplitpageController",pageNumber,10);
                req.setAttribute("page",page);
                
                req.getRequestDispatcher("/pages/admin_teacher.jsp").forward(req,resp);
            }else {
                TeacherService teacherService = new TeacherServiceimpl();
                Page page = teacherService.paging("SplitpageController",pageNumber,(int)pageSize);
                req.setAttribute("page",page);
                
                req.getRequestDispatcher("/pages/admin_teacher.jsp").forward(req,resp);
            }
        }
    }
}

5.jsp页面的数据显示 

考虑到通用性所以新建一个jsp文件写分页的代码。

<div class="box-footer">
    <div class="pull-left">
        <div class="form-group form-inline">
            总共${page.totalPageNumber}页,共${page.totalNumber}条数据。<br>
            <form action="${page.splitUrl}" id="formpage" method="post" onchange="fun1()">
                每页${page.pageSize}条数据
                设置:<select class="form-control" name="pageSize">
                <%--<option value="0">0</option>--%>
                <option value="0">0</option>
                <option value="8">8</option>
                <option value="10">10</option>
                <option value="15">15</option>
                <option value="20">20</option>
                <%--<option></option>--%>
            </select> 条
                <input type="hidden" name="Action" value="pagesize">
            </form>
        </div>
    </div>

    <div class="box-tools pull-right">
        <ul class="pagination">
            <li>
                <a href="${pageContext.request.contextPath}/${page.splitUrl}?Action=splitpage&pageNumber=1&teacherkey=${teacherkey}&teachervalue=${teachervalue}" aria-label="Previous">首页</a>
            </li>
            <c:if test="${page.pageNumber>1}">
                <li>
                    <a href="${pageContext.request.contextPath}/${page.splitUrl}?Action=splitpage&pageNumber=${page.pageNumber-1}&teacherkey=${teacherkey}&teachervalue=${teachervalue}">上一页</a>
                </li>
            </c:if>

            <c:forEach begin="${page.startPageNumber}" end="${page.endPageNumber}" var="pageNumber">
                    <li>
                        <a href="${pageContext.request.contextPath}/${page.splitUrl}?Action=splitpage&pageNumber=${pageNumber}&teacherkey=${teacherkey}&teachervalue=${teachervalue}">${pageNumber}</a>
                    </li>
            </c:forEach>

            <c:if test="${page.pageNumber < page.endPageNumber}">
                <li>
                    <a href="${pageContext.request.contextPath}/${page.splitUrl}?Action=splitpage&pageNumber=${page.pageNumber+1}&teacherkey=${teacherkey}&teachervalue=${teachervalue}">下一页</a>
                </li>
            </c:if>
            <li>
                <a href="${pageContext.request.contextPath}/${page.splitUrl}?Action=splitpage&pageNumber=${page.totalPageNumber}&teacherkey=${teacherkey}&teachervalue=${teachervalue}" aria-label="Next">尾页</a>
            </li>
        </ul>
    </div>

</div>
<script>
    function fun1() {

        var formpage = document.getElementById("formpage");
        formpage.submit();
    }
</script>

 将分页功能的网页使用动态包含进显示数据的网页

<table id="dataList" class="table table-bordered table-striped table-hover dataTable">
                 <thead>
                  <tr>
                   <th class="" style="padding-right:0px;">
                    <input id="selall" type="checkbox" class="icheckbox_square-blue">
                   </th>
                   <th class="sorting_asc">ID</th>
                   <th class="sorting_desc">姓名</th>
                   <th class="sorting_asc sorting_asc_disabled">密码 </th>
                   <th class="sorting">邮箱 </th>
                   <th class="sorting_desc sorting_desc_disabled">性别</th>
                   <th class="text-center sorting">备注</th>
                   <th class="text-center">操作</th>
                  </tr>
                </thead>
                  <tbody>
                   <c:forEach items="${page.list}" var="teacher">
                     <tr>
                           <td><input name="ids" type="checkbox" class="boxs" value="${teacher.id}"></td>
                           <td>${teacher.id}</td>
                           <td>${teacher.name}</td>
                           <td>${teacher.password}</td>
                           <td>${teacher.email}</td>
                           <td>${teacher.gender}</td>
                           <td class="text-center">${teacher.remark}</td>
                           <td class="text-center">
                           <a href="TeacherController?Action=showback_teacher&pageSize=${page.pageSize}&pageNumber=${page.pageNumber}&id=${teacher.id}"><button type="button" class="btn bg-olive btn-xs">编辑</button></a>
                          <a href="TeacherController?Action=deleteteacher&pageSize=${page.pageSize}&pageNumber=${page.pageNumber}&id=${teacher.id}"><button type="button" class="btn bg-olive btn-xs">删除</button></a>

                     </td>
                  </tr>
                </c:forEach>

            </tbody>
         </table>
//动态包含
<jsp:include page="splitpage.jsp"></jsp:include>

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值