SpringMVC:整合 SSM 下篇

文章目录

  • SpringMVC - 05
  • 整合 SSM 下篇
  • 一、设计页面
    • 1. 首页:index.jsp
    • 2. 展示书页面:showBooks.jsp
    • 3. 增加书页面:addBook.jsp
    • 4. 修改书页面:updateBook.jsp
    • 5. 总结
  • 二、控制层
    • 1. 查询全部书
    • 2. 增加书
    • 3. 修改书
    • 4. 删除书
    • 5. 搜索书
  • 三、总结
  • 四、说明
  • 注意:

SpringMVC - 05

整合 SSM 下篇

在上篇的基础上,对界面进行优化,并添加新的功能,如:增加书、修改书、删除书、以及搜索书。

前端页面的设计由前端开源工具库 Bootstrap 完成:官网点此进入。

一、设计页面

1. 首页:index.jsp

功能:提供一个链接,进入展示书的页面。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>首页</title>
    <style>
        a {
            text-decoration: none;
            color: green;
            font-size: 18px;
        }

        h1 {
            width: 180px;
            height: 38px;
            margin: 100px auto;
            text-align: center;
            line-height: 38px;
            background: lightgoldenrodyellow;
            border-radius: 5px;
        }
    </style>
</head>
<body>
    <h1>
        <a href="${pageContext.request.contextPath}/wed/select">进入书籍页面</a>
    </h1>
</body>
</html>

效果

2. 展示书页面:showBooks.jsp

功能:展示所有书,并且提供增加书、修改书以及搜索书的链接。

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<!doctype html>
<html lang="zh-CN">
<head>
    <!-- 必须的 meta 标签 -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- Bootstrap 的 CSS 文件 -->
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css" integrity="sha384-xOolHFLEh07PJGoPkLv1IbcEPTNtaed2xpHsD9ESMhqIYd0nLMwNLD69Npy4HI+N" crossorigin="anonymous">

    <title>主页面</title>
</head>
<body>
<div class="container">
    <div class="row">
        <div class="col-md-12 column">
            <br>
            <div class="alert alert-success" role="alert">
                <h3>书的清单 -- 显示所有书的信息</h3>
            </div>
            <br>

            <nav class="navbar navbar-light bg-light">
                <div class="container-fluid">
                    <form class="form-inline">
                        <a class="btn btn-primary" href="${pageContext.request.contextPath}/wed/toAdd">增加书</a>
                        &nbsp;&nbsp;
                        <a class="btn btn-primary" href="${pageContext.request.contextPath}/wed/select">查看全部书</a>
                    </form>

                    <form action="${pageContext.request.contextPath}/wed/search" method="get" class="form-inline my-2 my-lg-0">
                        <span style="color: red;font-weight: bold">${error}</span>&nbsp;&nbsp;
                        <input class="form-control mr-sm-2" type="search" placeholder="填入要查找的书" name="searchBookName" aria-label="Search">
                        <button class="btn btn-outline-success my-2 my-sm-0" type="submit">查找</button>
                    </form>
                </div>
            </nav>

            <table class="table table-hover table-striped">
                <thead>
                <tr>
                    <th>书的编号</th>
                    <th>书的名称</th>
                    <th>书的数量</th>
                    <th>详情(放置位置)</th>
                    <th>操作</th>
                </tr>
                </thead>

                <tbody>
                <c:forEach var="book" items="${booksList}">
                    <tr>
                        <td>${book.bookID}</td>
                        <td>${book.bookName}</td>
                        <td>${book.bookCounts}</td>
                        <td>${book.detail}</td>
                        <td>
                            <a href="${pageContext.request.contextPath}/wed/toUpdate/${book.bookID}">修改</a>
                            &nbsp; | &nbsp;
                            <a href="${pageContext.request.contextPath}/wed/delete/${book.bookID}">删除</a>
                        </td>
                    </tr>
                </c:forEach>
                </tbody>
            </table>
        </div>
    </div>
</div>

<script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-7ymO4nGrkm372HoSbq1OY2DP4pEZnMiA+E0F3zPr+JQQtQ82gQ1HPY3QIVtztVua" crossorigin="anonymous"></script>

</body>
</html>

效果

3. 增加书页面:addBook.jsp

功能:增加书。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<!doctype html>
<html lang="zh-CN">
<head>
    <!-- 必须的 meta 标签 -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- Bootstrap 的 CSS 文件 -->
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css" integrity="sha384-xOolHFLEh07PJGoPkLv1IbcEPTNtaed2xpHsD9ESMhqIYd0nLMwNLD69Npy4HI+N" crossorigin="anonymous">

    <title>增加书</title>
