day46_项目

news2025/2/1 6:47:41

debug

bug - 虫

第一台计算机,房子那么大,机械零件,齿轮,坏了,虫子(bug)卡着机器,debug(调试),虫子拿走了,机器就运行了,从此调试机器程序–>debug

目前: 这个卡机器的虫子,在博物馆


工具(IDEA+Eclipse)支持debug --> 追踪代码


如何使用debug

  • 运行时候就得使用debug模式运行代码image-20230601091539081

  • 需要在准备调试的入口代码处打断点

    image-20230601091800087

  • 断点打在什么地方,代码就会暂停在这个位置

    image-20230601092126544

  • 继续下一步(即让这行代码执行),点击

    图标快捷键名词解释
    F5step into进入代码内部
    image-20230601092415758F6step over执行完这一行,过去
    image-20230601092450830F7step out退出到上一层(与F5相反)
    image-20230601093055555F8resume继续直接执行到下一个断点,如果没有断点就结束

SQL

/*
在分页查询中,有一些常见变量名
pageNo    当前页(页码),默认是1
pageSize  每页展示数据的条数,需求给定
pageCount 共多少页
     pageCount=total%pageSize==0?(total/pageSize):(total/pageSize)+1;
total     共多少条数据,select count(id)计算出
*/
-- 假设,每页展示4条
-- 第一页
select * from user limit 0,4
-- 第二页
select * from user limit 4,4
-- 第三页
select * from user limit 8,4
-- 第四页
select * from user limit (pageNo-1)*pageSize,pageSize

分页

技术:

​ 最终要执行出select * from user limit (pageNo-1)*pageSize,pageSize,就可以实现分页

流程:

- 在第一次查全部时开始分页查询
- 且一定是从第一页开始,后续下一页是当前页+1
  • 还需要在展示结果处写出分页信息: 总页数,总条数,上一页,下一页

编码:

  • 改造之前的代码

  • 改造dao层

    • // 1 方法加参数,int pageNo, int pageSize
      // 2 sql语句加limit
      @Override
          public List<House> findHouseAll(int pageNo, int pageSize) {
              Connection conn = DBUtil.getConnection( );
              PreparedStatement ps = null;
              ResultSet rs = null;
              ArrayList<House> list = new ArrayList<>( );
      
              try {
                  String sql = "select * from house limit ?,?";
                  ps = conn.prepareStatement(sql);
                  ps.setInt(1, (pageNo - 1) * pageSize);
                  ps.setInt(2, pageSize);
              }
          }
      }
      
  • 改造service

    • // 1 方法加参数,int pageNo, int pageSize
      List<House> findHouseAll(int pageNo,int pageSize);
      
          @Override
          public List<House> findHouseAll(int pageNo,int pageSize) {
      
              HouseDao houseDao = new HouseDaoImpl();
              List<House> list = houseDao.findHouseAll(pageNo,pageSize);
              return list;
          }
      
      
  • 改造servlet

    •     @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              // 固定每页大小
              int pageSize = 2;
              // 接收请求
              String pageNoStr = req.getParameter("pageNo");
              // 如果请求中没有页码,认为是第一页
              if (pageNoStr == null || "".equals(pageNoStr)) {
                  pageNoStr = "1";
              }
      
              int pageNo = Integer.parseInt(pageNoStr);
      
              // 调用业务层
              HouseService houseService = new HouseServiceImpl();
              //  查询分页数据
              List<House> list = houseService.findHouseAll(pageNo,pageSize);
      
              
              // 做出响应
              req.setAttribute("list",list);
      
              // 跳转至list.jsp       req.getRequestDispatcher("/view/house/list.jsp").forward(req,resp);
      
          }
      

    到此处已经实现,第一次展现分页

    后续,要向页面展现分页数据: 总页数,总条数,上一页,下一页

    继续改造代码

  • servlet

    • 查出总条数,计算出总页数

    • 将数据存储,到页面展现

    •     @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              // 固定每页大小
              int pageSize = 2;
              // 接收请求
              String pageNoStr = req.getParameter("pageNo");
              // 如果请求中没有页码,认为是第一页
              if (pageNoStr == null || "".equals(pageNoStr)) {
                  pageNoStr = "1";
              }
      
              int pageNo = Integer.parseInt(pageNoStr);
      
              // 调用业务层
              HouseService houseService = new HouseServiceImpl();
              //  查询分页数据
              List<House> list = houseService.findHouseAll(pageNo,pageSize);
      
              // 查询数据条数
              int total = houseService.count();
      
              // 计算出总页数
              int pageCount = total % pageSize == 0 ? total / pageSize : total / pageSize + 1;
      
              // 做出响应
              req.setAttribute("list",list);
              // 将分页信息存储,到页面展现
              req.setAttribute("total",total);// 总条数
              req.setAttribute("pageNo",pageNo);// 当前页
              req.setAttribute("pageCount",pageCount);// 总页数
      
      
              // 跳转至list.jsp
              req.getRequestDispatcher("/view/house/list.jsp").forward(req,resp);
      
          }
      
      
  • service 需要设置方法count();

  • dao需要设置方法count();

    •    @Override
          public int count() {
              Connection conn = DBUtil.getConnection( );
              PreparedStatement ps = null;
              ResultSet rs = null;
              int total = 0;
              try {
                  String sql = "select count(hid) total from house";
                  ps = conn.prepareStatement(sql);
            
                  rs = ps.executeQuery( );
                  if (rs.next( )) {
                      total = rs.getInt("total");
                  }
              } catch (Exception e) {
                  e.printStackTrace( );
              } finally {
                  DBUtil.closeAll(rs, ps, conn);
              }
              return total;
          }
      
  • 改造页面

    • 页面要展现分页信息

      • <div>共有 ${total} 条记录,第 ${pageNo}/${pageCount} 页</div>
        
    • 页面做逻辑处理,第一页时不能再点击上一页,最后一页不能再点击下一页

      • <div>
            <ul class="pagination">
         <%--  if判断为true,内部标签就会展现,if判断为false,内部标签会隐藏 --%>
                <c:if test="${pageNo != 1}">
                    <li class="paginate_button previous disabled }">
                        <a href="${pageContext.request.contextPath}/house/list?pageNo=${pageNo - 1}">上一页</a>
                    </li>
                </c:if>
                <li class="paginate_button active"><a href="#">1</a></li>
                <c:if test="${pageNo != pageCount}">
                    <li class="paginate_button next disabled">
                        <a href="${pageContext.request.contextPath}/house/list?pageNo=${pageNo + 1}">下一页</a>
                    </li>
                </c:if>
            </ul>
        </div>
        
  • 自行完成

    • 页码

