JavaWeb:servlet+jsp+mybatis商品管理增删改查

news2024/11/15 13:41:16

文章目录

      • 1、环境准备
        • 1.1、创建数据库
        • 1.2、创建项目导入依赖
        • 1.3、创建包
        • 1.4、创建实体类
        • 1.5、准备mybatis环境
        • 1.6、编写Mybatis工具类
        • 1.7、编写主页面
      • 2、功能实现
        • 2.1、查询所有
        • 2.2、添加功能
        • 2.3、修改数据回显
        • 2.4、修改数据
        • 2.5、删除数据

1、环境准备

1.1、创建数据库
CREATE DATABASE jsp_test;
USE jsp_test;

-- 删除tb_brand表
DROP TABLE IF EXISTS tb_brand;
-- 创建tb_brand表
CREATE TABLE tb_brand
(
    -- id 主键
    id           INT PRIMARY KEY AUTO_INCREMENT,
    -- 品牌名称
    brand_name   VARCHAR(20),
    -- 企业名称
    company_name VARCHAR(20),
    -- 排序字段
    ordered      INT,
    -- 描述信息
    description  VARCHAR(100),
    -- 状态:0:禁用  1:启用
    STATUS       INT
)DEFAULT CHARSET=utf8;
-- 添加数据
INSERT INTO tb_brand (brand_name, company_name, ordered, description, STATUS)
VALUES ('三只松鼠', '三只松鼠股份有限公司', 5, '好吃不上火', 0),
       ('华为', '华为技术有限公司', 100, '华为致力于把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界', 1),
       ('小米', '小米科技有限公司', 50, 'are you ok', 1);


SELECT * FROM tb_brand;

SELECT id, brand_name AS brandName, company_name AS companyName FROM tb_brand;
1.2、创建项目导入依赖

创建新的模块,引入坐标。

我们只要分析出要用到哪儿些技术,那么需要哪儿些坐标也就明确了 需要操作数据库。

  1. mysql的驱动包 要使用mybatis框架。mybaits的依赖包
  2. web项目需要用到servlet和jsp。servlet和jsp的依赖包
  3. 需要使用 jstl 进行数据展示。jstl的依赖包
<dependencies>
    <!--mysql-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.46</version>
    </dependency>

    <!-- mybatis -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.5</version>
    </dependency>

    <!--servlet-->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
    </dependency>

    <!--jsp-->
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.2</version>
        <scope>provided</scope>
    </dependency>

    <!--jstl-->
    <dependency>
        <groupId>jstl</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>
</dependencies>
1.3、创建包

创建不同的包结构,用来存储不同的类。包结构如下

image-20240119150855009

1.4、创建实体类

在 pojo 包下创建名为 Brand 的类。

public class Brand {
    private Integer id;
    // 品牌名称
    private String brandName;
    // 企业名称
    private String companyName;
    // 排序字段
    private Integer ordered;
    // 描述信息
    private String description;
    // 状态:0:禁用  1:启用
    private Integer status;
	/**
	 此处省略了get(),set()等方法,自己生成补全
	**/
}
1.5、准备mybatis环境

定义核心配置文件 Mybatis-config.xml ,并将该文件放置在 resources 下

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <!--在控制台显示SQL语句-->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    
    <!--起别名-->
    <typeAliases>
        <package name="com.demo.pojo"/>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/jsp_test?useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <!--扫描mapper-->
        <package name="com.demo.mapper"/>
    </mappers>
</configuration>
1.6、编写Mybatis工具类

在 com.demo 包下创建 utils 包,并在该包下创建名为 SqlSessionFactoryUtils 工具类

