JavaWeb实战(1)(重点:分页查询、jstl标签与jsp、EL表达式、Bootstrap组件搭建页面、jdbc)

news2024/11/30 11:48:20

目录

一、jstl标签。

(1)基本概念。

(2)使用前提。

(3)"<%...%>"与"<%=%>"。

(4)使用jstl标签的步骤。

1、导入对应jar包。

2、引入核心标签库。(core)

3、在jsp页面中使用jstl标签(常见标签)。

二、分页查询。

(1)使用循环拿对象,利用EL表达式显示属性。

(2)通过Bootstrap获取分页栏组件快速渲染页面(jsp)。

(3)分页查询思路分析。

1、页面(前端)需要传什么参数?

2、页面需要接收什么参数。

3、Page类。

4、sql语句的书写。

三、正式代码书写。

(1)链接到对应Servlet。

(2)queryUsersByPageServlet类。

(3)service层接口。

(4)serviceImpl实现类。

(5)dao层接口。(数据访问层接口)

(6)dao层实现类。

(7)初步测试其功能是否正常。

(8)完善设计要求。

1、当前所在页为:1。

2、当前所在页为:最后一页。

3、位于当前页时。

4、显示页数(如:1、2...)。

5、测试结果。


一、jstl标签。

(1)基本概念。
  • JSTL(JavaServer Pages Standard Tag Library)是一个为JavaServerPages (JSP) 技术提供的标签库。
  • 它允许开发者在JSP页面中使用标签来执行常见的功能。如条件判断循环等。
(2)使用前提。
  • 导入两个jar包。


  • 或使用Maven添加对应的依赖也能够使用。
(3)"<%...%>"与"<%=%>"。
  • 简单说:jsp页面就是让Java代码能够在html页面书写。
<%
   //java方法能写的代码, 都可以在这里写
%>
<%=表达式 %>  把表达式的结果在客户端页面显示  使用EL表达式替换
(4)使用jstl标签的步骤。
1、导入对应jar包。
2、引入核心标签库。(core)
  • 注意:"uri"一定要选择对应的正确核心库标签。
  • 它也叫"c标签"。
  • @tag:目标,lib:库。
<%--引入JSTL核心标签库--%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
3、在jsp页面中使用jstl标签(常见标签)。
  • 循环:<c:forEach>
  • if判断:<c:if>
  • if...else:<choose>。类似于MySQL中的case一样。

二、分页查询。

(1)使用<c:forEach>循环拿对象,利用EL表达式显示属性。
  • 使用"<%%>"、"<%=%>"嵌套代码看着很混乱
  • 则可以使用jstl标签完成操作!
<%
            //从request域拿到数据
            List<UserInfo> users = (List<UserInfo>) request.getAttribute("users");
            for (UserInfo user : users) {

        %>
        <tr>
            <td><%=user.getId()%></td>
            <td><%=user.getName()%></td>
            <td><%=user.getGender()%></td>
            <td><%=user.getAge()%></td>
            <td><%=user.getAddress()%></td>
            <td><%=user.getEmail()%></td>
            <td><%=user.getQq()%></td>
            <td>
                <a class="btn btn-default btn-sm" href="/users/update?id=<%=user.getId()%>">修改</a>&nbsp;
                <a class="btn btn-default btn-sm" href="/users/delete?id=<%=user.getId()%>">删除</a></td>
        </tr>
        <%
            }
        %>
  • 使用<c:forEach>标签。

  • 从所有域中搜索键名"users"值。拿到应该List<UserInfo>集合。

<c:forEach items="${users}" var="user" varStatus="s">
  • items相当于Javaforeach循环中的"for(String str:str(数组/集合))"的数据集合。

  • var相当于某个体。

  • varStatus代表当前状态(如:位于第几行?)