</head>
<body>
<div class="container">
    <div class="row clearfix">
        <div class="col-md-12 column">
            <br>
            <div class="alert alert-primary" role="alert">
                <h3>增加书</h3>
            </div>
            <br>

            <form action="${pageContext.request.contextPath}/wed/add" method="get">
                <div class="form-group">
                    <label for="bookName">书的名称</label>
                    <input type="text" class="form-control" name="bookName" id="bookName" required>
                </div>
                <div class="form-group">
                    <label for="bookCounts">书的数量</label>
                    <input type="text" class="form-control" name="bookCounts" id="bookCounts" required>
                </div>
                <div class="form-group">
                    <label for="detail">详情(放置位置)</label>
                    <input type="text" class="form-control" name="detail" id="detail" required>
                </div>
                <div class="form-group form-check">
                    <input type="checkbox" class="form-check-input" id="check" required>
                    <label class="form-check-label" for="check">核对信息</label>
                </div>
                <input type="submit" class="btn btn-primary" value="提交">
            </form>
        </div>
    </div>
</div>

<script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-7ymO4nGrkm372HoSbq1OY2DP4pEZnMiA+E0F3zPr+JQQtQ82gQ1HPY3QIVtztVua" crossorigin="anonymous"></script>

</body>
</html>

效果

4. 修改书页面:updateBook.jsp

功能:修改书。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<!doctype html>
<html lang="zh-CN">
<head>
    <!-- 必须的 meta 标签 -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- Bootstrap 的 CSS 文件 -->
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css" integrity="sha384-xOolHFLEh07PJGoPkLv1IbcEPTNtaed2xpHsD9ESMhqIYd0nLMwNLD69Npy4HI+N" crossorigin="anonymous">

    <title>修改信息</title>
</head>
<body>
<div class="container">
    <div class="row clearfix">
        <div class="col-md-12 column">
            <br>
            <div class="alert alert-primary" role="alert">
                <h3>修改信息</h3>
            </div>
            <br>
            <form action="${pageContext.request.contextPath}/wed/update" method="get">
                <!-- 隐藏域 -->
                <input type="hidden" name="bookID" value="${Ubook.bookID}">
                <div class="form-group">
                    <label for="bookName">书的名称</label>
                    <input type="text" class="form-control" name="bookName" value="${Ubook.bookName}" id="bookName" required>
                </div>
                <div class="form-group">
                    <label for="bookCounts">书的数量</label>
                    <input type="text" class="form-control" name="bookCounts" value="${Ubook.bookCounts}" id="bookCounts" required>
                </div>
                <div class="form-group">
                    <label for="detail">详情(放置位置)</label>
                    <input type="text" class="form-control" name="detail" value="${Ubook.detail}" id="detail" required>
                </div>
                <input type="submit" class="btn btn-primary" value="修改提交">
            </form>
        </div>
    </div>
</div>

<script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-7ymO4nGrkm372HoSbq1OY2DP4pEZnMiA+E0F3zPr+JQQtQ82gQ1HPY3QIVtztVua" crossorigin="anonymous"></script>

</body>
</html>

效果

5. 总结

  • 超链接<a href="${pageContext.request.contextPath}/请求路径">xxx内容</a>

  • 以按钮的样式实现超链接<a class="btn btn-primary" href="${pageContext.request.contextPath}/请求路径">xxx内容</a> ,其中 btn-primary 指定按钮的颜色;

  • 行内元素<span style="color: green;font-weight: bold">${键}</span> ,可以指定值显示的样式,如颜色、粗细等,如果没有取到值,则不显示;

  • 将表单、表格等都放在容器的栅格中:<div class="container-fluid"> ,在容器中可以进行 Bootstrap 的栅格系统设置,学习链接:点此进入;

  • 设置导航栏 navbar 时,可以在导航栏中放置容器 container,再在容器中放置表单 form;

  • 通过 <form class="form-inline"> 可以使得表单下的内容是在一行的,如果表单要提交,则 form 中一定要有 actionmethod 属性,用来指定表单提交的路径以及提交方式,并且还要有提交的按钮:<input type="submit" class="btn btn-primary" value="提交"><button type="submit" class="btn btn-outline-success">提交</button>

  • 隐藏域:前端不显示数据,但是也会将数据提交给后台;

  • 空格&nbsp;

  • 换行<br>

  • 在前端页面取值用 EL 表达式:{键}

  • 所需要的组件可以随时去前端开源工具库 Bootstrap 查找。


