实现分页展示

2023-10-31

当数据量较多时,用户需要拖动页面才可以浏览更多消息

分页显示的步骤(思路)

  1. 确定每页显示的数据量
  2. 确定分页显示所需的总页面
  3. 编写SQL查询语句,实现数据查询
  4. 在JSP页面中进行分页显示设置

一:计算显示总页数:

(1)select  count(1)from 表名     

                效率高于

(2)select count(*)from 表名

第一种方式:直接获取查询的数字

第二种方式:首先遍历表,再把数据替换成*  在查询有多少条数据

二:根据每页显示记录数计算出总页数:

totalPageCount=(this.totalCount%pageSize==0)?(this.totalCount/pageSize):((this.totalCount/pageSize)+1);

三:使用LIMIT子句(分页SQL):

LIMIT 0 , 3

0::起始下标=(当前页页码-1)*每页显示的条数

3::每页显示的数量

代码实现:

代码编写步骤及思路

1.导入jar包
2.创建util包 BaseDao
3.创建实体类pojo
4.在util包中创建一个工具类 page
    当前页  currentPage
    页面容量 pageSize
    数据总数(sql查询)totalCount
    总页数 totalCountPageCount  (totalCount和pageSize计算出来)
    每页数据对象集合 List<User>
5.数据访问层(dao层)
    (1)获取数据总量(返回值int)
    (2)获取每页数据对象集合(List<User> 参数:当前页,页面容量)
    《开始下标=(当前页-1)*页面容量)》
6.业务逻辑层(service)
    组装page工具类
    赋值
7.servlet
    调用业务逻辑层,向页面传递参数  page对象和每次的List集合
8.jsp
        编写页面 接收servlet传入的参数
        循环遍历集合
        根据当前页数判断执行不同的页面结果
        超链接进入servlet同时传入当前的当前页数

、代码实现:

在util包中创建一个工具类 page:

package com.bdqn.util;
import com.bdqn.pojo.User;
import java.util.List;
//分页工具类
public class UserPage {
    //当前页数(从前台传入)
    private  int currentPage;
    //页面容量(3)
    private int pageSize;
    //数据总数(sql查询)
    private  int totalCount;
    //总页数(计算 :数据总数/页面容量 )
    private int totalPageCount;
    //当前展示的数据集合(sql查询)
    private List<User> userList;
    public int getCurrentPage() {
        return currentPage;
    }
    public void setCurrentPage(int currentPage) {
        this.currentPage = currentPage;
    }
    public int getPageSize() {
        return pageSize;
    }
    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }
    public int getTotalCount() {
        return totalCount;
    }
    public void setTotalCount(int totalCount) {
        this.totalCount = totalCount;
        if(this.totalCount%this.pageSize==0){
            //总页数=数据总数/页面容量
            this.totalPageCount=this.totalCount/this.pageSize;
        }else{
            this.totalPageCount=this.totalCount/this.pageSize+1;
        }
    }
    public int getTotalPageCount() {
        return totalPageCount;
    }
    public void setTotalPageCount(int totalPageCount) {
        this.totalPageCount = totalPageCount;
    }
    public List<User> getUserList() {
        return userList;
    }
    public void setUserList(List<User> userList) {
        this.userList = userList;
    }
}

5.数据访问层(dao层):

public interface UserDao {
    //查询数据总量
    int getUserCount();
    //查询当前页面的数据
    List<User> getUserList(int currentPage,int pageSize);
}

5.1:dao 实现类impl:

