JavaWeb12(实现基础分页模糊查询的分页)

news2024/11/26 2:32:47

目录

一. 效果预览

​编辑 二. 实现基本分页

2.1 分页sql

 --每页3条  取第二页

--由于伪列不能作用与大于符号也不能作用于between....and

--因此需要将伪列----->名列

 2.2 万能公式

 2.3 首页&上一页&下一页实现

②前端代码

2.4 末页实现&优化

①底层代码

②前端优化

 三.实现模糊查询(下拉框)的分页

3.1 确定sql语句

--查询简介中含有'商'的商品 每页2条  取第二页

--查询简介中含有'你'的商品 每页3条  取第二页

3.2 代码实现

①底层代码

         模糊查询的分页         

②前端优化

        拿到模糊查询分页后的商品集合


一. 效果预览


 


 


 二. 实现基本分页

2.1 分页sql

 --每页3条  取第二页

--由于伪列不能作用与大于符号也不能作用于between....and

--因此需要将伪列----->名列

select * from(
       select a.*,rownum as rid from tb_goods a where gname like '%商%'
) b where b.rid between 5 and 8

 2.2 万能公式

/*

*如果每页3条即pageSize=3

*当pageIndex=1:1-3

*当pageIndex=2:4-6

*当pageIndex=3:7-9

*

*如果每页5条即pageSize=5

*当pageIndex=1:1-5

*当pageIndex=2:6-10

*当pageIndex=3:11-15

*/

(pageIndex-1)*pageSize+1-------(pageIndex*pageSize)

 2.3 首页&上一页&下一页实现

①底层代码

    /**
         * 模糊查询的分页
         * @param pageIndex 设置第几页
         * @param pageSize  每页多少条数据
         * @param str 关键字
         * @param colName 列名
         * @return 商品集合
         */

        public List<Goods> page(int pageIndex,int pageSize,String str,String colName){
            List<Goods> ls = new ArrayList<>();
            try {
                con=DBHelper.getCon();
                String sql="select * from(\r\n" + 
                        "       select a.*,rownum as rid from tb_goods a where "+colName+" like '%"+str+"%' order by gid desc \r\n" + 
                        ")b where b.rid between ? and ?";
                ps=con.prepareStatement(sql);
                //给占位符赋值
                ps.setInt(1, (pageIndex-1)*pageSize+1);
                ps.setInt(2, (pageIndex*pageSize));
                //System.out.println("SQL:"+sql); 打印出来为null 在前端要判断 goodsServlet
                rs=ps.executeQuery();
                while(rs.next()) {
                    Goods g = new Goods();
                    g.setGid(rs.getInt(1));
                    g.setGname(rs.getString(2));
                    g.setGprice(rs.getDouble(3));
                    g.setGinfo(rs.getString(4));
                    g.setGtime(rs.getString(5));
                    g.setGpath(rs.getString(6));
                    g.setGxl(rs.getInt(7));
                    g.setTid(rs.getInt(8));
                    ls.add(g);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                DBHelper.myClose(con, ps, rs);
            }
            return ls;
            
        }

    
        int pageIndex=1;//当前页 第几页
        int pageSize=3;//每页多少条数据
        
        //接收参数
        String pid = req.getParameter("pid");
        
        if(pid!=null) {//说明点了"首页"/"上一页"/"下一页"/"末页"

            //改变页码
            pageIndex=Integer.parseInt(pid);
        }
       
       //拿到集合
      
 List<Goods> ls = igd.page(pageIndex, pageSize);

        //把当前页码存起来

        req.setAttribute("pageIndex,"pageIndex)

        
    } 

②前端代码

<!-- 分页 -->
        <nav aria-label="Page navigation example">
         <ul class="pagination justify-content-center pagination-lg">
        <li class="page-item" ><a class="page-link" href="goods.do?pid=1">首页</a></li>
          <li class="page-item " id="prev"><a class="page-link" href="goods.do?pid=$goods.do?pid=${pageIndex-1}">上一页</a></li>
          <li class="page-item "><a class="page-link text-info"><span id="ys"></span>/<span id="max"></span></a></li>
          <li class="page-item " id="next"><a class="page-link" href="goods.do?pid=1"${pageIndex+1}>下一页</a></li>
          <li class="page-item"><a class="page-link" href="goods.do?pid=${max}">末页</a></li>
  </ul>
</nav>

2.4 末页实现&优化

①底层代码