// 这是MyBatis的工具类,简化MyBatis代码
public class MyBatisUtils {
    private static SqlSessionFactory sqlSessionFactory;
    // 我们只需要一个SqlSessionFactory,在静态代码块中创建SqlSessionFactory
    static {
        try {
            // 编写代码让MyBatis跑起来,执行SQL语句
            String resource = "mybatis-config.xml";
            // 加载核心配置文件
            InputStream inputStream = Resources.getResourceAsStream(resource);
            // 得到SqlSession工厂,赋值给成员变量
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 返回SqlSessionFactory
    public static SqlSessionFactory getSqlSessionFactory() {
        return sqlSessionFactory;
    }

    // 返回SqlSession
    public static SqlSession openSession() {
        return sqlSessionFactory.openSession();
    }

    public static SqlSession openSession(boolean autoCommit) {
        return sqlSessionFactory.openSession(autoCommit);
    }
}
1.7、编写主页面

编写一个基础的前端主页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>品牌首页</title>
</head>
<body>
<a href="selectAllServlet">查看所有</a>
</body>
</html>

2、功能实现

2.1、查询所有

​ 当我们点击 index.html 页面中的 查询所有 这个超链接时,就能查询到上图右半部分的数据。 对于上述的功能,点击 查询所有 超链接是需要先请后端的 servlet ,由 servlet 跳转到对应的页面进行数据的动态展 示。而整个流程如下图:

image-20240119160758328

功能实现

1、在 mapper 包下创建创建 BrandMapper 接口,在接口中定义 selectAll() 方法

public interface BrandMapper {
    @Select("select * from tb_brand;")
    List<Brand> selectAll();
}

2、在 service 包下创建 BrandService 类

public class BrandService {
    /**
     * 查询品牌所有数据
     * @return
     */
    public List<Brand> selectAll() {
        SqlSession sqlSession = MyBatisUtils.openSession();

        BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);

        List<Brand> brands = mapper.selectAll();

        sqlSession.close();
        return brands;
    }
}

3、在 web 包下创建名为 SelectAllServlet 的 servlet

​ 该 servlet 的逻辑如下: 调用 BrandService 的 selectAll() 方法进行业务逻辑处理,并接收返回的结果 将上一步返回的结果存储到 request 域对象中 跳转到 brand.jsp 页面进行数据的展示

@WebServlet(value = "/selectAllServlet")
public class SelectAllServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        BrandService brandService = new BrandService();
        List<Brand> brands =  brandService.selectAll();

        request.setAttribute("brands",brands);

        request.getRequestDispatcher("/brandList.jsp").forward(request,response);

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        doPost(request,response);
    }
}

4、编写brand.jsp页面

​ brand.jsp 页面在表格中使用 JSTL 和 EL表达式 从request域对象中获取名为 brands 的集合数据 并展示出来。页面内容如下:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="com.demo.pojo.Brand" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>所有品牌</title>
</head>
<body>

<input type="button" value="新增" οnclick="location.href='addBrand.jsp'"><br>
<hr>

<table border="1" cellspacing="0" width="80%">
    <tr>
        <th>序号</th>
        <th>品牌名称</th>
        <th>企业名称</th>
        <th>排序</th>
        <th>品牌介绍</th>
        <th>状态</th>
        <th>操作</th>
    </tr>
    <c:forEach items="${brands}" var="brand">
        <tr align="center">
            <td>${brand.id}</td>
            <td>${brand.brandName}</td>
            <td>${brand.companyName}</td>
            <td>${brand.ordered}</td>
            <td>${brand.description}</td>
            <c:if test="${brand.status == 0}">
                <td>禁用</td>
            </c:if>
            <c:if test="${brand.status == 1}">
                <td>启用</td>
            </c:if>
            <td><a href="selectByIdServlet?id=">修改</a> <a href="deleteByIdServlet?id=">删除</a></td>
        </tr>
    </c:forEach>

</table>
</body>
</html>
2.2、添加功能

image-20240119175722071

​ 上图是做 添加 功能流程。点击 新增 按钮后,会先跳转到 addBrand.jsp 新增页面,在该页面输入要添加的数据,输入完 毕后点击 提交 按钮,需要将数据提交到后端,而后端进行数据添加操作,并重新将所有的数据查询出来。整个流程如下:

image-20240119175736756

功能实现

1、在 BrandMapper 接口,在接口中定义 add(Brand brand) 方法

@Insert("insert into tb_brand values (null,#{brandName},#{companyName},#{ordered},#{description},#{status});")
void addBrand(Brand brand);

2、在 BrandService 类中定义添加品牌数据方法 add(Brand brand)

public void addBrand(Brand brand) {
    SqlSession sqlSession = MyBatisUtils.openSession();

    BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);

    mapper.addBrand(brand);

    sqlSession.commit();

    sqlSession.close();
}

3、在 web 包下创建 AddServlet 的 servlet

​ 该 servlet 的逻辑如下: 设置处理post请求乱码的字符集 接收客户端提交的数据 将接收到的数据封装到 Brand 对象中 调用 BrandService 的 add() 方法进行添加的业务逻辑处理 跳转到 selectAllServlet 资源重新查询数据

@WebServlet(value = "/addServlet")
public class AddServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        Brand brand = new Brand();

        Brand brand = new Brand();

		String brandName = request.getParameter("brandName");
    	String companyName = request.getParameter("companyName");
		String ordered = request.getParameter("ordered");
		String description = request.getParameter("description");
		String status = request.getParameter("status");

		brand.setBrandName(brandName);
		brand.setCompanyName(companyName);
		brand.setOrdered(Integer.parseInt(ordered));
		brand.setDescription(description);
		brand.setStatus(Integer.parseInt(status));

            //进行添加
        BrandService brandService = new BrandService();
        brandService.addBrand(brand);

        response.sendRedirect("selectAllServlet");

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        doGet(request,response);
    }
}