<table border="1" class="table table-bordered table-hover">
        <tr class="success">
            <th>编号</th>
            <th>姓名</th>
            <th>性别</th>
            <th>年龄</th>
            <th>籍贯</th>
            <th>QQ</th>
            <th>邮箱</th>
            <th>操作</th>
        </tr>
        <c:forEach items="${users}" var="user" varStatus="s">
            <tr>
                <td>${s.count}</td>
                <td>${user.name}</td>
                <td>${user.gender}</td>
                <td>${user.age}</td>
                <td>${user.address}</td>
                <td>${user.email}</td>
                <td>${user.qq}</td>
                <td>
                    <a class="btn btn-default btn-sm" href="/users/update?id=${user.id}">修改</a>&nbsp;
                    <a class="btn btn-default btn-sm" href="/users/delete?id=${user.id}">删除</a></td>
            </tr>
        </c:forEach>
    </table>

(2)通过Bootstrap获取分页栏组件快速渲染页面(jsp)。


  • 渲染后。


(3)分页查询思路分析。
1、页面(前端)需要传什么参数?
  • 页码。(当前位于第几页)
  • 页容量。(每页显示的数据条数)
  • 条件的分页查询。
2、页面需要接收什么参数。
  • 记录。(根据分页或条件查询的数据记录)
  • 总记录。(查询的所有数据有多少条?)
  • 总页数(最终分页)。(根据总记录与页容量计算!
  • 页码。
  • 页容量。
  • 将上面5个数据封装到Page类对象中,并存在域中!

  • 将上面的5个数据封装成一个类Page。简单且实用。(面向对象
3、Page类。


  • totalPage(总页数)不能提供setter()方法。因为这个是根据总记录数和页容量进行计算。

  • 如果有40条数据。每一页显示5条。则总页数 =8页。
  • 如果有41条数据。每一页显示5条则总页数 = 9页。
  • 总页数 = 总记录数 % 页容量 == 0? 总记录数/页容量: 总记录数/页容量 +1。
public Long getTotalPage() {
        //总页数 = 总记录数 % 页容量 == 0? 总记录数/页容量:  总记录数/页容量 +1
        return count%pageSize==0?count/pageSize:(count/pageSize+1);
    }
package com.fs.entity;

import java.util.List;

/**
 * @Title: Page
 * @Author HeYouLong
 * @Package com.fs.entity
 * @Date 2024/11/29 下午4:48
 * @description: 分页实体类
 */
public class Page<T> {
    private Long count ; //总记录数
    private Long totalPage; //总页数
    private Integer pageIndex; //当前页码
    private Integer pageSize;  //每页显示记录数(页容量)
    private List<T> records;  //

    public Long getCount() {
        return count;
    }

    public void setCount(Long count) {
        this.count = count;
    }

    public Long getTotalPage() {
        return count % pageSize == 0 ? count / pageSize : (count / pageSize) + 1;
    }

    /*public void setTotalPage(Long totalPage) {
        this.totalPage = totalPage;
    }*/

    public Integer getPageIndex() {
        return pageIndex;
    }

    public void setPageIndex(Integer pageIndex) {
        this.pageIndex = pageIndex;
    }

    public Integer getPageSize() {
        return pageSize;
    }

    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }

    public List<T> getRecords() {
        return records;
    }

    public void setRecords(List<T> records) {
        this.records = records;
    }
}
4、sql语句的书写。
  • sql语句需要写两条。调用两个方法。
  • 记录(根据分页得到的查询结果)。
  • 求当前页记录: select * from …. limit 开始序号,页容量。

  • 总记录(count)。
  • 求总记录数: select count(1) from…


  • limit的开始序号与页容量。
  • 开始序号 = (页码-1)*页容量。
  • 如40条数据。每页5条。
  • 页码 开始序号
  • 1 0
  • 2 5
  • 3 10

三、正式代码书写。

(1)链接到对应Servlet。



(2)queryUsersByPageServlet类。
  • 具体代码。具体解释在注释中。
package com.fs.web;

import com.fs.entity.Page;
import com.fs.entity.UserInfo;
import com.fs.service.UserInfoService;
import com.fs.service.impl.UserInfoServiceImpl;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

/**
 * @Title: queryUsersByPageServlet
 * @Author HeYouLong
 * @Package com.fs.web
 * @Date 2024/11/29 下午5:01
 * @description: 分页查询用户信息
 */
@WebServlet("/users/queryUsersByPage")
public class queryUsersByPageServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.设置编码
        resp.setContentType("text/html;charset=utf-8");
        //获取请求参数
        //页码
        String pageIndexStr = req.getParameter("pageIndex");
        int pageIndex = Integer.parseInt(pageIndexStr);
        //默认设置页容量=2
        int pageSize = 2;
        //2.调用业务层
        UserInfoService userInfoService = new UserInfoServiceImpl();
        //调用分页查询方法
        //注意返回的是一个封装了5个数据的Page对象
        Page<UserInfo> page = userInfoService.queryByPage(pageIndex,pageSize);

        //将分页查询的所有用户信息保存到request域中
        req.setAttribute("page",page);
        //请求转发
        req.getRequestDispatcher("/users/list.jsp").forward(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }
}
  • 注意修改:将循环的EL表达式改成"page(对象)",并且是它的属性查询后的记录数(records)。