public class UserDaoImpl extends BaseDao implements UserDao {
    @Override
    public int getUserCount() {
        String sql="SELECT COUNT(1) as c FROM USER";
        ResultSet rs = this.executeQuery(sql, null);
        int count=0;
        try {
            if(rs.next()){
                count=rs.getInt("c");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return count;
    }

    @Override
    public List<User> getUserList(int currentPage, int pageSize) {
        String sql="SELECT * FROM USER AS u,usertype AS t WHERE u.typeId=t.typeId  LIMIT ?,?";
        Object [] objects={currentPage*pageSize,pageSize};
        ResultSet rs = this.executeQuery(sql, objects);
        List<User> userList=new ArrayList<>();
        try {
            while(rs.next()){
                    User user=new User();
                    UserType ut=new UserType();//创建类型对象
                    user.setId(rs.getInt("id"));
                    user.setUserName(rs.getString("userName"));
                    user.setUserPwd(rs.getString("userPwd"));
                    user.setAddress(rs.getString("address"));
                    ut.setTypeName(rs.getString("typeName"));//给类型对象赋值
                    user.setUserType(ut);//给用户对象的类型赋值
                    userList.add(user);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return userList;
    }
}

我们这次进行链表查 两个表:

5.1.1:第一个表的实体类:

public class User {
    private int id;
    private String userName;
    private  String userPwd;
    private  String address;
    private  int typeId;
    //添加类型
    private UserType userType;
//-------------添加get/set方法---------------//
}

5.1.2:第二个表的实体类:

public class UserType {
    private int typeId;
    private  String typeName;
//----------添加get/set方法-------------//
}

6.业务逻辑层(service):

public interface UserService {
    //组装page工具类
    UserPage getUsers(int currentPage,int pageSize);
}

6.1:service的实现类impl:

public class UserServiceImpl implements UserService {
    //创建数据访问层
    UserDao ud=new UserDaoImpl();
    @Override
    public UserPage getUsers(int currentPage, int pageSize) {
        UserPage up=new UserPage();
        up.setPageSize(pageSize);
        up.setTotalCount(ud.getUserCount());
        up.setCurrentPage(currentPage);
        up.setUserList(ud.getUserList(currentPage,pageSize));
        return up;
    }
}

 7.servlet:

@WebServlet("/UserServlet")
public class UserServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        UserService us=new UserServiceImpl();
        req.setCharacterEncoding("utf-8");
        HttpSession session=req.getSession();
        //从前台传入一个当前页数
        String curr = req.getParameter("curr");
        //如果是第一次,从第一条开始查询
        if(curr==null){
            curr="0";
        }
        int currentPage = Integer.valueOf(curr);
        UserPage up = us.getUsers(currentPage, 3);
        List<User> userList = up.getUserList();
        session.setAttribute("up",up);
        session.setAttribute("uList",userList);
        resp.sendRedirect("index.jsp");
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req,resp);
    }
}

8.jsp:

<body>
  <%
   UserPage up=(UserPage)session.getAttribute("up");
    List<User> userList=(List<User>)session.getAttribute("uList");
  %>
    <table align="center" border="1px">
      <tr>
        <td>编号</td>
        <td>姓名</td>
        <td>密码</td>
        <td>地址</td>
        <td>身份</td>
      </tr>
      <%
        for (User user:userList){
          %>
      <tr>
        <td><%=user.getId()%>
        </td>
        <td><%=user.getUserName()%>
        </td>
        <td><%=user.getUserPwd()%>
        </td>
        <td><%=user.getAddress()%>
        </td>
        <td><%=user.getUserType().getTypeName()%></td>
      </tr>
      <%
        }
      %>
      <tr>
        <td colspan="5">
          <%
            if(up.getCurrentPage()==0){
              %>
          <a href="UserServlet?curr=<%=up.getCurrentPage()+1%>">下一页</a>
          <a href="UserServlet?curr=<%=up.getTotalPageCount()-1%>">尾页</a>
          <%
            }else if(up.getCurrentPage()>0 && up.getCurrentPage()+1!=up.getTotalPageCount()){
              %>
          <a href="UserServlet?curr=0">首页</a>
          <a href="UserServlet?curr=<%=up.getCurrentPage()-1%>">上一页</a>
          <a href="UserServlet?curr=<%=up.getCurrentPage()+1%>">下一页</a>
          <a href="UserServlet?curr=<%=up.getTotalPageCount()-1%>">尾页</a>
          <%
            }else if(up.getCurrentPage()+1==up.getTotalPageCount()){
              %>
          <a href="UserServlet?curr=0">首页</a>
          <a href="UserServlet?curr=<%=up.getCurrentPage()-1%>">上一页</a>
          <%
            }
          %>
        </td>
      </tr>
    </table>

