Servlet分页

利用servlet实现分页

1.创建工程和导入包

创建web工程,在WEB-INF中创建lib文件夹,和js文件夹

lib中导入:

javax.servlet.jar,

jstl.jar,

mysql-connector-java-5.1.7-bin.jar,

servlet-api.jar,

standard.jar

js中导入:

js的包

2.分包:

工程中创建包:entity,util,dao,test,service,servlet,jsp

(entity,util,dao,test,service,servlet,jsp)

3.工具类

创建BaseDao作为通用对数据库操作的方法封装工具类,再创建一个工具类(分页用)PageBean

package limit.util;

//分页的工具类
public class PageBean {
    private int pageNo;//当前页
    private int pageTotal;//总页数
    private int countTotal;//总记录数
    private int pageSize;//每页记录数
    private int startRow;//起始位置

    public PageBean() {
    }

    public PageBean(int pageNo, int countTotal, int pageSize) {
//利用三个参数来得到其他的参数
        this.pageNo = pageNo;
        this.pageTotal = countTotal % pageSize == 0 ? countTotal / pageSize : countTotal / pageSize + 1;
        this.countTotal = countTotal;
        this.pageSize = pageSize;
        this.startRow = (pageNo - 1) * pageSize;
    }

    public int getPageNo() {
        return pageNo;
    }

    public void setPageNo(int pageNo) {
        this.pageNo = pageNo;
    }

    public int getPageTotal() {
        return pageTotal;
    }

    public void setPageTotal(int pageTotal) {
        this.pageTotal = pageTotal;
    }

    public int getCountTotal() {
        return countTotal;
    }

    public void setCountTotal(int countTotal) {
        this.countTotal = countTotal;
    }

    public int getPageSize() {
        return pageSize;
    }

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

    public int getStartRow() {
        return startRow;
    }

    public void setStartRow(int startRow) {
        this.startRow = startRow;
    }
}

4.在Dao接口中定义方法,查询方法和查询记录数并实现

定义两个方法,一个用来查找总的记录数,一个用来按照分页查询得到数据

@Override
public List<User> findAll(PageBean pageBean) {
    String sql = "select * from t_user limit ?,?";
    Object[] params = new Object[]{pageBean.getStartRow(), pageBean.getPageSize()};
    ResultSet rs = super.executeQuery(sql, params);
    ArrayList<User> list = new ArrayList<>();
    User user = null;
    try {
        while (rs.next()) {
            user = new User(rs.getInt("id"), rs.getString("name"), rs.getString("pwd"));
            list.add(user);
        }
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        closeAll();
    }
    return list;
}