(3)service层接口。
/**
     * 分页查询
     * @param pageIndex
     * @param pageSize
     * @return
     */
    Page<UserInfo> queryByPage(int pageIndex, int pageSize);
(4)serviceImpl实现类。
  • 注意这里需要写两个dao层方法
  • 1.查询总记录数。2.查询当前分页条件下的记录。(数据)
@Override
    public Page<UserInfo> queryByPage(int pageIndex, int pageSize) {
        UserInfoDao userInfoDao = new UserInfoDaoImpl();
        //1.查询总记录数
        long count = userInfoDao.count();
        // 2.查询当前分页的记录(数据)
        List<UserInfo> records =userInfoDao.selectByPage(pageIndex,pageSize);
        //包装成page对象
        Page<UserInfo> page = new Page<>();
        page.setPageIndex(pageIndex);
        page.setPageSize(pageSize);
        page.setCount(count);
        page.setRecords(records);
        return page;
    }
}
(5)dao层接口。(数据访问层接口)
/**
     * 查询总记录数
     * @return
     */
    long count();

    /**
     * 分页查询
     * @param pageIndex
     * @param pageSize
     * @return
     */
    List<UserInfo> selectByPage(int pageIndex, int pageSize);
  • 因为查询的结果是返回是一个基本数据类型的数据。
  • 所以使用ScalarHandler类接收参数。

(6)dao层实现类。
@Override
    public long count() {
        Connection conn = null;
        try {
            conn = JdbcUtil.getConnection();
            QueryRunner queryRunner = new QueryRunner();
            String sql = "select count(1) from tb_userinfo";
            //查询单个值,resultSet处理器 ScalarHandler
            return queryRunner.query(conn,sql,new ScalarHandler<Long>());
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }finally {
            JdbcUtil.close(conn);
        }
    }

    @Override
    public List<UserInfo> selectByPage(int pageIndex, int pageSize) {
        Connection conn = null;
        try {
            conn = JdbcUtil.getConnection();
            QueryRunner queryRunner = new QueryRunner();
            String sql = "select * from tb_userinfo limit ?,?";
            return queryRunner.query(conn,sql,new BeanListHandler<>(UserInfo.class),(pageIndex-1)*pageSize,pageSize);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }finally {
            JdbcUtil.close(conn);
        }
    }
(7)初步测试其功能是否正常。
  • 先登录。

  • 进入首页。点击查询用户信息按钮。

  • 功能正常。

  • 现在对下面的分页栏进行修改。增加总记录数、总页数显示。


(8)完善设计要求。

(注意本代码中使用bootstrap组件快速开发)

1、当前所在页为:1。
  • 不显示上一页按钮。点击下一页跳到下一页数据。
  • 通过<c:if>标签进行判断。
2、当前所在页为:最后一页。
  • 不显示下一页按钮。点击上一页跳到上一页数据。
3、位于当前页时。
  • 从超链接变成不能点击的。以单纯文本显示。
  • 所在按钮背景变"蓝"。
4、显示页数(如:1、2...)。
  • 根据当前的分页总数计算。
  • 根据<c:forEach>进行普通循环。