但是我们可以看到上面的流程过于复杂,获取数据和添加数据太过于繁琐,所以我们可以导入一个工具类进行优化

添加依赖:

<dependency>
    <groupId>commons-beanutils</groupId>
    <artifactId>commons-beanutils</artifactId>
    <version>1.9.3</version>
</dependency>

修改优化代码:

@WebServlet(value = "/addServlet")
public class AddServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        Brand brand = new Brand();

        Map<String, String[]> parameterMap = request.getParameterMap();
        try {
            BeanUtils.populate(brand,parameterMap);

            //进行添加
            BrandService brandService = new BrandService();
            brandService.addBrand(brand);

            response.sendRedirect("selectAllServlet");

        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        } catch (InvocationTargetException e) {
            throw new RuntimeException(e);
        }


    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        doGet(request,response);
    }
}

4、编写前端页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>添加品牌</title>
</head>
<body>

<h3>添加品牌</h3>
<form action="addServlet" method="post">
    品牌名称:<input name="brandName"><br>
    企业名称:<input name="companyName"><br>
    排序:<input name="ordered"><br>
    描述信息:<textarea rows="5" cols="20" name="description"></textarea><br>
    状态:
    <input type="radio" name="status" value="0">禁用
    <input type="radio" name="status" value="1">启用<br>

    <input type="submit" value="提交">
</form>
</body>
</html>
2.3、修改数据回显

image-20240119191610053

​ 上图就是回显数据的效果。要实现这个效果,那当点击 修改 按钮时不能直接跳转到 update.jsp 页面,而是需要先带着当 前行数据的 id 请求后端程序,后端程序根据 id 查询数据,将数据存储到域对象中跳转到 update.jsp 页面进行数据展 示。整体流程如下

image-20240119191636311

功能实现

1、编写BrandMapper方法

@Select("select * from tb_brand where id = #{id};")
Brand selectById(int id);

2、编写BrandService方法

​ 在 BrandService 类中定义根据id查询数据方法 selectById(int id)

public Brand selectById(int id) {
    SqlSession sqlSession = MyBatisUtils.openSession();

    BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);

    Brand brand = mapper.selectById(id);

    sqlSession.close();

    return brand;
}

3、在 web 包下创建 SelectByIdServlet 的 servlet

@WebServlet(value = "/selectByIdServlet")
public class SelectByIdServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        String idStr = request.getParameter("id");
        int id = Integer.parseInt(idStr);

        BrandService brandService = new BrandService();
        Brand brand = brandService.selectById(id);

        request.setAttribute("brand",brand);

        request.getRequestDispatcher("updateBrand.jsp").forward(request,response);

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        doGet(request,response);
    }
}
2.4、修改数据

做完回显数据后,接下来我们要做修改数据了,而下图是修改数据的效果:

image-20240119195432708

在修改页面进行数据修改,点击 提交 按钮,会将数据提交到后端程序,后端程序会对表中的数据进行修改操作,然后重新 进行数据的查询操作。整体流程如下:

image-20240119195458416

功能实现

1、编写BrandMapper方法

​ 在 BrandMapper 接口,在接口中定义 update(Brand brand) 方法

@Update("update tb_brand set brand_name = #{brandName},company_name = #{companyName},ordered = #{ordered},description = #{description},status = #{status} where id = #{id};")
void updateBrand(Brand brand);

2、编写BrandService方法

​ 在 BrandService 类中定义根据id查询数据方法 update(Brand brand)

public void updateBrand(Brand brand) {
    SqlSession sqlSession = MyBatisUtils.openSession();
    BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
    mapper.updateBrand(brand);
    sqlSession.commit();
    sqlSession.close();
}

3、编写servlet 在 web 包下创建 updateServlet

@WebServlet(value = "/updateServlet")
public class UpdateServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");

        Brand brand = new Brand();

        Map<String, String[]> parameterMap = request.getParameterMap();

        try {
            BeanUtils.populate(brand,parameterMap);
            BrandService brandService = new BrandService();
            brandService.updateBrand(brand);
            response.sendRedirect("selectAllServlet");
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);

        } catch (InvocationTargetException e) {
            throw new RuntimeException(e);
        }

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        doGet(request,response);
    }
}

4、编写前端页面

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

