实现分页展示

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(使用前将#替换为@)

实现分页展示 的相关文章

  • PHP PDO相关:更新SQL语句未更新数据库内容

    我正在尝试使用准备好的语句来实现更新语句PHP http en wikipedia org wiki PHP脚本 但它似乎没有更新数据库中的记录 我不确定为什么 所以如果您能分享一些见解 我将不胜感激 Code query UPDATE D
  • 使用按位函数查询 BIT 字段时,MySQL 不使用索引

    我的 MySQL 表中有一个 BIT 类型的字段 我想使用位值存储记录的状态 例如 1 status1 2 status2 4 status3 8 status4 每条记录可以同时具有多种状态 对于 status1 和 status3 该值
  • java.sql.Timestamp 到微秒精度的字符串

    我正在将时间戳列从数据库读取到 java sql Timestamp 对象中 然后我想将时间戳的值转换为 String 对象 但保持微秒精度 调用 toString 方法让我接近 但它似乎在微秒内丢失了尾随零 如果时间戳以非零数字结尾 则一
  • 通过 Matlab 访问 Physionet 的 ptbdb 中的数据库

    我首先设置系统 old path which rdsamp if isempty old path rmpath old path 1 end 8 end wfdb url http physionet org physiotools ma
  • 从表中删除孤儿

    我正在尝试清理一张有很多孤立项目的桌子 我通过查找空值来检查是否与另一个表存在关系来解决此问题 DELETE FROM table1 LEFT JOIN table2 ON table1 ID table2 ID WHERE table2
  • 如何在 Delphi DBLookupComboBox 中选择正确的项目

    我有一个数据库查找组合框连接到数据库查询 那部分工作正常 当我运行程序时数据库查找组合框填充有查询的结果 我想看看数据库查找组合框填充第一项 请选择 当 的时候程序第一次运行或者当一个新项目行动已启动 见下图 另外 如果我正在加载以前保存的
  • 插入多行并返回主键时 Sqlalchemy 的奇怪行为

    插入多行并返回主键时 我注意到一些奇怪的事情 如果我在 isert 查询中添加使用参数值 我会得到预期的行为 但是当将值传递给游标时 不会返回任何内容 这可能是一个错误还是我误解了什么 我的sqlachemy版本是0 9 4 下面如何重现错
  • 限制 SQL Server 连接到特定 IP 地址

    我想将 SQL Server 实例的连接限制为特定 IP 地址 我想阻止来自除特定列表之外的任何 IP 地址的任何连接 这是可以在 SQL Server 实例或数据库中配置的东西吗 听起来像是你会使用Windows防火墙 http tech
  • 如何在 sqlalchemy 中创建基于文字的查询?

    我创建了一个函数来创建表达式 def test operator1 operation operator2 return literal column operator1 op operation operator2 现在当我用 test
  • 什么是数据库池?

    我只是想了解数据库连接池的概念以及它是如何实现的 数据库联系池是一种用于保持数据库连接打开的方法 以便其他人可以重用它们 通常 打开数据库连接是一项昂贵的操作 尤其是在数据库位于远程的情况下 您必须打开网络会话 进行身份验证 检查授权等等
  • Scrapy - 持续从数据库中获取要爬取的url

    我想不断地从数据库中获取要爬行的网址 到目前为止 我成功地从基地获取了 url 但我希望我的蜘蛛继续从该基地读取 因为该表将由另一个线程填充 我有一个管道 一旦爬行 工作 就会从表中删除 url 换句话说 我想使用我的数据库作为队列 我尝试
  • 如何在Oracle中使用Timestamp_to_scn和Scn_to_timestamp?

    我的查询结果是这样的 select cast to date a start time mm dd yyyy hh mi ss pm as timestamp date of call ora rowscn from calling tab
  • 如何使用PostGIS将多边形数据转换为线段

    我在 PostgreSQL PostGIS 中有一个多边形数据表 现在我需要将此多边形数据转换为其相应的线段 谁能告诉我如何使用 PostGIS 查询进行转换 提前致谢 一般来说 将多边形转换为线可能并不简单 因为没有一对一的映射 http
  • 更改迁移中的自动​​增量值(PostgreSQL 和 SQLite3)

    我有一个托管在 Heroku 上的项目 想要更改表的自动增量起始值 我在本地使用 SQLite3 Heroku 使用 PostgreSQL 这是我在迁移中所拥有的 class CreateMytable lt ActiveRecord Mi
  • Oracle:使用SQL或PL/SQL查找动态SQL中的错误位置

    如何在 PL SQL 或 SQL 中找到动态 SQL 语句中的错误位置 从 SQL Plus 中 我看到了错误的位置 例如 无效的 SQL DML 语句 SYS orcl gt SELECT 2 X 3 FROM 4 TABLEX 5 TA
  • 如何在 PostgreSQL 中使用具有多个值的 SQL LIKE 条件?

    有没有更短的方法来查找多个匹配项 SELECT from table WHERE column LIKE AAA OR column LIKE BBB OR column LIKE CCC 这个问题适用于 PostgreSQL 9 1 但如
  • 是否有适用于所有数据库的标准sql

    如下所示 不同数据库的语法有所不同 是否存在适用于所有数据库的标准方法 有没有什么工具可以将任意sql转换为任意sql SQL Server 2005 CREATE TABLE Table01 Field01 int primary key
  • 使用 where 进行 select 语句时,HSQLDB 用户缺乏权限或未找到对象错误

    我的数据库使用 SQuirrel SQL 客户端版本 3 5 3 和 HSQLDB 我已经能够为其指定相应的驱动程序 内存中 并创建一个别名 我创建了一个表 CREATE TABLE ENTRY NAME VARCHAR 100 NOT N
  • 如何从 PostgreSQL 中的时间戳列值提取一天中的时间(或小时)?

    我正在尝试从 PostgreSQL 中的 时间戳 列中提取一天中的时间 这是我的做法 但是 太糟糕了 知道如何做得更好吗 SELECT date part hour date demande text hours date part min
  • 将第三个表链接到多对多关联中的桥接表

    设计这个数据库的正确方法是什么 这是我设置表格的方式 我在名为 教师 的表和名为 仪器 的表之间存在多对多关系 然后我有一个连接两者的桥接表 我想将另一个表与 BRIDGE 表关联起来 意思是乐器 老师的组合 该表有 3 行 指定老师可以教

随机推荐

  • 富士施乐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