<%@ page import="com.fs.entity.UserInfo" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--引入JSTL核心标签库--%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<!-- 网页使用的语言 -->
<html lang="zh-CN">
<head>
    <!-- 指定字符集 -->
    <meta charset="utf-8">
    <!-- 使用Edge最新的浏览器的渲染方式 -->
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <!-- viewport视口:网页可以根据设置的宽度自动进行适配,在浏览器的内部虚拟一个容器,容器的宽度与设备的宽度相同。
    width: 默认宽度与设备的宽度相同
    initial-scale: 初始的缩放比,为1:1 -->
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
    <title>用户信息管理系统</title>

    <!-- 1. 导入CSS的全局样式 -->
    <link href="../css/bootstrap.min.css" rel="stylesheet">
    <!-- 2. jQuery导入,建议使用1.9以上的版本 -->
    <script src="../js/jquery-2.1.0.min.js"></script>
    <!-- 3. 导入bootstrap的js文件 -->
    <script src="../js/bootstrap.min.js"></script>
    <style type="text/css">
        td, th {
            text-align: center;
        }
    </style>
</head>
<body>

<div class="container">
    <h3 style="text-align: center">用户信息列表</h3>
    <div style="float: left;">

        <form class="form-inline">
            <div class="form-group">
                <label for="exampleInputName2">姓名</label>
                <input type="text" class="form-control" id="exampleInputName2">
            </div>
            <div class="form-group">
                <label for="exampleInputName3">籍贯</label>
                <input type="text" class="form-control" id="exampleInputName3">
            </div>

            <div class="form-group">
                <label for="exampleInputEmail2">邮箱</label>
                <input type="email" class="form-control" id="exampleInputEmail2">
            </div>
            <button type="submit" class="btn btn-default">查询</button>
        </form>

    </div>

    <div style="float: right;margin: 5px;">

        <a class="btn btn-primary" href="add.html">添加新用户</a>
        <a class="btn btn-primary" href="add.html">删除选中用户</a>
    </div>

    <table border="1" class="table table-bordered table-hover">
        <tr class="success">
            <th><input type="checkbox"></th>
            <th>编号</th>
            <th>姓名</th>
            <th>性别</th>
            <th>年龄</th>
            <th>籍贯</th>
            <th>QQ</th>
            <th>邮箱</th>
            <th>操作</th>
        </tr>
        <c:forEach items="${page.records}" var="user" varStatus="s">
            <tr>
                <td><input type="checkbox"></td>
                <td>${s.count}</td>
                <td>${user.name}</td>
                <td>${user.gender}</td>
                <td>${user.age}</td>
                <td>${user.address}</td>
                <td>${user.email}</td>
                <td>${user.qq}</td>
                <td>
                    <a class="btn btn-default btn-sm" href="/users/update?id=${user.id}">修改</a>&nbsp;
                    <a class="btn btn-default btn-sm" href="/users/delete?id=${user.id}">删除</a></td>
            </tr>
        </c:forEach>
    </table>
    <nav aria-label="Page navigation">
        <ul class="pagination">
            <li>
                <c:if test="${page.pageIndex>1}">
                    <a href="/users/queryUsersByPage?pageIndex=${page.pageIndex-1}" aria-label="Previous">
                        <span aria-hidden="true">&laquo;</span>
                    </a>
                </c:if>
            </li>
            <%--var相当于i begin 开始 end 结束  step 步长(每次加1)--%>
            <c:forEach var="i" begin="1" end="${page.totalPage}" step="1">
                <c:choose>
                    <c:when test="${page.pageIndex==i}">
                        <li class="active"><span>${i}</span></li>
                    </c:when>
                    <c:otherwise>
                        <li><a href="/users/queryUsersByPage?pageIndex=${i}">${i}</a></li>
                    </c:otherwise>
                </c:choose>
            </c:forEach>
            <li>
                <c:if test="${page.pageIndex <page.totalPage}">
                    <a href="/users/queryUsersByPage?pageIndex=${page.pageIndex+1}" aria-label="Next">
                        <span aria-hidden="true">&raquo;</span>
                    </a>
                </c:if>
            </li>
            <span style="font-size: 25px;margin-left: 5px;">
                    共条${page.count}记录,共${page.totalPage}页
                </span>
        </ul>
    </nav>