/**
         * 获取总行数
         * @param str 表名等
         * @return 总行数
         */

        public int getRows(String str) {
            int n = 0;
            try {
                con=DBHelper.getCon();
                String sql="select count(*) from "+str;
                ps=con.prepareStatement(sql);
                rs=ps.executeQuery();
                if(rs.next()) {
                    n=rs.getInt(1);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                DBHelper.myClose(con, ps, rs);
            }
            return n;
        }

---【在业务逻辑层biz做处理】---

/*

*拿到最大页码

*@param tabName 表名等
* @param pageSize 每页多少条数据

*@return 最大页码

*/

public int getMax(String str,int pageSize) {
            //拿到总行数
            int rows = igd.getRows(str);
            //计算总页数
            int max = rows/pageSize;//10/3=3
            if(rows%pageSize!=0) {//除不尽
                max++;//多加一页
            }
            return max;
        }

 //拿到最大页码

 int max = igd.getMax("tb_goods ",pageSize)

//把最大页码存起来

req.setAttribute("max", max);

②前端优化

 三.实现模糊查询(下拉框)的分页

3.1 确定sql语句

--查询简介中含有'商'的商品 每页2条  取第二页

select * from(
       select a.*,rownum as rid from tb_goods a where gname like '%商%'
) b where b.rid between 5 and 8

--查询简介中含有'你'的商品 每页3条  取第二页
select * from(
       select a.*,rownum as rid from tb_goods a where gname like '%你%'
) b where b.rid between 1 and 3

3.2 代码实现

①底层代码

/**
         * 模糊查询的分页
         * @param pageIndex 设置第几页
         * @param pageSize  每页多少条数据
         * @param str 关键字
         * @param colName 列名
         * @return 商品集合
         */

        public List<Goods> page(int pageIndex,int pageSize,String str,String colName){
            List<Goods> ls = new ArrayList<>();
            try {
                con=DBHelper.getCon();
                String sql="select * from(\r\n" + 
                        "       select a.*,rownum as rid from tb_goods a where "+colName+" like '%"+str+"%' order by gid desc \r\n" + 
                        ")b where b.rid between ? and ?";
                ps=con.prepareStatement(sql);
                //给占位符赋值
                ps.setInt(1, (pageIndex-1)*pageSize+1);
                ps.setInt(2, (pageIndex*pageSize));
                //System.out.println("SQL:"+sql); 打印出来为null 在前端要判断 goodsServlet
                rs=ps.executeQuery();
                while(rs.next()) {
                    Goods g = new Goods();
                    g.setGid(rs.getInt(1));
                    g.setGname(rs.getString(2));
                    g.setGprice(rs.getDouble(3));
                    g.setGinfo(rs.getString(4));
                    g.setGtime(rs.getString(5));
                    g.setGpath(rs.getString(6));
                    g.setGxl(rs.getInt(7));
                    g.setTid(rs.getInt(8));
                    ls.add(g);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                DBHelper.myClose(con, ps, rs);
            }
            return ls;
            
        }

②前端优化

//拿到模糊查询分页后的商品集合
 List<Goods> ls = igd.page(pageIndex, pageSize, str, xl);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/585987.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

目标检测复盘 -- 6. YOLOv4

Backbone YOLOv4的骨干是CSPDarknet53 CSP结构的作用&#xff1a;1. 增强CNN的学习能力 2. 移出计算瓶颈 3. 减少内存开销 CSP首先将输入的特征层分成两个部分&#xff0c;这里以densenet为例&#xff0c;part2分支经过denseblock后&#xff0c;进过一个transition&#xff0c…

Redis之高可用方案浅析

在工程项目中&#xff0c;系统应用的高可用性越来越重要&#xff0c;业主越来越重视。其实高可用可以分为应用层高可用和数据层高可用&#xff0c;数据层高可用中常见的有关系型数据库mysql的高可用、非关系型NoSQl数据库redis的高可用等&#xff0c;下面聊聊典型的NoSQL数据库…

C# 事件和委托的区别并说明

1.区别 事件是基于委托的&#xff0c;为委托提供了一个发布/订阅机制。可以说事件是一种特殊的委托&#xff0c;他的调用和委托是一样的。 事件的声明 public event 委托类型 事件名称 通常事件的命名以事件名称Event来命名。如public event delegate NotifyEvent; 事件和委…

C++ Primer Plus 第二章习题

目录 复习题 1.C程序的模块叫什么&#xff1f; 2.#include 预处理器编译指令的用处&#xff1f; 3.using namespace std; 该语句是干什么用的&#xff1f; 4.什么语句可以打印一个语句"hello,world"&#xff0c;然后重新换行&#xff1f; 5.什么语句可以用来创…

桂院校园导航 导入 与 配置教程

将 静态项目/云开发项目 文件夹下最新版本的 文件夹下的 项目 的整个文件夹 复制到项目路径下&#xff08;比如 D:\WeChatProjects&#xff09;&#xff0c;强烈建议不要直接扔在桌面上 云开发项目 需开通 云开发 功能&#xff08;首月免费&#xff0c;次月19.9&#xff09;&am…

【论文阅读笔记】CRFL: Certifiably Robust Federated Learning against Backdoor Attacks

个人阅读笔记&#xff0c;如有错误欢迎指出! 会议&#xff1a;PMLR 2021[2106.08283] CRFL: Certifiably Robust Federated Learning against Backdoor Attacks (arxiv.org) 问题&#xff1a; 现有的防御算法缺乏健壮性 创新&#xff1a; 证明了所提出框架得稳定性 通过马尔…

Generative AI 新世界 | 走进文生图(Text-to-Image)领域

在之前的四篇 “Generative AI 新世界” 中&#xff0c;我们带领大家一起探索了生成式 AI&#xff08;Generative AI&#xff09;&#xff0c;以及大型语言模型&#xff08;LLMs&#xff09;的全新世界概览。并在文本生成&#xff08;Text Generation&#xff09;领域做了一些概…

javascript基础十:说说你对Javascript中this对象的理解

一、定义 函数的 this 关键字在 JavaScript 中的表现略有不同&#xff0c;此外&#xff0c;在严格模式和非严格模式之间也会有一些差别 在绝大多数情况下&#xff0c;函数的调用方式决定了 this 的值&#xff08;运行时绑定&#xff09; this 关键字是函数运行时自动生成的一…

进程控制与进程调度 —— 时间片轮转调度算法(C++版)

目录 实验一 进程控制与进程调度 一、实验目的 二、实验内容 三、数据结构及符号说明 四、运行环境说明 五、代码段 六、 效果展示 实验一 进程控制与进程调度 备注&#xff1a;大二&#xff08;下&#xff09;操作系统实验一 一、实验目的 掌握进程状态的转变、…

多次调用java.awt.Toolkit.getDefaultToolkit方法获得是同一个单例的Toolkit

多次调用java.awt.Toolkit.getDefaultToolkit方法获得是同一个单例的Toolkit java.awt.Toolkit.getDefaultToolkit()import java.awt.Toolkit;public class 多次调用Toolkit的getDefaultToolkit方法获得是同一个单例的Toolkit {static public void main (String...arguments)t…

WMS:系统窗口添加过程

WMS:系统窗口添加过程 1、经常使用的两大类窗口2、系统窗口StatusBar2.1 StatusBarWindowView添加流程2.2 简要时序图 android12-release 1、经常使用的两大类窗口 Android中的“窗口”类型有很多&#xff0c;经常使用的“窗口”大致分为两大类&#xff1a;一是&#xff0c;由系…

对于后端Linux的入门知识

为什么使用Linux 文章来自https://librehunt.org/&#xff0c;在这个网站里&#xff0c;你可以根据它提供的选项&#xff0c;最终选出适合你的Linux版本 It’s safe and private. No tracking. No company watching over you, no “big brother is watching you” nonsense. Ju…

article-三自由度机械臂运动学分析+仿真

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rOmeEm3I-1685366971102)(data:image/svgxml;utf8, )] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kCu0JrBB-1685366971103)(data:image/svgxml;utf8, )] 建立坐标系 1…