  </body>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实现分页展示 的相关文章

  • 通过 SQLAlchemy 获取随机行

    如何使用 SQLAlchemy 从表中选择一个或多个随机行 这在很大程度上是一个特定于数据库的问题 我知道 PostgreSQL SQLite MySQL 和 Oracle 具有通过随机函数排序的能力 因此您可以在 SQLAlchemy 中
  • 如何在文件系统中存储图像

    目前 我已将图像 最大 6MB 作为 BLOB 存储在 InnoDB 表中 随着数据大小的增长 夜间备份变得越来越慢 阻碍了正常性能 因此 二进制数据需要进入文件系统 指向文件的指针将保存在数据库中 数据具有树状关系 main site u
  • Magento --“SQLSTATE[23000]:违反完整性约束..”客户更新

    迁移服务器后 每次尝试更新客户信息时都会出现错误 我正在使用一个客户激活插件 http www magentocommerce com magento connect vinai extension 489 customer activat
  • SQLite (Android):使用 ORDER BY 更新查询

    Android SQLite 我想要在 myTable 中的其他行之间插入行在android中使用SQLite 为此 我尝试增加从第 3 行开始的所有行的 id 这样 我就可以在位置 3 处插入新行 myTable 的主键是列 id 表中没
  • TSQL - 生成文字浮点值

    我理解比较浮点数时遇到的许多问题 并对它们在这种情况下的使用感到遗憾 但我不是表格作者 只有一个小障碍需要克服 有人决定使用浮点数 就像您期望使用 GUID 一样 我需要检索具有特定浮点值的所有记录 sp help MyTable Colu
  • Spring Data JPA 选择不同

    我有一个情况 我需要建立一个select distinct a address from Person a 其中地址是 Person 内的地址实体 类型的查询 我正在使用规范动态构建我的 where 子句并使用findAll Specifi
  • 自动删除主键序列中的间隙

    我正在创建一个网页 该网页根据用户操作将数据存储到 MySQL 数据库中 数据库有很多行 行的主键是列 rowID 它只是按顺序对行进行编号 例如 1 2 3 4 用户可以选择删除行 问题是当用户删除最后一行以外的行时 rowID 中有一个
  • theta 连接、等值连接和自然连接之间的区别

    当涉及到 theta 连接 等值连接和自然连接时 我无法理解关系代数 有人可以帮助我更好地理解它吗 如果我在 theta 连接上使用 符号 它与使用自然连接完全相同吗 A 西塔加入允许任意比较关系 例如 An equijoin是使用相等运算
  • SQL Server 2008 错误 233

    我正在使用以下 sql 脚本在 SQL Server 2008 中创建新登录名 CREATE LOGIN xyz WITH PASSWORD xyz DEFAULT DATABASE master DEFAULT LANGUAGE us e
  • 分组和切换列和行

    我不知道这是否会被正式称为枢轴 但我想要的结果是这样的 Alex Charley Liza 213 345 1 23 111 5 42 52 2 323 5 23 1 324 5 我的输入数据采用这种形式 Apt Name
  • 数据聚合和缓存:如何按时间间隔快速绘制大型时间序列数据集的图表

    我有一个巨大的时间序列数据集 我想绘制图表 时间序列可以追溯到 5 年前 从后端的角度来看 以各种分辨率 间隔 显示这些数据的常用方法是什么 本质上我想绘制这样的数据图表 https bitcoinwisdom com markets bi
  • 包含列和行总计的 SQL 数据透视表

    我正在尝试将行和列总计添加到该数据透视表中 create table test4 city nvarchar 10 race nvarchar 30 sex nvarchar 10 age int insert into test4 val
  • 带有可变 WHERE 子句的批量 UPDATE 表