<h3>修改品牌</h3>
<form action="updateServlet" method="post">
    <input type="hidden" name="id" value="${brand.id}">
    品牌名称:<input name="brandName" value="${brand.brandName}"><br>
    企业名称:<input name="companyName" value="${brand.companyName}"><br>
    排序:<input name="ordered" value="${brand.ordered}"><br>
    描述信息:<textarea rows="5" cols="20" name="description">${brand.description}</textarea><br>
    状态:
    <c:if test="${brand.status == 0}">
        <input type="radio" name="status" value="0" checked>禁用
        <input type="radio" name="status" value="1">启用<br>
    </c:if>
    <c:if test="${brand.status == 1}">
        <input type="radio" name="status" value="0">禁用
        <input type="radio" name="status" value="1" checked>启用<br>
    </c:if>
    <input type="submit" value="提交">
</form>

</body>
</html>
2.5、删除数据

1、编写servlet 在 web 包下创建 DeleteServlet

@WebServlet(value = "/deleteByIdServlet")
public class DeleteByIdServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String idStr = request.getParameter("id");
        int id = Integer.parseInt(idStr);
        BrandService brandService = new BrandService();
        brandService.deleteBrand(id);
        response.sendRedirect("selectAllServlet");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        doGet(request,response);
    }
}

2、编写BrandService方法

​ 在 BrandService 类中定义根据id查询数据方法 deleteBrand(int id)

public void deleteBrand(int id) {
    SqlSession sqlSession = MyBatisUtils.openSession();
    BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
    mapper.deleteBrand(id);
    sqlSession.commit();
    sqlSession.close();
}

3、编写BrandMapper方法

​ 在 BrandMapper 接口,在接口中定义 deleteBrand(int id) 方法

@Delete("delete from tb_brand where id = #{id}")
void deleteBrand(int id);

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

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

相关文章

Python文件自动化处理

os模块 Python标准库和操作系统有关的操作创建、移动、复制文件和文件夹文件路径和名称处理 路径的操作 获取当前Python程序运行路径不同操作系统之间路径的表示方式 windows中采用反斜杠(\)作为文件夹之间的分隔符 Mac和Linux中采用斜杠(/)作为文件夹之间的分隔符 把文件…

【用队列实现栈】【用栈实现队列】Leetcode 232 225

【用队列实现栈】【用栈实现队列】Leetcode 232 225 队列的相关操作栈的相关操作用队列实现栈用栈实现队列 ---------------&#x1f388;&#x1f388;题目链接 用队列实现栈&#x1f388;&#x1f388;------------------- ---------------&#x1f388;&#x1f388;题目链…

React Store及store持久化的使用

1.安装 npm insatll react-redux npm install reduxjs/toolkit npm install redux-persist2. 使用React Toolkit创建counterStore并配置持久化 store/modules/counterStore.ts&#xff1a; import { createSlice } from reduxjs/toolkit// 定义状态类型 interface Action {…

4个值得使用的免费爬虫工具

在信息时代&#xff0c;数据的获取对于各行业都至关重要。而在数据采集的众多工具中&#xff0c;免费的爬虫软件成为许多用户的首选。本文将专心分享四款免费爬虫工具&#xff0c;突出介绍其中之一——147采集软件&#xff0c;为您揭示这些工具的优势和应用&#xff0c;助您在数…

使用Sqoop从Oracle数据库导入数据

在大数据领域&#xff0c;将数据从关系型数据库&#xff08;如Oracle&#xff09;导入到Hadoop生态系统是一项常见的任务。Sqoop是一个强大的工具&#xff0c;可以帮助轻松完成这项任务。本文将提供详细的指南&#xff0c;以及丰富的示例代码&#xff0c;帮助了解如何使用Sqoop…

什么是低代码(Low-Code)?低代码平台的适用人群

低代码平台是一种革命性的工具&#xff0c;它让非专业的开发人员也能轻松创建应用程序。通过直观的可视化界面和拖放功能&#xff0c;开发人员能够轻松地构建和部署应用程序&#xff0c;无需专业的编程知识。低代码平台的出现&#xff0c;降低了应用程序开发的门槛&#xff0c;…

对象存储, 开源MinIO docker-compose.yml 文件

文章目录 python SDK 文档地址&#xff1a;docker-compose.yml 文件控制台使用&#xff1a;应用服务中使用样例&#xff1a; python SDK 文档地址&#xff1a; https://min.io/docs/minio/linux/developers/python/API.html docker-compose.yml 文件 version: 3services:min…

自动化测试:5分钟了解Selenium以及如何提升自动化测试的效果