image-20230530190404470

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gAZy2YMK-1686394425681)(https://qiushiju-tuchuang.oss-cn-hangzhou.aliyuncs.com/image/%E9%A1%B5%E7%A0%81.gif)]

模糊查询

场景:

​ 查询多个数据

SQL:

select * from house where address like '%航海路%'

模糊查询的时机:

​ 与分页查询全部同时实现.


前端:

  • list.jsp设置搜索框
  • 设置请求路径(/house/list)
  • 点击发送

后台:

  • HouseListServlet接收请求

  • 将关键词也发送给service–> service的findHoseAll方法需要再设计第三个参数,接收关键词

  • List<House> findHouseAll(int pageNo,int pageSize,String keyword);
    
  • dao.findHoseAll方法也设置第三个参数

  • List<House> findHouseAll(int pageNo,int pageSize,String keyword);
    
  • 改造dao,查询的方法方法代码

  •         try {
                // 基础查询
                String sql = "select * from house ";
                // 根据搜索关键词,有关键词就拼接模糊搜索sql
                if (keyword != null && !"".equals(keyword)) {
                    sql += " where haddress like concat('%',?,'%')";
                }
                // 一定要拼接分页用的limit语句
                sql += " limit ?,?";
                System.out.println("动态sql = " + sql );
                ps = conn.prepareStatement(sql);
          
                
                // 根据模糊搜索的关键词的有无,来决定给几个?赋值
                if (keyword != null && !"".equals(keyword)) {
                    ps.setString(1,keyword);
                    ps.setInt(2, (pageNo - 1) * pageSize);
                    ps.setInt(3, pageSize);
                }else{
                    ps.setInt(1, (pageNo - 1) * pageSize);
                    ps.setInt(2, pageSize);
                }
                System.out.println("预处理后动态sql = " + sql );
    
  • 同理,count()方法需要设置keyword参数,通过关键词查出有多少条数据

  • 其余代码不用改变

BUG

  1. 搜索后,再点下一页是全部数据的下一页不是模糊搜索的下一页

原因: 点击下一页或上一页时,后台没有接收到关键词keyword,所以dao就没有拼接where后sql语句

解决: 在点击下一页时,在路径中拼接上关键词(关键词就需要后台将关键词返回)

  1. 更新时间问题

    是因为数据库设置了[根据当前时间戳更新],取消即可

  2. 更新回显下拉框问题

	<!-- option属性selected是默认选中 -->
	<select>
		<option selected>1</option>
		<option >2</option>
		<option>3</option>
	</select>

G

  1. 搜索后,再点下一页是全部数据的下一页不是模糊搜索的下一页

原因: 点击下一页或上一页时,后台没有接收到关键词keyword,所以dao就没有拼接where后sql语句

解决: 在点击下一页时,在路径中拼接上关键词(关键词就需要后台将关键词返回)

  1. 更新时间问题

    是因为数据库设置了[根据当前时间戳更新],取消即可

  2. 更新回显下拉框问题

	<!-- option属性selected是默认选中 -->
	<select>
		<option selected>1</option>
		<option >2</option>
		<option>3</option>
	</select>

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

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

相关文章

00后从事软件测试一年的心路历程

初识软件测试 不知不觉&#xff0c;我做软件测试已经快一年了&#xff0c;入职第一天的场景仿佛还在昨天。入职前&#xff0c;我对测试的认识仅仅停留在一些软件测试和测试方法的理论知识上&#xff0c;最多也是对自己的代码进行一些单元测试。 我之前所理解的测试是与开发分…

Django-可重用注册登录系统--项目搭建

文章目录 一、项目开始前的思考二、搭建项目环境三、设计数据库模型数据库模型文件设置数据库后端注册app生成迁移脚本并写入数据库测试是否成功数据库模型后台管理 路由与视图函数框架搭建路由配置视图函数的配置模板template的配置测试是否成功 前端界面设计与优化完善登录的…

【C/C++】函数参数默认值

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

【python+requests】接口自动化测试

这两天一直在找直接用python做接口自动化的方法&#xff0c;在网上也搜了一些博客参考&#xff0c;今天自己动手试了一下。 一、整体结构 上图是项目的目录结构&#xff0c;下面主要介绍下每个目录的作用。 Common:公共方法:主要放置公共的操作的类&#xff0c;比如数据库sql…

VPN(Virtual privacte network)浅谈

文章目录 VPN概念VPN类型站点-站点VPN客户端-站点VPN VPN的工作原理VPN职责职责一&#xff1a;保密完整性认证PSK算法实现&#xff08;献给大佬&#xff09;PSK应用演示RSA算法实现&#xff08;献给大佬&#xff09;RSA应用演示&#xff1a;实现签名 VPN两大框架VPN的误解VPN合…

Java调用Pytorch实现以图搜图(附源码)

Java调用Pytorch实现以图搜图 设计技术栈&#xff1a; 1、ElasticSearch环境&#xff1b; 2、Python运行环境&#xff08;如果事先没有pytorch模型时&#xff0c;可以用python脚本创建模型&#xff09;&#xff1b; 1、运行效果 2、创建模型&#xff08;有则可以跳过&#xf…

经典目标检测YOLO系列(1)YOLO-V1算法及其在VOC2007数据集上的应用

经典目标检测YOLO系列(1)YOLO-V1算法及其在VOC2007数据集上的应用 1 YOLO-V1的简述 1.1 目标检测概述 ​ 目标检测有非常广泛的应用&#xff0c; 例如&#xff1a;在安防监控、手机支付中的人脸检测&#xff1b;在智慧交通&#xff0c;自动驾驶中的车辆检测&#xff1b;在智…

TCP与UDP的可靠性传输

目录 一、TCP可靠性传输1、重传机制1.1、超时重传1.2、快速重传1.3、SACK1.4、Duplicate SACK 2、滑动窗口3、流量控制3.1 滑动窗口与流量控制3.2窗口关闭 4、拥塞控制4.1拥塞窗口4.2 慢启动4.3 拥塞避免4.4 拥塞发生4.5 快速恢复 二、UDP可靠性传输1、主要策略2、重传机制2.1 …

软件测试03:软件工程和软件生命周期

软件测试03&#xff1a;软件工程和软件生命周期 软件危机 软件危机是指落后的软件生产方式无法满足迅速增长的计算机软件需求&#xff0c;从而导致软件开发与维护过程中出现一系列严重问题的现象。 软件工程 基本软件危机对于计算机发展的阻碍&#xff0c;1968年&#xff0…

史上最详细的安装Kali-linux教程(附视频教程)

之前不少人问kali怎么安装&#xff0c;今天就发一篇利用VM虚拟机安装kali的详细教程&#xff0c;每一步都截图了&#xff0c;让大家尽可能的清楚每一步的操作。 1.2 使用 VM 虚拟机安装 Kali 1.2.1 官方下载 Kali Linux 官方网址&#xff1a;http://www.Kali.org 下载方式分…

跨域 —— 反向代理配置

跨域问题在讲Node.js学习中编写接口的时候就已经讲到了&#xff0c;由后端配置解决跨域问题&#xff0c;使用cors中间件解决跨域问题以及使用JSONP解决跨域&#xff08;仅支持GET请求&#xff09;&#xff0c;具体可以看一下这篇文章的内容&#xff1a;十二、Express接口编写 —…

python面向对象操作3(速通版)

目录 一、多态和类名 1.标准多态 2.实例属性和实例方法 3.类对象和类属性 4.对象保存 二、方法 1.类方法 3.四种方法的区别 三、模块 1.导入模块 2.自动模块导入 3.模块导入的几种形式 3.1模块导入的两种方式和别名 3.2 from 模块 import 成员 4.两种方法的区别…

【运筹优化】最短路算法之A星算法 + Java代码实现

文章目录 一、A星算法简介二、A星算法思想三、A星算法 java代码四、测试 一、A星算法简介 A*算法是一种静态路网中求解最短路径最有效的直接搜索方法&#xff0c;也是解决许多搜索问题的有效算法。算法中的距离估算值与实际值越接近&#xff0c;最终搜索速度越快。 二、A星算…

day52_Spring

今日内容 零、 复习昨日 一、Spring 零、 复习昨日 一、引言 以前 public class HelleServlet extends HttpServlet{UserService service new UsrServiceImpl();void doGet(){service.findUser();} }public interface UserService{User findUser(); } public class UserServ…

Tigase-Server 8.3.0在windows11下安装

一、JDK安装&#xff1a; tigase-server要求JDK 17,请先下载JDK17, 下载地址&#xff1a;https://download.oracle.com/java/17/latest/jdk-17_windows-x64_bin.exe 配置环境变量&#xff1a;JAVA_HOME{JDK安装目录} 二、数据库安装&#xff1a;tigase-server8.3在windows下…

【算法系列 | 4】深入解析排序算法之——归并排序

序言 你只管努力&#xff0c;其他交给时间&#xff0c;时间会证明一切。 文章标记颜色说明&#xff1a; 黄色&#xff1a;重要标题红色&#xff1a;用来标记结论绿色&#xff1a;用来标记一级论点蓝色&#xff1a;用来标记二级论点 决定开一个算法专栏&#xff0c;希望能帮助大…

Chrome内核插件开发报错:Unchecked runtime.lastError:的原因及解决办法。

本篇文章主要讲解,chrome内核插件开发时报错:Unchecked runtime.lastError: Extensions using event pages or Service Workers must pass an id parameter to chrome.contextMenus.create 的原因及解决办法。 日期:2023年6月10日 作者:任聪聪 报错现象: 查看报错路径,在…

项目经理必备!这四个高效管理工具帮你实现项目管理目标

在项目管理中&#xff0c;图形工具可以帮助我们让项目信息可视化&#xff0c;让项目管理更加高效&#xff0c;对于项目经理而言&#xff0c;这些工具都是好帮手。让我们一起看看&#xff0c;项目经理常用的管理工具都有那些吧~ 1&#xff0c;甘特图 甘特图是计划和管理项目的好…

【Spring使用注解更简单的实现Bean对象的存取】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 一、前言&#xff1a; 二、储存Bean对象和使…

天黑的时候如果下雨了,会比平常更亮一些

目录 一、最近的感受 二、自我的审视 三、如何变得强大 1.保持善良 2.不过度追求公平 3.在痛苦中找到自己的意义 4.令人振奋的生命力 四、情绪调节中的个人见解及如何处理情绪后的学习 1.运动 2.散步 3.找好朋友倾诉 五、总结 一、最近的感受 天黑的时候如果下雨了…