    我有一堆值对 foo1 bar1 foo2 bar2 我想做一堆更新 将 foo 列设置为 foo1 其中 bar 列为 bar1 我正在使用 psycopg2 在 Python 中执行此操作 我可以executemany与查询UPDATE
  • NVARCHAR 变量在Where 子句中不起作用

    在 SQL Server 我想是 2018 我不知道如何判断 中 我的变量不起作用WHERE的条款NVARCHAR 比较应该返回值 但它什么也没返回 如果我只是手动输入声明的文本 它会突然起作用并返回值 没有任何逻辑原因应该有任何不同 类型
  • 如何将SQL数据加载到Hortonworks中?

    我已在我的电脑中安装了 Hortonworks SandBox 还尝试使用 CSV 文件 并以表结构的方式获取它 这是可以的 Hive Hadoop nw 我想将当前的 SQL 数据库迁移到沙箱 MS SQL 2008 r2 中 我将如何做
  • SSDT SQL Server 数据库项目中用于架构比较的命令行/API?

    在 Visual Studio 2012 中 我们有Schema Compare http msdn microsoft com en us library hh272690 28v vs 103 29 aspx in SSDT http
  • AWS RDS MySql - 如何在设置“公开可用”后允许访问

    刚刚使用默认设置和用户 密码创建了新的 AWS RDS MySql 实例 我也将其设置为publicly available并在此过程中创建新的 VPC 目前无法从我的笔记本电脑连接到此 RDS mysql h endpoint u myu
  • mysql表中的数据非常大。即使 select 语句也需要很多时间

    我正在开发一个数据库 它是一个相当大的数据库 有 13 亿行和大约 35 列 这是我检查表状态后得到的结果 Name Table Name Engine InnoDB Version 10 Row format Compact Rows 1
  • 将布尔参数传递给 SQL Server 存储过程