二、控制层

控制层作用调用业务层执行业务,跳转页面。

用户进行的每一个操作都有控制类中的一个方法相对应。

1. 查询全部书

// 查询全部的书籍,并且返回到页面
@RequestMapping("/select")
public String select(Model model) {
    List<Books> booksList = booksService.selectAllBooks();
    model.addAttribute("booksList", booksList);
    return "showBooks";
}

说明

  • 对象调用业务层 selectAllBooks 方法,查询到全部书,存放在集合中;
  • 用 Model 对象封装要传递给前端的数据,这样前端页面中就可以通过 EL 表达式 {booksList} 来取到集合对象。

2. 增加书

// 跳转到增加书籍页面
@RequestMapping("/toAdd")
public String toAdd() {
    return "addBook";
}

// 添加书籍,并且跳转到主页面
@RequestMapping("/add")
public String add(Books books) {
    booksService.addBook(books);
    return "redirect:/wed/select";
}

说明

  • 当用户在页面点击【增加书】时,执行第一个请求,跳转到增加书的页面;
  • 用户填写完书的信息后,点【提交】,执行第二个请求,先执行增加业务后,重定向到查询全部书的请求(增加完书后再查询一次全部书)。

3. 修改书

// 跳转到修改信息页面
@RequestMapping("/toUpdate/{bookID}")

public String toUpdate(@PathVariable int bookID, Model model) {
    Books books = booksService.selectBook(bookID);
    model.addAttribute("Ubook", books);
    return "updateBook";
}

// 修改书籍,并且跳转到主页面
@RequestMapping("/update")
public String update(Books books) {
    booksService.updateBook(books);
    return "redirect:/wed/select";
}

说明

  • 当用户在页面点击【修改】时,执行第一个请求,跳转到修改的页面;
    • 这里需要知道要修改哪一本书,因此前端要把书的编号信息作为参数传递给后端,这里使用 RestFul 风格传参
    • 跳转页面时,将要修改的书的全部信息封装后,传递给要跳转的页面,这样在修改书的页面中就可以取到并显示原有的信息。
  • 用户修改完书的信息后,点【修改提交】,执行第二个请求,先执行修改业务后,重定向到查询全部书的请求(修改完书后再查询一次全部书)。

4. 删除书

// 删除书籍
@RequestMapping("/delete/{bookID}")
public String delete(@PathVariable int bookID) {
    booksService.deleteBook(bookID);
    return "redirect:/wed/select";
}

说明

  • 当用户在页面点击【删除】时,执行该请求,先执行删除业务后,重定向到查询全部书的请求(删除完书后再查询一次全部书);
  • 这里需要知道要删除哪一本书,因此前端要把书的编号信息作为参数传递给后端,这里使用 RestFul 风格传参

5. 搜索书

添加新功能时,要从底层开始依次增加:dao 接口 --> 实现类:编写 sql 语句 --> 业务接口 --> 业务实现类 --> 控制类。

dao 接口,定义方法:

// 搜索
List<Books> searchBooksByName(@Param("bookName") String bookName);

dao 接口实现类,sql 语句使用模糊查询

<select id="searchBooksByName" parameterType="java.lang.String" resultType="Books">
	select * from ssmbuild.books where bookName like #{bookName}
</select>

业务接口:

// 搜索
List<Books> searchBooksByName(String bookName);

业务实现类,实现业务方法:

public List<Books> searchBooksByName(String bookName) {
    return mapper.searchBooksByName("%" + bookName + "%");
}

控制类:

// 搜索书籍
@RequestMapping("/search")
public String search(@RequestParam("searchBookName") String bookName, Model model) {
    List<Books> booksList = booksService.searchBooksByName(bookName);
    if (booksList.isEmpty()) {
        model.addAttribute("error", "未查到");
    }
    model.addAttribute("booksList", booksList);
    return "showBooks";
}

说明

  • 当用户在页面搜索框内搜索时,执行该请求,执行搜索业务后,将搜索到的书存放在集合中;
  • 用 Model 对象封装要传递给前端的数据,这样前端页面中就可以通过 EL 表达式 {booksList} 来取到集合对象;
  • 在没有搜索到数据时,用 Model 对象封装 error 数据,这样在前端页面中就可以通过 EL 表达式 ${error} 来显示“未查到”。

查到书的实现效果

未查到书的实现效果