在快节奏的技术世界里&#xff0c;自动化测试已经成为确保 Web 应用程序质量和性能的重要手段。自动化测试不仅加快了测试过程&#xff0c;还提高了测试的重复性和准确性。Selenium&#xff0c;作为领先的自动化测试工具之一&#xff0c;为测试人员提供了强大的功能来模拟用户在…

站长为什么都说WordPress太复杂不会用要放弃?

网络上经常看到有站长说要放弃WordPress&#xff0c;理由各有不同&#xff0c;比如有些说WordPress太复杂不会用&#xff1b;有些说WordPress是国外建站系统&#xff0c;在国内用来搭建访问速度太慢&#xff1b;也有些说WordPress是针对谷歌优化的&#xff0c;不适合国内的搜索…

springboot知识04

1、集成swaggershiro放行 &#xff08;1&#xff09;导包 &#xff08;2&#xff09;SwaggerConfig&#xff08;公共&#xff09; package com.smart.community.common.swagger.config;import io.swagger.annotations.ApiOperation; import org.springframework.beans.facto…

C语言基础语法跟练 day4

41、牛牛有一个半径为 r 的球&#xff0c;他想知道这个球的体积。 #include <stdio.h> #include<math.h> int main() {float r;scanf("%f",&r);float v (4.0/3)*3.14*pow(r,3);printf("%.2f",v);return 0; } 42、小乐乐比较懒惰&#x…

Red Hat Enterprise Linux 9.3 安装图解

引导和开始安装 选择倒计时结束前&#xff0c;通过键盘上下键选择下图框选项&#xff0c;启动图形化安装过程。需要注意的不同主板默认或者自行配置的固件类型不一致&#xff0c;引导界面有所不同。也就是说使用UEFI和BIOS的安装引导界面是不同的&#xff0c;如图所示。若手动调…

Stable Code 3B:边缘编程

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

力扣hot100 最长有效括号 动态规划

Problem: 32. 最长有效括号 文章目录 思路Code 思路 &#x1f468;‍&#x1f3eb; 参考题解 Code ⏰ 时间复杂度: O ( n ) O(n) O(n) &#x1f30e; 空间复杂度: O ( n ) O(n) O(n) class Solution {public int longestValidParentheses(String s){int n s.length();…

SwiftUI 框架有哪些主要优势

SwiftUI是苹果公司在2019年推出的一种用于构建用户界面的框架&#xff0c;它使用Swift语言编写&#xff0c;并且与iOS、iPadOS、macOS、watchOS和tvOS等平台兼容。下面简单的看下有哪些主要的优势。 声明式的界面描述 使用声明式编程风格&#xff0c;通过简洁的代码描述用户界…

C#,入门教程(21)——命名空间(namespace)与程序结构的基础知识

上一篇&#xff1a; C#&#xff0c;入门教程(20)——列表&#xff08;List&#xff09;的基础知识https://blog.csdn.net/beijinghorn/article/details/124094382 编写软件&#xff08;大软件称为系统&#xff09;与盖大楼一个道理。 假设咱们现在需要盖一座名为“天梯大厦”的…

移动端 h5-table react版本支持虚拟列表

介绍 适用于 react ts 的 h5 移动端项目 table 组件 github 链接 &#xff1a;https://github.com/duKD/react-h5-table 有帮助的话 给个小星星 有两种表格组件 常规的&#xff1a; 支持 左侧固定 滑动 每行点击回调 支持 指定列排序 支持滚动加载更多 效果和之前写的vue…

2023江苏职教高考计算机技能考试--填空题解析

/*--------------- 【程序填空】 ----------------- 题目&#xff1a;验证任意一个大于1的正整数都可以找到 一串连续奇数&#xff0c;它们的和等于该整数的立方。 例如&#xff1a;4的立方等于64&#xff0c;6413579111315程序运行结果如下&#xff1a;3的立方等于27&#xff…

Vue四个阶段,八个钩子函数

- 创造阶段&#xff1a;创建Vue实例和初始化数据事件&#xff0c;数据代理&#xff0c;监测watch - beforeCreate&#xff0c;只是创建实例&#xff0c;不能this.$el,this.msg,this.方法名&#xff08;&#xff09; - created&#xff0c;数据代理了&#xff0c;能v…

上位机编程:CP56Time2a格式精讲

Cp56Time2a介绍&#xff1a; Cp56Time2a是西门子PLC&#xff08;可编程逻辑控制器&#xff09;中用于时间数据传输的一种特殊格式&#xff0c;主要用于PCS7和基于TCP/IP的S7通信过程中。这种时间格式主要为了确保在不同的系统和设备之间进行精确的时间同步。 Cp56Time2a格式&a…