    我早些时候问过这个问题 我以为我找到了问题所在 但我没有 我在将布尔参数传递给存储过程时遇到问题 这是我的 C 代码 public bool upload false protected void showDate object sende
  • PostgreSQL - 致命:用户“myuser”身份验证失败[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我刚刚在我的 Ubuntu Box 中安装了 PostGreSQL 我想做的第一件事就是创建一个数据库 我读了文档 http www postgres

随机推荐

  • 富士施乐2022网络扫描设置_富士施乐sc2020网络扫描怎么设置?

    1 在计算机客户端添加一个命名为SMB 命名随意 的共享文件夹 这个文件夹是用来存储局域网网络扫描的文件 使用简单的共享方式设置文件夹属性 勾选 在网络上共享这个文件夹 和 允许网络用户更改我的文件 2 在已经安装好多功能办公设备的计算机客
  • undionly.kpxe php,VLOG

    经过研究 终于可以将ESXI的系统通过IPXE网络启动安装到无盘的软路由或者PC上了 当然也可以通过这种方法安装window linux等等其他的系统 一 编译IPXE增加功能与自定义脚本 一 iPXE 概要 按iPXE 官网的介绍是这样的
  • Java提高篇(二七)-----TreeMap

    原文出自 http cmsblogs com p 1013 尊重作者的成果 转载请注明出处 个人站点 http cmsblogs com TreeMap的实现是红黑树算法的实现 所以要了解TreeMap就必须对红黑树有一定的了解 其实这篇博
  • IOS-Xcode Compile flags

    flag 功能 fno objc arc 该文件不启用ARC fo objc arc 该文件启用ARC w 去除警告
  • 【google版efficientdet】官方版efficientdet训练自己的数据集,终于训练成功了

    看全网还没有一篇攻略 本文是第一个 有心人当点赞下 有问题可以下方留言 互相交流 如转载请注明出处 不枉解决各种各样的bug 环境 v100 cuda10 1 tensorflow2 1 0 python3 7 7 只保证这个版本是可行的
  • NUC980开源项目5-安装repo

    上面是我的微信和QQ群 欢迎新朋友的加入 项目码云地址 国内下载速度快 https gitee com jun626 nuc980 open source project 项目github地址 https github com Jun117
  • Pandas 报错 TypeError: ‘Series‘ objects are mutable, thus they cannot be hashed

    一 需求 根据原始 CSV 文件的列 A 的值 添加一列 B 二 尝试 1 1 将 A 列与 B 列对应的值写入字典 dict A 列为 key B 列为 value 2 将 CSV 文件处理为 DataFrame 3 import pan
  • Python入门02:详细来了解一下Requests库

    那个叫做 Urllib 的库让我们的 python 假装是浏览器 接下来我们要来玩一个新的库 这个库的名称叫做 Requests 这个库比 urllib 可是要牛逼一丢丢的 毕竟 Requests 是在 urllib 的基础上搞出来的 通过
  • 个人笔记随记——在CSDN写随记原因,部分是为了自己复习,查看。

    在CSDN写随记原因 部分是为了自己复习 查看 部分原因是用来分享经验 大家共同进步 之前我的几个电脑里面有个自己的个人数据库 所以笔记都在那里记录 因为现在除了码字 经常不携带电脑 导致笔记不能随时观看 所以现在即在CSDN开了个人博客
  • C++前置声明用法

    前置声明的目的是避免在某个 h文件中include其他头文件 取而代之的是用class struct 声明 类的前置声明就是告诉编译器有这么一个类 它的名字是XXX 甚至不需要知道它具有哪些成员 注意 这里只是声明类 没有分配空间 实例化成
  • kubernetes结合portworx

    参考网址 https docs portworx com scheduler kubernetes install html https docs portworx com scheduler kubernetes support html
  • IDEA配置JDBC

    IDEA配置JDBC 驱动下载 MySQL 首先进入MySQL官网 进入downloads 选择页面最下方 MySQL Community GPL Downloads 选择Connector J link 选择plantform indep
  • 『网络安全』蜜罐到蜜网入门指南(二)蜜罐的起源、作用及分类

    原创不易 点个赞呗 如果喜欢 欢迎随意赞赏 前言 大家好 网络安全 蜜罐到蜜网入门指南 进入第二篇 在第一篇 我们由网络安全入手 由浅入深 引出蜜罐概念 从这一篇开始 我们将主要围绕蜜罐 honeypot 密网 honeynet 继续编写后
  • 前端生成PDF文件实现方案

    一 技术选型 1 html转换成canvas后生成图片导出pdf 本文选用 html转canvas插件 html2canvas是一款将HTML代码转换成Canvas的插件 canvas生成pdf jsPDF是一个使用Javascript语言
  • LeetCode专题:栈和队列(持续更新,已更17题)

    目录 LeetCode150 逆波兰表达式求值 问题描述 代码分析 LeetCode225 用队列实现栈 问题描述 代码分析 LeetCode232 用栈实现队列 问题描述 代码分析 O n 解法 均摊 O 1 解法 关于 均摊复杂度 的说
  • 136. Single Number

    class Solution public int singleNumber vector
  • 用border渐变色实现UI 标题头等高短竖线

    现在的UI 越来越喜欢给标题前面加上短竖线 大家通常的方法 一个是画div图形 用position 方式来定位 一个是用 伪类来给前面增加给元素 实现短竖线 今天在这里实现无dom 的第三种方式 border渐变色 废话不多说 用用到的有
  • 程序员视角m1 Macbook air使用指南和指令备忘录

    m1 Mac使用指南指令备忘录 硬件外设 外接显示器HiDpi homebrew 必备网站 软件推荐 Parallels Desktop Silicon Bob IINA iterm2远程 mysql和redis启动 OhMyZsh设置 磁
  • 1016 部分A+B (15 分)- PAT乙级真题

    题滴链接https pintia cn problem sets 994805260223102976 problems 994805306310115328 1016 部分A B 15 分 正整数 A 的 D A 为 1 位整数 部分 定
  • 实现分页展示

    当数据量较多时 用户需要拖动页面才可以浏览更多消息 分页显示的步骤 思路 确定每页显示的数据量 确定分页显示所需的总页面 编写SQL查询语句 实现数据查询 在JSP页面中进行分页显示设置 一 计算显示总页数 1 select count 1