jsp中分页技术的实现

分页目的:为了防止服务器一次性将数据库全部数据读出,提高效率。(数据库数据以文件形式存在,从硬盘读取速度慢)

需要使用到限制查询,限制查询的两种表示方法:
limit n:从0开始查询n条数据
limit(n,m):
n—:偏移量(每页显示的第一条数据)
m—:分页量(每页显示的数据条数)

设计需考虑:
当前分页数:currentPage
分页量:pageSize
偏移量:offset
数据总条数:pageTotal
总页数:pages

偏移量:int offset = (currentPage -1)* pageSize;
总页数: int pages= (int)Math.ceil(total*1.0 /pageSize);

分页技术的具体实现如下:

  • servlet中的处理
  • service中的处理
  • dao层的处理
  • utils的处理
  • .jsp文件的处理

StudentServlet (get请求中分页实现关键代码)

 case "look":

                //int currentPage = 1;
                int currentPage = req.getParameter("p")==null?1:Integer.parseInt(req.getParameter("p"));//页码值
                int pageSize = 10;//分页量
                List<Student> list =  ssi.queryPage(currentPage,pageSize);//分页后的数据

                int total= ssi.queryTotal();//总条数
                int pages= (int)Math.ceil(total*1.0 /pageSize);//总页数

                req.setAttribute("currentPage",currentPage);
                req.setAttribute("pages",pages);
                req.setAttribute("list",list);
                req.getRequestDispatcher("/WEB-INF/sms/stu/list.jsp").forward(req,resp);
                break;

StudentServiceImpl中关键代码

    @Override
    public List<Student> queryPage(int currentPage, int pageSize) {
        //拿到偏移量:  起始位置     ,从0开始
       int offset = (currentPage -1)* pageSize;

        return sdi. selectPage(offset,pageSize);
    }

    @Override
    public int queryTotal() {
        return sdi.selectTotal();
    }

StudentDaoImpl中关键代码

 @Override
    public List<Student> selectPage(int offset, int pageSize) {
        String sql = "select * from students limit ?,?";
        BeanListHandler<Student> handler = new BeanListHandler(Student.class);
        Integer[] args = {offset,pageSize};
        return DBUtil.select(sql,handler,args);
    }

    @Override
    public int selectTotal() {
        String sql = "select count(*) from students";

        ScalarHandler<Long> handler = new ScalarHandler<>();
        Integer[] args = {};
        return DBUtil.select(sql,handler,args);
    }

DBUtil中对查询的操作

 public static <T> List<T>  select(String sql, BeanListHandler<T> beanListHandler, Object... args){
        List<T> list = null;
        try {
            list =  runner.query(sql,beanListHandler,args);

        } catch (SQLException e) {
            e.printStackTrace();
        }
        return list;
    }


    //long强转int
    public static int  select(String sql, ScalarHandler<Long> scalarHandler, Object... args){
        int num = 0 ;
        try {
            num =  (int)runner.query(sql,scalarHandler,args).intValue();

        } catch (SQLException e) {
            e.printStackTrace();
        }
        return num;
    }

list.jsp中对页码部分的设置,采用booystrap设置的分页框架

需注意的是:左右两边界限的判断
左边界限:当currentPage-1=0时 显示第一页,否则显示当前页currentPage-1;
右边界限:当currentPage+1>pages 时 显示最大页即Pages,否则显示当前页currentPage+1;
对当前页添加激活颜色

 <tr>
                    <td colspan="7">
                        <nav aria-label="Page navigation">
                            <ul class="pagination">
                                <li>
                                    <a href="?a=look&p=${currentPage-1 == 0?1:currentPage-1}" aria-label="Previous">
                                        <span aria-hidden="true">&laquo;</span>
                                    </a>
                                </li>
                                <c:forEach begin="1" end="${pages}" var="i">
                                    <li class="${i==currentPage ? 'active':''}"><a href="?a=look&p=${i}">${i}</a></li>
                                </c:forEach>

                                <li>
                                    <a href="?a=look&p=${currentPage+1 > pages? pages:currentPage+1}" aria-label="Next">
                                        <span aria-hidden="true">&raquo;</span>
                                    </a>
                                </li>
                            </ul>
                        </nav>
                    </td>
                </tr>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值