</div>
</body>
</html>

5、测试结果。
  • 初步测试1。


  • 位于第一页时,没有上一页按钮。


  • 位于最后一页时,没有下一页按钮。


  • 最终效果。

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

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

相关文章

Linux:makefile的使用

makefile小结&#xff1a; makefile的应用&#xff1a; 一个简单的 Makefile 文件包含一系列的“规则”&#xff0c;其样式如下&#xff1a; 目标(target)…: 依赖(prerequiries)… 命令(command) 目标(target)通常是要生成的文件的名称&#xff0c;可以是可执行文件或OBJ文件…

springboot中使用mongodb完成评论功能

pom文件中引入 <!-- mongodb --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> yml中配置连接 data:mongodb:uri: mongodb://admin:1234561…

TCGA 编码格式解读 | 怎么区分是不是肿瘤样品?

最权威参考资料 https://docs.gdc.cancer.gov/Encyclopedia/pages/TCGA_Barcode/ "-"分割符的第四位是Sample type&#xff1a; Tumor types range from 01 - 09,normal types from 10 - 19and control samples from 20 - 29. See Code Tables Report for a compl…

百度 文心一言 vs 阿里 通义千问 哪个好?

背景介绍&#xff1a; 在当前的人工智能领域&#xff0c;随着大模型技术的快速发展&#xff0c;市场上涌现出了众多的大规模语言模型。然而&#xff0c;由于缺乏统一且权威的评估标准&#xff0c;很多关于这些模型能力的文章往往基于主观测试或自行设定的排行榜来评价模型性能…

【linux学习指南】Linux进程信号产生(二)软件中断

文章目录 &#x1f4dd; 由软件条件产⽣信号&#x1f320; 基本alarm验证-体会IO效率问题&#x1f309;设置重复闹钟 &#x1f320;如何理解软件条件&#x1f309;如何简单快速理解系统闹钟 &#x1f6a9;总结 &#x1f4dd; 由软件条件产⽣信号 SIGPIPE 是⼀种由软件条件产⽣…

蓝桥杯每日真题 - 第24天

题目&#xff1a;&#xff08;货物摆放&#xff09; 题目描述&#xff08;12届 C&C B组D题&#xff09; 解题思路&#xff1a; 这道题的核心是求因数以及枚举验证。具体步骤如下&#xff1a; 因数分解&#xff1a; 通过逐一尝试小于等于的数&#xff0c;找到 n 的所有因数…

python学opencv|读取图像

【1】引言 前序学习了使用matplotlib模块进行画图&#xff0c;今天开始我们逐步尝试探索使用opencv来处理图片。 【2】学习资源 官网的学习链接如下&#xff1a; OpenCV: Getting Started with Images 不过读起来是英文版&#xff0c;可能略有难度&#xff0c;所以另推荐一…

ROS2教程 - 2 环境安装

更好的阅读体验&#xff1a;https://www.foooor.com 2 环境安装 下面以 ROS2 的 humble 版本为例&#xff0c;介绍 ROS2 的安装。 ROS1 只能在 ubuntu 系统上安装&#xff0c;ROS2全面支持三种平台&#xff1a;Ubuntu、MAC OS X、Windows10&#xff0c;下面在 Ubuntu22.04 …

神经网络入门实战:(六)PyTorch 中的实用工具 SummaryWriter 和 TensorBoard 的说明

(一) SummaryWriter 这里先讲解 SummaryWriter &#xff0c;TensorBoard 会在第二大点进行说明。 SummaryWriter 是 PyTorch 中的一个非常实用的工具&#xff0c;它主要用于将深度学习模型训练过程中的各种日志和统计数据记录下来&#xff0c;并可以与 TensorBoard 配合使用&am…

git的使用(简洁版)

什么是 Git&#xff1f; Git 是一个分布式版本控制系统 (DVCS)&#xff0c;用于跟踪文件的更改并协调多人之间的工作。它由 Linus Torvalds 在 2005 年创建&#xff0c;最初是为了管理 Linux 内核的开发。Git 的主要目标是提供高效、易用的版本控制工具&#xff0c;使得开发者…

