精华内容
下载资源
问答
  • 分页功能怎么实现
    千次阅读
    2020-04-10 14:28:27

    最近项目中开发了分页功能,开发过程中一边开发一边梳理思路,虽然马马虎虎开发完成了,但是总感觉有什么地方没有考虑到。写这篇博客的目的主要还是想再理顺一下思路,如果有考虑不到的地方还希望大家批评指正。再有就是当个知识点记录一下,以便日后查用。

    功能需求很简单,我们有一个数据集,里面有很多条目,需要分页展示再我们的程序中,每页只显示固定的条目数,可以通过“首页”,“上一页”,“下一页”,“尾页”等类似索引跳转到每一页。下面对照这个需求梳理一下思路,下面是对于这个思路打的草稿。

    //1.定义一个容器来存储所有记录(数组,字典表都可以)。
    Map<int,List<String>> Records;
    
    //2.定义三个变量分别表示记录的总条数,记录的总页数,
    //当前页码,一个常量(每页记录最大条数)。
    #define COUNTOFPAGE 10;
    int TotalItem;//记录总数
    int Curpage;  //当前页数
    int TotalPage;//总页数
    
    //3初始化处理:获取所有记录填充容器,当前页码初始化为-1,
    //根据记录总数计算出总页数,填充首页数据,分别处理无记录(当前页码仍为-1),
    //记录数少于每页最大记录数(当前页码赋值为1),
    //记录数大于等于每页最大记录数(调用首页处理方法)。 
    {
        TotalItem = Records.size();
        TotalPage = TotalItem%COUNTOFPAGE ==0?TotalItem/COUNTOFPAGE:TotalItem/COUNTOFPAGE +1;
        if(TotalItem==0)
        {
            Curpage= -1;
            //调用首页处理的方法
        }
    
        if(TotalItem>ITEMCOUNTOFPAGE)
        {
            Curpage= 2;
            //调用首页处理的方法
        }
        else
        {
            Curpage = 1;
            for(int j =0;j<TotalItem;j++)
            {
                //获取数据,进行填充
                Records.value((Curpage-1)*COUNTOFPAGE+j)
            }
            
        }
    }
    
    
    //4.首页处理:判断当前页码
    //(=-1:提示无记录,=1:提示已经是首页,>1:当前页码=1,
    //填充数据,这里不用再考虑记录总条数是否小于每页最大记录数,铁定是大于等于它的)。
    {
        if(Curpage!=-1)
        {
            if(Curpage == 1)
            {
                //提示已经是首页
                return;
            }
            if(Curpage > 1)
            {
                Curpage = 1;
                for(int j =0;j<COUNTOFPAGE;j++)
                {
                    Records.value((Curpage-1)*COUNTOFPAGE+j)
                }
            }
    
        }
        else
        {
            //提示未查到数据
            return;
        }
    
    }
    //5.上一页处理:判断当前页
    //(=-1:提示无记录,=1:提示已经是首页:>1:当前页码-1,
    //填充数据,这里不用再考虑记录总条数是否小于每页最大记录数,铁定是大于等于它的)。
    {
        if(Curpage!=1)
        {
            //提示无记录
            return;
        }
        if(Curpage==1)
        {
            //提示已经是首页
            return;
        }
        if(Curpage>1)
        {
            Curpage--;
            for(int j =0;j<COUNTOFPAGE;j++)
            {
                //获取数据,进行填充
                Records.value((Curpage-1)*COUNTOFPAGE+j)
            }
        }
    
    }
    //6.下一页处理:判断当前页
    //(=-1:提示无记录,=记录总页数:提示已经是尾页,
    //<记录总页数:当前页码+1,再判断当前页码(=记录总页数并且并且恰好填充满最后一页:填充数据,
    //=记录总页数但是填充不满最后一页:填充数据,<记录总页数:填充数据))。
    {
        if(Curpage!=1)
        {
            //提示无记录
            return;
        }
        if(Curpage==TotalPage)
        {
            //提示已经是末页
            return;
        }
        Curpage=++; //页码加1
        if(Curpage==TotalPage)//判断是不是尾页
        {
              if(TotalItem%COUNTOFPAGE == 0)//如果是尾页并且恰好填充满最后一页
              {
                  for(int j =0;j<COUNTOFPAGE;j++)
                  {
                       //获取数据,进行填充
                       Records.value((Curpage-1)*COUNTOFPAGE+j)
                  }
              }
              else//如果是尾页但是填充不满最后一页
              {
    
                  for(int j =0;j<TotalItem%COUNTOFPAGE;j++)
                  {
                      //获取数据,进行填充
                      Records.value((Curpage-1)*COUNTOFPAGE+j)
                  }
              }
            }
            else //不是最后页
            {
                for(int j =0;j<COUNTOFPAGE;j++)
                {
                    //获取数据,进行填充
                    Records.value((Curpage-1)*COUNTOFPAGE+j)
                }
            }
    
    }
    //7.末页处理:判断当前页(=-1:提示无记录,=记录总页数:提示已经是尾页,
    //<记录总页数:当前页码=记录总页数,
    //(=记录总页数并且并且恰好填充满最后一页:填充数据,
    //=记录总页数但是填充不满最后一页:填充数据,<记录总页数:填充数据))。
    {
        if(Curpage!=-1)
        {
            if(Curpage==TotalPage)
            {
                //提示已经是尾页
                return;
            }
            if(Curpage<TotalPage)  //判断当前页是否小于总页数
            {
                Curpage = TotalPage; //定位到最后页
                if(TotalItem%COUNTOFPAGE == 0)//如果是尾页并且恰好填充满最后一页
                {
                    for(int j =0;j<COUNTOFPAGE;j++)
                    {
                        //获取数据,进行填充
                        Records.value((Curpage-1)*COUNTOFPAGE+j)          
                    }
                }
                else
                {
                    for(int j =0;j<TotalItem%COUNTOFPAGE;j++)//如果是尾页但是填充不满最后一页
                    {
                        //获取数据,进行填充
                        Records.value((Curpage-1)*COUNTOFPAGE+j)         
                    }
                }
            }
    
        }
        else
        {
            //提示未查询到数据
            return;
        }
    }

    如果有考虑不到的地方还请指出

    更多相关内容
  • 主要介绍了Java List分页功能实现代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 1、ListView的小小的一个分页功能 2、加深了对自定义控件的理解 3、对ListView的优化 4、对BaseAdapter的使用 5、自定义Adapter 6、接口的回调 要实现下面的效果–当拖动ListView到底部的时候,显示一个ProgressBar...
  • 分页功能实现

    2015-09-29 13:56:12
    java实现分页,适用于各个框架功能,用于参考
  • 本文实例讲述了Bootstrap table 服务器端分页功能实现方法。分享给大家供大家参考,具体如下: bootstrap版本 为 3.X bootstrap-table.min.css bootstrap-table-zh-CN.min.js bootstrap-table.min.js 前端bootstrap+...
  • asp.net分页功能实现

    2021-01-21 19:17:56
    说一下实现分页的思路 这里的分页用到了一个组件 AspNetPage.dll,这个组件大家可以到网上去下载,我这里就不提供了 添加最近到工具箱中这样我们就可以像其他控件一样拖拽使用了 如图DataPage是在工具箱中的,至于...
  • 主要介绍了Java简单高效实现分页功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 本文实例讲述了thinkPHP5分页功能实现方法。分享给大家供大家参考,具体如下: 其实分页自身的内容也不是很多。不过牵扯到样式的问题感觉挺烦。于是找到了分页类看了一下。把大体的结构说一下。如果有需要修改页面...
  • 分页功能实现java

    2019-02-20 11:23:24
    java实现分页技术,包括前端JSP和后台的java代码实现
  • 本文实例讲述了ThinkPHP3.2框架自带分页功能实现方法。分享给大家供大家参考,具体如下: 1.前端-分页代码: <!--分页显示?--> <div class=pages>{$page} 2.创建分页样式:如page.css 并将以下...
  • 主要介绍了thinkPHP多表查询及分页功能实现方法,结合具体实例形式分析了thinkPHP多表查询以及查询结果的分页显示相关实现技巧,需要的朋友可以参考下
  • 8.分页功能实现1

    2022-08-04 13:32:41
    1. 发布用户帖子 2. 新增发现页面展示所有用户的帖子 3. 用户帖子分页处理 4. 个人主页分页处理 5. 调整分页时每页数据条数参数 1. 发布用户帖子
  • JSP分页功能实现

    千次阅读 2021-09-19 09:50:53
    分页实现思路: 1.首先确定使用的数据库分页语句,如limit等,并编辑好查询语句及对应查询方法; 2.在JSP页面中放入一个表单里面放入存放页码的input(可以使用type="hiden"隐藏起来); 3.点击下一页时调用js函数...

    分页实现思路:
    1.首先确定使用的数据库分页语句,如limit等,并编辑好查询语句及对应查询方法;
    2.在JSP页面中放入一个表单里面放入存放页码的input(可以使用type="hiden"隐藏起来);
    3.点击下一页时调用js函数改变input的值并获取表单(document.forms[0]此处0代表当前页第一个表单),在js函数中再调用form.submit();方法提交表单就获得了相应页码的内容。

    1.编辑底层sql语句、查询方法

    在程序最底层编辑sql语句,并且在调用查询方法的时候需要需要形式参数(int currentPageNo, int pageSize)最终实现下列sql

    //currentPageNo代表一页显示的内容数,pageSize表示第几页
    sql = ".... limit " + currentPageNO + "," + pageSize;
    

    编辑sql的方法有很多,总归最终编辑成功的sql要能在数据库中运行

    2.在servlet层(表单提交到的位置)计算页码数

            //设置页面大小,和初始页码为1
            int pageSize = 20 ;
            int currentPageNo = 1;
    		//注意,此处需要写一个查询数据总数的方法
    		int totalConut =studentService.getStudentCount();
    		int totalPageCount =((int)(totalConut/pageSize))+1;//总共有几页
    		
    		//还需要对传入的数据进行判断,防止出错
            if (currentPageNo < 1){
                currentPageNo = 1;
            }else if (currentPageNo>totalPageCount){
                currentPageNo =totalPageCount;
            }
            if (pageIndex!=null){
                currentPageNo =Integer.parseInt(pageIndex);
            }
    
    		//把这些必要的数据传给jsp
    		req.setAttribute("totalCount",totalConut);//数据总数
            req.setAttribute("currentPageNo",currentPageNo);//当前页
            req.setAttribute("totalPageCount",totalPageCount);//总页数
    

    3.在jsp页面写出上一页,下一页并传值

    <script>
    	//获取表单并提交,此处也可以使用ajax实现,不过多赘述
    	function page_nav(frm,num){
    	//改变name 为 pageIndex的input的值
    		frm.pageIndex.value = num;
    		frm.submit();
    	}
    </script>
    <body>
    
    
    <form action="${pageContext.request.contextPath}/jsp/user.do" method="post">
    <!--用于标记当前页数的input,默认为1,跳转时-->
    <input type="hidden" name="pageIndex" value="1" >
    
    <!--判断并输出上一页、下一页按钮-->
    <ul>
    <!--获得后端传来的值-->
    				<li>共${pageContext.request.getAttribute("totalCount ")}条记录&nbsp;&nbsp; ${pageContext.request.getAttribute("currentPageNo") }/${pageContext.request.getAttribute("totalPageCount")}页</li>
    				<c:if test="${pageContext.request.getAttribute("currentPageNo")  > 1}">
    					<a href="javascript:page_nav(document.forms[0],1);">首页</a>
    					<a href='javascript:page_nav(document.forms[0],${pageContext.request.getAttribute("currentPageNo") -1});'>上一页</a>
    				</c:if>
    				<c:if test='${pageContext.request.getAttribute("currentPageNo")  < pageContext.request.getAttribute("totalPageCount") }'>
    					<a href='javascript:page_nav(document.forms[0],${pageContext.request.getAttribute("currentPageNo")+1 });'>下一页</a>
    					<a href='javascript:page_nav(document.forms[0],${pageContext.request.getAttribute("totalPageCount")});'>最后一页</a>
    				</c:if>
    				&nbsp;&nbsp;
    			</ul>
    </body>
    

    以上,分页功能完成。
    内容如有不当,希望得到指正。

    展开全文
  • js分页功能实现

    2019-07-26 08:51:45
    js分页.rar,js分页,page.html,page.js
  • 基于SSM的简单分页功能实现

    千次阅读 多人点赞 2020-01-09 16:03:39
    基于SSM框架的简单分页实现简要说明项目结构分页原理实现代码(带详细注释)1.Page工具类 (比较重要的类,用来实现分页)2.UserDao.xml mybatis映射文件3.UserDao.java4.UserService.java5.UserServiceImpl.java6....

    简要说明

    环境是ssm框架,实现简单的物理分页,代码有详细注释,适合同我一样的菜鸟或者刚接触ssm的小白。有不对的地方请评论区留言指正,我会修正的。

    项目结构

    在这里插入图片描述
    在这里插入图片描述
    以上是大概的项目结构,后面整理好后我会传到github上。

    分页原理

    • 物理分页

      • 实现原理: SELECT * FROM xxx [WHERE…] LIMIT #{param1}, #{param2}
        第一个参数是开始数据的索引位置
        第二个参数是要查询多少条数据
      • 优点: 不会造成内存溢出
        缺点: 翻页的速度比较慢
    • 逻辑分页

      • 实现原理: 一次性将所有的数据查询出来放在内存之中,每次需要查询的时候就直接从内存之中去取出相应索引区间的数据
      • 优点: 分页的速度比较快
        缺点: 可能造成内存溢出

    实现代码(带详细注释)

    数据表(直接贴上表的字段 请自己手动建表 插数据)

    在这里插入图片描述

    1.Page工具类 (比较重要的类,用来实现分页)
    package example.until;
    
    public class Page {
        int start;  //开始数据的索引
        int count;  //每页数量
        int total;  //总数据量
    
    
        public int getStart() {
            return start;
        }
    
        public void setStart(int start) {
            this.start = start;
        }
    
        public int getCount() {
            return count;
        }
    
        public void setCount(int count) {
            this.count = count;
        }
    
        public int getTotal() {
            return total;
        }
    
        public void setTotal(int total) {
            this.total = total;
        }
    
        /**
        * 提供一个构造方法
        */
        public Page(int start,int count){
            super();
            this.start = start;
            this.count = count;
        }
        /**
         * 判断是否有上一页
         */
        public boolean isHasPreviouse(){
            if(start == 0)
                return false;
            return true;
        }
        /**
         * 判断是否有下一页
         */
        public boolean isHasNext(){
            if (start == getLast())
                return false;
            return true;
        }
        /**
         * 计算得到的总页数
         */
        public int getTotalPage(){
            int totalPages;
            if( 0 == total % count ){   //举个栗子  total = 20  count =10   total % count = 0 正好除尽 无余数 进入if
                totalPages = total / count;  // totalPages = 20/10 =2      一共就是两页啦
            }else{//再举个栗子  total = 21  count =10   total % count = 1 没除尽 余数为1  进入else
                totalPages = total / count +1;   // totalPages = (21/10) +1  = 2 + 1 =3   一共就是3页  前两页每页10条数据 最后一页一条数据
            }
            //这种是特殊情况  total = 0  count =10  total % count = 0
            //totalPages = 0/10 = 0   但是第一页不能为 0 呀 那就设值为 1 啦
            if ( 0 == totalPages){
                totalPages = 1; //设值为 1
            }
            return totalPages;  //返回总页数
        }
        /**
         * 计算尾页的第一条数据索引
         */
        public int getLast(){
            //这里指尾页的第一条数据索引,非页数 比如有36条数据 一共4页 最后一页的第一条数据索引就是 30
            // (注意 :这里是按第一页第一条从0开始计算)
            int last;
            if( 0 == total % count ){  //举个栗子  total = 30  count =10   total % count = 0 正好除尽 无余数 进入if
                last = total - count;   // last = 30 - 10   最后一页第一条索引为 20
            }else{ //再举个栗子  total = 36  count =10   total % count = 6 没除尽 余数为6  进入else
                last = total - total % count ; // last = 36 - (36%10)=36-6 = 30   最后一页第一条索引为 30
            }
            //这种是特殊情况 total = 0  count =10  total % count = 0
            //last = total - count =0 -10 = -10
            // last<0  但是索引不能是负数  那就设为 0
            last = last<0 ? 0:last;
            return last; //返回尾页的第一条数据索引
        }
    }
    
    
    2.UserDao.xml mybatis映射文件
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="example.dao.UserDao">
        <select id="findUser"  resultType="User">
          SELECT * FROM user
        </select>
    
        <!-- 获取用户list 这里的  #{start} 中 start 必须要与 @Param("start") 中的 start 名字一样 否则无法传入参数   #{count}同理-->
        <select id="getlist" resultType="User">
            select * from user order by id asc limit #{start},#{count}
        </select>
        <!-- 获取用户总数 -->
        <select id="getTotal"  resultType="Integer">
          SELECT count(*) FROM user
        </select>
    </mapper>
    
    3.UserDao.java
    package example.dao;
    
    import example.pojo.User;
    import org.apache.ibatis.annotations.Mapper;
    import org.apache.ibatis.annotations.Param;
    
    import java.util.List;
    
    public interface UserDao {
         List<User> findUser();
         //获取用户list 用@Param 对mapper文件 进行多个参数的传递
         List<User> getlist(@Param("start") int start, @Param("count") int count);
         Integer getTotal();  //获取用户总数
    }
    
    
    4.UserService.java
    package example.service;
    
    import example.pojo.User;
    
    import java.util.List;
    
    public interface UserService {
        List<User> findUser();
        List<User> getlist(int start,int count); //获取用户list
        Integer getTotal(); //获取用户总数
    }
    
    
    5.UserServiceImpl.java
    package example.service.impl;
    
    import example.dao.UserDao;
    import example.pojo.User;
    import example.service.UserService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    
    import java.sql.Connection;
    import java.util.ArrayList;
    import java.util.List;
    
    @Service("userService")
    @Transactional
    public class UserServiceImpl implements UserService {
    
        @Autowired
        private UserDao userDao;
    
        @Override
        public List<User> findUser() {
            return userDao.findUser();
        }
    
        @Override
        public  List<User> getlist(int start,int count){   //获取用户list
            List<User> users = new ArrayList<>();
            users = userDao.getlist(start,count);
            return users;
        }
        @Override
        public Integer getTotal() {
            return userDao.getTotal();
        }  //获取用户总数
    }
    
    
    6.DemoController.java (比较重要的类,会实现一些逻辑处理)
    package example.controller;
    
    
    import example.pojo.User;
    import example.service.UserService;
    import example.until.Page;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.ui.ModelMap;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.servlet.ModelAndView;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    @Controller
    //@RequestMapping("/home")
    public class DemoController {
    
        @Autowired
        private UserService userService;
    
        //获取用户list
        @RequestMapping("/getlist")
        public ModelAndView getList(HttpServletRequest request, HttpServletResponse response){
            //new一个ModelAndView对象,通过addObject存储page和用户list 并利用setViewName设定跳转页面
            ModelAndView modelView = new ModelAndView();
            int start = 0;  //初始化开始数据的索引 也就是所在页面的第一行 如第一页第一行是第0条,第二页第一行是第10条 以此类推
            int count = 10; //每页显示的条目数
            try{
                start = Integer.parseInt(request.getParameter("page.start"));  //从前台获取 开始数据的索引
                count = Integer.parseInt(request.getParameter("page.count"));  //从前台获取 每页显示的条目数
            }catch (Exception e){
            }
            Page page = new Page(start,count); //将得到的值存入page对象中
            //从数据库中取值 将 start 和count 传入
            // 后台sql语句如下:
            // SELECT * FROM user LIMIT #{start}, #{和count}
            //第一个参数是开始数据的索引位置
            //第二个参数是要查询多少条数据
            //这里解释一下原理,每次从数据库中取出部分数据,可防止内存溢出
            List<User> userList = userService.getlist(page.getStart(),page.getCount());  //获取用户list
    
            // 后台sql语句如下
            // SELECT COUNT(*) FROM user
            //获取user表中用户总个数
            int total = userService.getTotal();
            page.setTotal(total);//设置page对象的总数据量
    
            //通过addObject存储page和用户list
            modelView.addObject("page", page);
            modelView.addObject("userList", userList);
            //利用setViewName设定跳转页面
            modelView.setViewName("pagetext");
    
            //返回ModelAndView对象 跳转
            return modelView;
        }
    
    }
    
    
    7.User.java (差点漏了这个实体类)
    package example.pojo;
    
    import java.io.Serializable;
    
    //这里我开了mybatis二级缓存 所以要实现序列化接口 Serializable
    public class User implements Serializable {
        private static final long serialVersionUID = -5809782578272943999L;
    
        private Integer id;
        private String username;
        private String password;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    }
    
    
    8.pagetext.jsp (重要的测试分页效果的页面)
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Bootstrap 实例 - 默认的分页</title>
        <!--先引入需要的jQuery 和 Bootstrap 文件以及相关插件 这里我直接引用网上的核心库 记得联网-->
        <link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css">
        <script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
        <script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
        <script src="https://code.jquery.com/jquery.js"></script>
    </head>
    <body>
        <script>
            //禁用功能
            $(function () {
                $("ul.pagination li.disabled a").click(function () {
                    return false;
                })
            });
        </script>
    
        <%-- 用来放用户信息的table 暂时只显示用户信息 编辑和删除功能我就先注掉了 --%>
        <div class="listDIV">
            <table class="table table-striped table-bordered table-hover table-condensed">
                <caption>用户列表 - 共${page.total}人</caption>  <%-- 这个page就是之前通过addObject存储的page 通过el表达式直接获取 --%>
                <thead>
                <tr class="success">
                    <th>id</th>
                    <th>username</th>
                    <th>password</th>
                    <%--<th>编辑</th>
                    <th>删除</th>--%>
                </tr>
                </thead>
    
                <tbody>
                <%-- items:要被循环的信息 var:代表当前条目的变量名称  varStatus:代表循环状态的变量名称 --%>
                <%-- 如果像我这种菜鸟一样对 varStatus 不了解 参考:https://blog.csdn.net/hu_xuefeng/article/details/51494250  --%>
                <c:forEach items="${userList}" var="s" varStatus="status">
                    <tr>
                        <td>${s.id}</td>
                        <td>${s.username}</td>
                        <td>${s.password}</td>
                       <%-- <td><a href="/editStudent?id=${s.id}"><span class="glyphicon glyphicon-edit"></span> </a></td>
                        <td><a href="/deleteStudent?id=${s.id}"><span class="glyphicon glyphicon-trash"></span> </a></td>--%>
                    </tr>
                </c:forEach>
    
                </tbody>
            </table>
        </div>
    
        <!-- 分页标签 -->
        <nav class="pageDIV">
            <ul class="pagination">
                <%--跳到首页 这里做了判断 如果没有前一页 那么 跳到首页的这个标签是不可点击的 class="disabled" --%>
                <li <c:if test="${!page.hasPreviouse}">class="disabled"</c:if> >
                    <a href="?page.start=0">   <%-- 首页的开始数据的索引为0 点击后会发现地址栏变为 http://localhost:8080/DemoMVC/getlist?page.start=0  是作为参数显式传递的 --%>
                        <span> << </span>
                    </a>
                </li>
                <%--跳到前一页 同样做了判断 如果没有前一页 则不可点击前跳 class="disabled" --%>
                <li <c:if test="${!page.hasPreviouse}">class="disabled"</c:if> >
                    <a href="?page.start=${page.start-page.count}"> <%--当前页面数据索引 - 每页显示条数 = 上一页的第一条数据索引 --%>
                        <span> < </span>
                    </a>
                </li>
                <%--中间的分页  显示各页号--%>
                <%-- begin:开始的元素 end:最后一个元素 varStatus:代表循环状态的变量名称 --%>
                <%-- 比如我一共39条元素 共4页 第一页记为0 最后一页 4-1 =3  --%>
                <c:forEach begin="0" end="${page.totalPage-1}" varStatus="status">
                    <%-- 这部分解释下
                         status.count:从1开始计数  1 2 3 4 ....39
                         status.index:从0开始计数  0 1 2 3 ....38
                         page.count:   每页数量
                          -10 <= status.count*page.count-page.start<= 30
                         显示当前页码的前两个和后两个就可,例如当前页码为3的时候,就显示 1 2 3(当前页) 4 5 的页码
                         这里不理解没关系 一会儿会有图解
                     --%>
                    <c:if test="${status.count*page.count-page.start<=30 && status.count*page.count-page.start>=-10}">
                        <%-- status.index*page.count==page.start 判断是否是目前的这一页
                             举例:status.index = 2  page.count = 10
                                   第一页 0  第二页 10  第三页 20   (数字指每页第一行的索引)
                                   如果现在在第三页 那么 2 * 10 = 20  条件成立
                                   class="disabled"  此页数的标签不可点击
                                   class="current"   此页数的标签颜色显示为灰色表示目前位置停留在此页 --%>
                          <li <c:if test="${status.index*page.count==page.start}">class="disabled"</c:if>>
                              <a href="?page.start=${status.index*page.count}"
                               <c:if test="${status.index*page.count==page.start}">class="current"</c:if>
                              >${status.count}</a>
                          </li>
                      </c:if>
                  </c:forEach>
                  <%--跳到下一页 同样做了判断 如果没有下一页 则不可点击后跳 class="disabled" --%>
                  <li <c:if test="${!page.hasNext}">class="disabled"</c:if>>
                      <a href="?page.start=${page.start+page.count}">
                          <span> > </span>
                      </a>
                  </li>
                  <%--跳到尾页 如果没有后一页 那么 跳到尾页的这个标签是不可点击的 class="disabled" --%>
                  <li <c:if test="${!page.hasNext}">class="disabled"</c:if>>
                      <a href="?page.start=${page.last}">
                          <span> >> </span>
                      </a>
                  </li>
              </ul>
          </nav>
      </body>
      </html>
    
    

    关于jsp页面的部分代码解析

    <c:forEach begin="0" end="${page.totalPage-1}" varStatus="status">
                    <%-- 这部分解释下
                         status.count:从1开始计数  1 2 3 4 ....39
                         status.index:从0开始计数  0 1 2 3 ....38
                         page.count:   每页数量
                          -10 <= status.count*page.count-page.start<= 30
                         显示当前页码的前两个和后两个就可,例如当前页码为3的时候,就显示 1 2 3(当前页) 4 5 的页码
                         这里不理解没关系 请看图解
                     --%>
                    <c:if test="${status.count*page.count-page.start<=30 && status.count*page.count-page.start>=-10}">     
                          <li <c:if test="${status.index*page.count==page.start}">class="disabled"</c:if>>
                              <a href="?page.start=${status.index*page.count}"
                               <c:if test="${status.index*page.count==page.start}">class="current"</c:if>
                              >${status.count}</a>
                          </li>
                      </c:if>
                  </c:forEach>
    
    • 理解测试条件:
      -10 <= 当前页*每一页显示的数目 - 当前页开始的数据编号 <= 30

    • 图解:
      在这里插入图片描述

    • 理解了吧,假设当前页面是第三页

      • 那么它左边要显示前两页 判断条件就是
        status.count*page.count-page.start>=-10
      • 同理它右边要显示后两页 判断条件就是
        status.count*page.count-page.start<=30

    效果

    很好主要文件都在上面了 ,让我们来看看最后的效果(请注意看地址栏的变化)
    1.这是首次输入地址后的界面,看地址栏的地址(有点丑,请不要在意)
    在这里插入图片描述
    2.点击第二页,再看地址栏的地址
    在这里插入图片描述
    3.其他效果请自行实践查看 (●’◡’●)

    github地址

    https://github.com/chenzifeng123/DemoMVC
    全部代码都在里面,记得改 db.properties 文件里面 的数据库url 用户名和密码

    感谢

    第二次写博客了,上回写还是因为老师强制要求。原本以为自己已经掌握了,但是在写博客的过程中发现有好多细节之前都没理清楚,所以写博客也是梳理知识,复习巩固的过程。
    文中的代码大部分都来自一位博客园的大佬,我只是对它进行修改以适用于自己的环境并加上了大量注释,下面附上这位大佬的原文链接,非常感谢他,让我学到了不少东西。
    最后感谢大家的阅读!
    ps:
    大佬的博客园链接,他的很多文章都很不错哦
    大佬的原文链接

    展开全文
  • vue分页功能实现

    千次阅读 2020-10-09 18:50:08
    今天有人问我怎么用vue实现分页功能,我开始觉得这不是后端的事吗?怎么我们前端也要干了,而且现在怎么多UI库,比如Element-ui,我觉得这是个很好的前端UI库啊。不过既然有人问了,我就写写吧。 这是我的HTML代码 ...
    	今天有人问我怎么用vue实现分页功能,我开始觉得这不是后端的事吗?怎么我们前端也要干了,而且现在怎么多UI库,比如Element-ui,我觉得这是个很好的前端UI库啊。不过既然有人问了,我就写写吧。
    

    这是我的HTML代码

    <template>
      <ul>
        <!--上一页按钮-->
        <li><button class="el-icon-arrow-left" @click="getPageGo(-1)" :disabled="isActive"></button></li>
        <!--页码数按钮-->
        <li v-for="(item, index) in total" :key="index"><button @click="getPage(index)":class="index==queryInfo.pagenum-1 ? 'active':''">{{index+1}}</button></li>
        <!--下一页按钮-->
        <li><button class="el-icon-arrow-right" :disabled="isEnd" @click="getPageGo(1)"></button></li>
    
      </ul>
    </template>
    

    css样式是这样的:

    ul{
      height: 50px;
    }
      li{
        list-style-type: none;
        font-size: 10px;
        float: left;
        width: 40px;
      }
      .active{
        color: #fff;
        background-color: #2959df;
      }
    
    	具体效果图为这样:
    

    在这里插入图片描述 下面就是我的JS代码了,我设置当页码数为一时,上一页按钮被禁用,页数达到最后一页是,下一页按钮被禁用。具体代码如下所示:

    <script>
      //封装axios函数
      import {request} from "../../request";
    
      export default {
        name: "page",
        data(){
          return {
            //页面渲染数据
            cateList:[],
            total:0,
            //前端请求参数
            queryInfo: {
              query: '3',
              //访问第几页的页码数
              pagenum: 1,
              //页面展示的数据条数
              pagesize: 5
            }
          }
        },
        mounted() {
          let queryInfo = this.queryInfo
          this.getPageList(queryInfo)
        },
        methods:{
          //点击页码数按钮进行页面跳转
          getPage(index){
            this.queryInfo.pagenum = index+1
            let queryInfo = this.queryInfo
            this.getPageList(queryInfo)
          },
          //根据请求数据与后台交互
          getPageList(queryInfo){
            console.log(queryInfo.pagenum)
            request({url:'categories',params:queryInfo,method:'get'}).then(res=>{
              this.cateList = res.data
              this.total = res.data.total / this.queryInfo.pagesize
              console.log(res)
            }).catch(error=>{
              console.log(error)
            })
          },
          //点击上一页和下一页
          getPageGo(index){
            this.queryInfo.pagenum = this.queryInfo.pagenum + index
            let queryInfo = this.queryInfo
            this.getPageList(queryInfo)
          }
        },
        computed:{
          //当页码数到第一页时,上一页按钮禁用
          isActive(){
            if(this.queryInfo.pagenum > 1){
              return  false
            }else {
              return  true
            }
          },
          //当页码数到最后一页时,下一页按钮禁用
          isEnd(){
            if(this.queryInfo.pagenum === Math.ceil(this.total)){
              return  true
            }else {
              return  false
            }
          }
        }
      }
    
    
    展开全文
  • SpringBoot+MyBatisPlus的分页功能实现

    千次阅读 2022-03-03 21:43:45
    所以大多数网站都有分页功能。 那么它是如何实现的呢? 步骤1. 先编写一个配置类,如MPConfig.class(代表MyBatisPlus配置,即实现MyBatisPlus的拦截器功能), 看实际代码:用@Configuration注解MPConfig....
  • 公共分页功能实现

    2015-03-27 13:32:26
    公共分页功能实现! 连接了oracle数据库和两个表,大家改一下数据库连接创建相应的表就可以用。
  • MyBatis分页功能实现

    2015-07-30 16:56:10
    一个集成spring的MyBatis的分页功能实现的例子
  • Mybatisplus分页功能实现

    千次阅读 2022-04-06 19:01:34
    2.编写MybatisplusConfig类,配置分页拦截器 3.使用Page,QueryWrapper类进行数据的分页获取 在这一部分的代码中,map的数据结构可以根据需要进行替换,主要是先new一个page对象表示获取的一页内容的页码是...
  • FastAPI分页功能实现

    千次阅读 2021-11-03 18:55:21
    分页功能实现 一、站在巨人的肩膀上(fastapi-pagination) GitHub:https://github.com/uriyyo/fastapi-pagination 文档:https://uriyyo-fastapi-pagination.netlify.app/ 二、安装fastapi-pagination pip install...
  • 利用SSM框架实现分页
  • 实现分页功能page.php

    2014-08-16 16:52:36
    实现分页功能实现首页,下一页,上一页,末页的功能
  • EasyUI easyui-datagrid分页功能实现

    千次阅读 2017-03-30 17:14:55
    easyui-datagrid的综合实现 可用于直接绑定一个datatable进行显示数据

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 209,389
精华内容 83,755
关键字:

分页功能怎么实现

友情链接: html5_music.zip