@Override
public int countTotal() {
    String sql = "select count(*) as count from t_user";
    ResultSet rs = super.executeQuery(sql, null);
    int a = 0;
    try {
        while (rs.next()) {
            a = rs.getInt("count");
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return a;
}

5.在Servlet中添加控制

package limit.servlet;

import limit.service.UserServiceImpl;
import limit.untity.User;
import limit.util.PageBean;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

public class UserServlet extends HttpServlet {
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置字符集
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=UTF-8");
        response.setCharacterEncoding("utf-8");
        
        //获取jsp页面的当前页数
        String pageNoStr = request.getParameter("pageNo");
        //设置初始值,添加判断,如果没获取到,或初次访问,就默认为1
        int pageNo = 0;
        if (pageNoStr != null){
            pageNo = Integer.parseInt(pageNoStr);
        } else {
            pageNo = 1;
        }

        //实例化service
        UserServiceImpl userService = new UserServiceImpl();
        //获取总的记录数
        int countTotal = userService.countTotal();
        //实例化PageBean工具类
        PageBean pageBean = new PageBean(pageNo, countTotal,5);
        //查找分页数据
        List<User> list = userService.findAll(pageBean);
        //绑定值并转发
        request.setAttribute("list",list);
        request.setAttribute("pageBean", pageBean);
        request.getRequestDispatcher("list.jsp").forward(request,response);
    }
}

6.在list.jsp文件中添加函数逻辑

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>展示页面</title>
    <script type="text/javascript" src="js/jquery-1.8.3.min.js"></script>
    <script type="text/javascript" src="js/list.js">
        $(function () {
        
        });
        function firstPage() {
            //给当前页设置为1
            $("[name=pageNo]").val(1);
            //提交
            $("#userForm").submit();
        }
        
        function prevPage() {
            //获取当前页数的值
            var $pageNo = $("[name=pageNo]").val();
            var pageNo = parseInt($pageNo);
            //判断是否是第一页并提示
            if (pageNo == 1){
                alert("当前已经是第一页");
            } else {
                //不是第一页的话当前页减去1并赋值
                $("[name=pageNo]").val(pageNo-1);
                $("#userForm").submit();
            }
        }
        
        function nextPage() {
            var $pageNo = $("[name=pageNo]").val();
            var $pageTotal = $("[name=pageTotal]").val();
            if ($pageNo == $pageTotal){
                alert("当前已经是最后一页");
            } else {
                $("[name=pageNo]").val($pageNo*10/10+1);
                $("#userForm").submit();
            }
        }
        
        function lastPage() {
            var $pageTotal = $("[name=pageTotal]").val();
            $("[name=pageNo]").val($pageTotal);
            $("#userForm").submit();
        }
    </script>
</head>
<body>
<div id="base_top">
    <form action="UserServlet" method="post" id="userForm">
        <table border="1px">
            <tr>
                <td>用户名查询</td>
                <td><input type="text" name="nameMsg" value="${nameMsg}"></td>
                <td><input type="submit" value="提交"></td>
            </tr>
            <tr>
                <td>用户ID</td>
                <td>用户名</td>
                <td>用户密码</td>
            </tr>
            <c:forEach items="${list}" var="user">
                <tr>
                    <td>${user.id}</td>
                    <td>${user.name}</td>
                    <td>${user.pwd}</td>
                </tr>
            </c:forEach>
        </table>
        <div>
            <input type="hidden" name="pageNo" value="${pageBean.pageNo}">
            <input type="hidden" name="pageTotal" value="${pageBean.pageTotal}">
            <a href="#" onclick="firstPage()">首页</a>
            <a href="#" onclick="prevPage()">上一页</a>
            <a href="#" onclick="nextPage()">下一页</a>
            <a href="#" onclick="lastPage()">尾页</a>
        </div>
    </form>
</div>
</body>
</html>

最后的实现:

 

 

 

单从表现层来说分页不是一个复杂的工作,稍微理一下思路,处于不同competence level的同学应该都能自己搞出来。 以上面的文章列表分页为例,我觉得分页有两点重要的, 一是:分页我们必须首先自己搞清楚,文章总数、每页显示文章数(页大小)、页数 二是:如何做好页脚的分页导航条 实际应用,文章总数这个值我们从数据库可以得到;每页显示的文章数即分页的页大小可以自己定义;页数我们可以通过下面的个表达式简单得出。 假设: int pageSize = 10; //分页大小 int totalPosts = PagingDAO.entryList.size(); //总文章数 int totalPages = totalPosts/pageSize + ((totalPosts%pageSize)>0?1:0); //计算得出的总页数 每页的文章怎么取出来? 知道分页的大小之后,我们生成了页好的选取下拉框,每次选择第几页的时候,都会向Servlet传递当前选择页号的参数,这样Servlet调用后面的DAO相应的方法,取得文章列表信息,再回传到JSP以供显示。 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> page Size : ${pageSize} <br /> Total Posts: ${totalPosts} <br /> Total Pages: ${totalPages} <br /> Current Page: ${pageNumber} <hr /> <table> <thead> <tr align="center"> <td width="10%">Article ID</td> <td width="70%">Article Title</td> <td colspan="3">Actions</td> </tr> </thead> <tbody> <c:forEach items="${entryList}" var="entry"> <tr align="center"> <td>${entry.entryID}</td> <td>${entry.title}</td> <td><a href="viewEntry?entryID=${entry.entryID}">View</a></td> <td><a href="editEntry?entryID=${entry.entryID}">Edit</a></td> <td><a href="deleteEntry?entryID=${entry.entryID}">Delete</a></td> </tr> </c:forEach> </tbody> <tfoot> <tr align="center"> <td colspan="5"> <jsp:include page="paging_footer.jsp"></jsp:include> </td> </tr> </tfoot> </table> <hr/>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值