ROS:创建工作空间和编译功能包

目录 一、工作空间二、创建工作空间三、编译空代码的工作空间四、功能包五、创建功能包六、设置和检查环境变量七、功能包中的两个重要文件 一、工作空间 存放工程开发相关文件的文件夹。类似一个IDE&#xff08;例如Pycharm&#xff09;新建一个工程&#xff0c;就是一个工作…

权威认可!腾讯云EdgeOne入选Gartner® DDoS缓解方案市场指南

近日&#xff0c;Gartner发布《Market Guide for DDoS Mitigation Solutions》报告&#xff0c;腾讯云EdgeOne入选Gartner DDoS缓解方案市场指南。 “分布式拒绝服务&#xff08;DDoS&#xff09;缓解市场包括检测和缓解DDoS攻击并将其作为专用产品提供的供应商。它包括专业供…

有这个证书,网络安全工程师找工作不用愁

想要成为网络安全工程师&#xff0c;满足企业的用人要求。最基本的&#xff0c;你需要熟悉TCP/IP协议&#xff0c;熟悉sql注入原理和手工检测、熟悉内存缓冲区溢出原理和防范措施、熟悉信息存储和传输安全、熟悉数据包结构、熟悉Ddos攻击类型和原理。并且有一定的ddos攻防经验&…

I2C通信协议MPU6050

目录 I2C通信协议 硬件 软件 I2C时序 MPU6050 I2C通信协议 硬件 为了避免总线没协调好导致电源短路&#xff0c;配置为开漏输出&#xff0c;所有设备输出低电平不输出高电平&#xff0c;即右图。又为了避免高电平造成的引浮空&#xff0c;&#xff08;第三点&#xff09;总…

kotlin用CoroutineScope启动协程async等待结果返回

kotlin用CoroutineScope启动协程async等待结果返回 例如&#xff1a; import kotlinx.coroutines.*object MyCoroutineScope {private val coroutineContext Job() Dispatchers.Default CoroutineName("my_context")val coroutineScope CoroutineScope(corouti…

【Redis】聊一下Redis数据同步/复制

在分布式系统中&#xff0c;基本上所有的存储中间件都支持数据同步/复制功能&#xff0c;主要的原因是为实现高可用&#xff0c;单点宕机的故障&#xff0c;必须需要将数据进行共享&#xff0c;而共享的话&#xff0c;就需要将数据进行复制&#xff0c;对于已经学过的MySQL和Ka…

Jdk17中文在线手册(建议收藏)

本身学习技术就比较难&#xff0c;再来一个英文版的API&#xff0c;就难上加难&#xff0c;经过几周的研究翻译&#xff0c;JDK17最新版中文在线手册搞定&#xff0c;不要看错了哈是JDK17不是JDK1.7&#xff0c;全网最新的只有JDK11&#xff0c;JDK17中文在线手册是第一次出现&…