三、总结

  1. 前端页面给后端传递数据

    • 如果是页面中已经存在的数据,可以用 RestFul 风格传参:

      • 前端:请求地址为:/路径/参数的值
      • 后端:请求地址为:/路径/{方法中的参数名} ,并且方法的参数前需要加注解 @PathVariable 声明。
    • 如果是需要用户输入后,通过表单提交的数据:

      • 前端:请求地址为:/路径 不需要加参数,但是输入的数据必须要有 name 属性;
      • 后端:请求地址为:/路径 不需要加参数,但是方法的参数前需要加注解 @RequestParam(“name的值”) 声明,如果参数是一个对象,则可以直接在方法的参数中定义一个对象即可。

  1. 后端给前端页面传递数据:用 Model 对象封装要传递给前端的数据,这样前端页面中就可以通过 EL 表达式 ${键} 来取到数据。
  2. 添加新功能时,要从底层开始依次增加:dao 接口 --> 实现类:编写 sql 语句 --> 业务接口 --> 业务实现类 --> 控制类。
  3. 控制类的方法中,重定向不用写项目名。
  4. 重定向不能直接访问 WEB-INF 下的资源,但可以通过重定向到请求地址,来间接访问,如:return "redirect:/wed/select"
  5. 在 SSM 的项目中,在服务器开启时,如果手动更改了数据库的数据,前端显示数据不能同步更新,使用 SpringBoot 可以解决。
  6. 可以看懂前端的代码。
  7. 上篇中主要是搭框架,中篇是对上篇的优化总结,下篇中是进行了具体的开发,开发时要逐步完善功能,不断进行改进

四、说明

整合 SSM 上篇:点此进入
整合 SSM 中篇:点此进入


注意:

前端开源工具库 Bootstrap 官网:https://v4.bootcss.com/,注意使用 Bootstrap 有特定的要求,可以通过中文文档进行学习和使用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode—86.分隔链表【中等】

2023每日刷题&#xff08;六十九&#xff09; Leetcode—86.分隔链表 实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* partition(struct ListNode* head, int x) {struct ListNode…

Arduino平台软硬件原理及使用——PWM脉宽调制信号的原理及使用

文章目录&#xff1a; 一、先看百度百科给出的定义及原理 二、一图看懂PWM脉宽调制原理 三、Arduino中PWM脉宽调制信号的使用 一、先看百度百科给出的定义及原理 脉冲宽度调制是一种模拟控制方式&#xff0c;根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置&#xff0c;…

C预处理 | pragma详解

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

pci_enable_device()

前言 在 PCI 总线下&#xff0c;当 PCIe 设备和 PCIe 驱动匹配后&#xff0c;就会执行驱动的 probe() 函数来初始化设备&#xff0c;以让设备正常运行。 在 probe() 函数中&#xff0c;最先做的事情就是执行 pci_enable_device() 来使能设备。如果设备都无法使能的话&#xff…

MES系统是什么?MES系统的功能有哪些?

在现代制造业的快速发展中&#xff0c;所有规模的企业都面临着类似的挑战&#xff1a;如何提高生产效率、确保产品质量、减少浪费、降低成本&#xff0c;同时迅速响应市场变化。而在这个过程中&#xff0c;传统企业管理往往有以下几个典型痛点&#xff1a; 纸质文件堆叠如山&a…

框架面试题

文章目录 1. spring中的bean是线程安全的吗2. 事务的实现--AOP3. 项目中用到的AOP4.spring中事务的失效场景5. Bean的生命周期6.spring中的循环引用问题7. springMVC的执行流程8. springboot自动装配原理9. 常见注解10 Mybatis11 Mybatis一二级缓存 1. spring中的bean是线程安全…

约束-练习题

练习1 已经存在数据库test04_emp&#xff0c;两张表emp2和dept2 CREATE DATABASE test04_emp; use test04_emp; CREATE TABLE emp2( id INT, emp_name VARCHAR(15) ); CREATE TABLE dept2( id INT, dept_name VARCHAR(15) );题目: 向表emp2的id列中添加PRIMARY KEY约束向表d…

前端---css 的介绍

1. css 的定义 css(Cascading Style Sheet)层叠样式表&#xff0c;它是用来美化页面的一种语言。 没有使用css的效果图 使用css的效果图 2. css 的作用 美化界面, 比如: 设置标签文字大小、颜色、字体加粗等样式。控制页面布局, 比如: 设置浮动、定位等样式。 3. css 的基本语…