联想M7400Pro打印机报无法打印02 关闭电源,然后重新打开。故障检修分析

联想M7400Pro打印机无法打印02可能是由于硬件故障、软件问题、通信故障等引起的。 以下是故障的解决方法: 1、关闭打印机(可尝试多次重新启动打印机)。 2、重新放置碳粉盒组件。 3、检查打印机驱动程序是否已正确安装。 4、检查打印机的设置,确保已选择正确的打印模式…

排序(数据结构)

排序&#xff1a; 所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 常见排序法 . 常见排序算法的实现 插入排序 1.直接插入排序 2.希尔排序( 缩小增量排序&#xff09; 希尔排序的特性总结&#x…

【深度学习】铝箔表面缺陷检测【附链接】

一、铝箔表面缺陷种类 铝箔广泛应用于食品包装、药品包装和工业用途等领域&#xff0c;表面质量直接影响产品的性能和安全性。铝箔表面常见的缺陷主要包括&#xff1a; 划痕&#xff1a;铝箔在生产、加工或运输过程中可能会出现划痕&#xff0c;影响外观和功能。 气泡&#x…

OpenCV 图像轮廓查找与绘制全攻略:从函数使用到实战应用详解

摘要&#xff1a;本文详细介绍了 OpenCV 中用于查找图像轮廓的 cv2.findContours() 函数以及绘制轮廓的 cv2.drawContours() 函数的使用方法。涵盖 cv2.findContours() 各参数&#xff08;如 mode 不同取值对应不同轮廓检索模式&#xff09;及返回值的详细解析&#xff0c;搭配…

AI之Data之Label Tool:Label Studio(多类型数据标注工具)的简介、安装和使用方法、案例应用之详细攻略

AI之Data之Label Tool&#xff1a;Label Studio(多类型数据标注工具)的简介、安装和使用方法、案例应用之详细攻略 目录 Label Studio的简介 1、特点 Label Studio的安装和使用方法&#xff1a; 1、Label Studio 提供多种安装方式 T1、使用Docker安装 T2、使用pip安装&am…

【Linux相关】服务器无网情况配置conda

【Linux相关】 服务器无网情况配置conda 文章目录 环境配置1. 本地下载miniconda&#xff0c;传到服务器2. 确认安装包是否传送成功3. 确保有安装权限4. 安装5. 写路径6. 看一下是否成功 环境配置 ssh的话&#xff0c;服务器连不上网&#xff0c;无法在线下载&#xff0c;需要本…

Redis使用场景-缓存-缓存穿透

前言 之前在针对实习面试的博文中讲到Redis在实际开发中的生产问题&#xff0c;其中缓存穿透、击穿、雪崩在面试中问的最频繁&#xff0c;本文加了图解&#xff0c;希望帮助你更直观的了解缓存穿透&#x1f600; &#xff08;放出之前写的针对实习面试的关于Redis生产问题的博…

Docker desktop 改变存储位置

项目场景&#xff1a; 在windows下&#xff0c;使用docker desktop是使用docker最简单直接的方式。但是&#xff0c;这毕竟是一个可视化的界面&#xff0c;使用起来还是和linux环境下的版本有很大的区别。 例如&#xff0c;使用docker desktop&#xff0c;会默认将镜像以及容…

[CA] 尝试深入理解core.cpp -1

#我给你代码&#xff0c;你给我在源代码上额外加上中文注释&#xff01;&#xff0c;如果是函数告诉我它读取了什么结构&#xff0c;传递了什么值&#xff0c;可能或者已经知道它将在哪些函数利用&#xff0c;是体现了pipeline 的哪一步# #include "core.h" #includ…

宠物空气净化器推荐2024超详细测评 希喂VS霍尼韦尔谁能胜出

最近有粉丝一直在评论区和后台探讨宠物空气净化器是不是智商税的问题&#xff0c;有人认为宠物空气净化器肯定不是智商税&#xff0c;有些人认为将其购回家就是个没用的东西&#xff0c;还占地方&#xff0c;双方各有自己的观点。 其实宠物空气净化器和普通的空气净化器是有很大…