【2024 行人重识别最新进展】ReID3D:首个关注激光雷达行人 ReID 的工作!

【2024 行人重识别最新进展】ReID3D&#xff1a;首个关注激光雷达行人 ReID 的工作&#xff01; 摘要&#xff1a;数据集&#xff1a;方法模型&#xff1a;多任务预训练&#xff1a;ReID Network&#xff1a; 实验结果&#xff1a;结论&#xff1a; 来源&#xff1a;Arxiv 2023…

[Linux] MySQL数据库之事务

一、事务的概念 事务就是一组数据库操作序列&#xff08;包含一个或者多个 SQL 操作命令&#xff09;&#xff0c;事务会把所有 操作看作是一个不可分割的整体向数据库系统提交或撤消操作&#xff0c;所有操作要么都执行&#xff0c;要么都不执行。 事务是一种机制、一个操作序…

Java 基础学习(十七)多线程高级

1 多线程并发安全&#xff08;续&#xff09; 1.1 synchronized方法 1.1.1 synchronized方法 与同步代码块不同&#xff0c;同步方法将子线程要访问的代码放到一个方法中&#xff0c;在该方法的名称前面加上关键字synchronized即可&#xff0c;这里默认的锁为this&#xff0…

短视频矩阵系统的崛起和影响

近年来&#xff0c;短视频矩阵系统已经成为了社交媒体中的一股新势力。这个新兴的社交媒体形式以其独特的魅力和吸引力&#xff0c;迅速吸引了大量的用户。这个系统简单来说就是将海量短视频整合在一个平台上&#xff0c;使用户可以方便地观看和分享好玩有趣的短视频。 短视频…

测试员有必要转测试开发吗?

为什么很多公司都在招测试开发&#xff1f; 质量保证和软件稳定性&#xff1a;测试开发人员在软件开发生命周期中扮演着关键的角色&#xff0c;他们负责编写和执行测试代码&#xff0c;以确保软件的质量和稳定性。他们可以帮助发现和修复潜在的问题和缺陷&#xff0c;提高软件…

短视频矩阵系统源码是如何运作的?

在当今数字化时代&#xff0c;短视频已经成为人们日常生活中的重要娱乐方式。而为了更好地满足用户需求以及提升使用体验&#xff0c;短视频平台需要依靠一个强大而高效的短视频矩阵系统。那么&#xff0c;这个系统又是如何运作的呢&#xff1f; 首先&#xff0c;短视频矩阵系…

[机器人-1]:开源MIT Min cheetah机械狗设计(一):系统方案及硬件解析

目录 一、MIT Min cheetah机械狗系统设计 1.1 指标需求 1.2 系统框图 1&#xff09;腿部硬件构成&#xff1a;机械狗每条腿 (共四条腿&#xff09; 2&#xff09; 数据通信转换板部分 2 STM32 * 2 CAN * (4 * 3)&#xff1a;FOC算法 3&#xff09;UP board 计算机板卡硬件…

【C++】explicit关键字

explicit关键字通常用于声明构造&#xff0c;是为了防止编译器进行隐式类型转换。 当加上explicit关键字后&#xff0c;只能显示的调用构造函数

Android---Kotlin 学习009

继承 在 java 里如果一个类没有被 final 关键字修饰&#xff0c;那么它都是可以被继承的。而在 kotlin 中&#xff0c;类默认都是封闭的&#xff0c;要让某个类开放继承&#xff0c;必须使用 open 关键字修饰它&#xff0c;否则会编译报错。此外在子类中&#xff0c;如果要复写…

09-为Java开疆拓土的ZGC深度剖析

文章目录 引言ZGC出现背景STW带来的问题手机系统(Android) 显示卡顿证券交易系统实时性要求大数据平台(Hadoop集群性能) 垃圾回收器的发展 ZGC介绍ZGC中JVM内存布局和设计为什么这么设计&#xff1f; ZGC支持NUMA&#xff08;了解即可&#xff09; ZGC的核心概念指针着色技术&a…

智能优化算法应用:基于人工蜂鸟算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于人工蜂鸟算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于人工蜂鸟算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.人工蜂鸟算法4.实验参数设定5.算法结果6.…

Redis源码精读:字符串

文章目录 前言代码位置核心类型SDS结构获取sds字符串的元数据的宏获取字符串长度重新设置sds长度创建字符串感悟最后 前言 Redis中实现了sds&#xff08;simple dynamic string&#xff09;这种字符串&#xff0c;它比c语言标准库的char*字符串更加实用 代码位置 src/sdc.h …