【SpringMVC】SSM整合

news2024/11/24 7:19:55

1,SSM整合

前面我们已经把MybatisSpringSpringMVC三个框架进行了学习,今天主要的内容就是把这三个框架整合在一起完成我们的业务功能开发,具体如何来整合,我们一步步来学习。

1. 流程分析

(1) 创建工程

  • 创建一个Maven的web工程

  • pom.xml添加SSM需要的依赖jar包

  • 编写Web项目的入口配置类,实现AbstractAnnotationConfigDispatcherServletInitializer重写以下方法

    • getRootConfigClasses() :返回Spring的配置类->需要SpringConfig配置类
    • getServletConfigClasses() :返回SpringMVC的配置类->需要SpringMvcConfig配置类
    • getServletMappings() : 设置SpringMVC请求拦截路径规则
    • getServletFilters() :设置过滤器,解决POST请求中文乱码问题

(2)SSM整合[重点是各个配置的编写]

  • SpringConfig
    • 标识该类为配置类 @Configuration
    • 扫描Service所在的包 @ComponentScan
    • 在Service层要管理事务 @EnableTransactionManagement
    • 读取外部的properties配置文件 @PropertySource
    • 整合Mybatis需要引入Mybatis相关配置类 @Import
      • 第三方数据源配置类 JdbcConfig
        • 构建DataSource数据源,DruidDataSouroce,需要注入数据库连接四要素, @Bean @Value
        • 构建平台事务管理器,DataSourceTransactionManager,@Bean
      • Mybatis配置类 MybatisConfig
        • 构建SqlSessionFactoryBean并设置别名扫描与数据源,@Bean
        • 构建MapperScannerConfigurer并设置DAO层的包扫描
  • SpringMvcConfig
    • 标识该类为配置类 @Configuration
    • 扫描Controller所在的包 @ComponentScan
    • 开启SpringMVC注解支持 @EnableWebMvc

(3)功能模块[与具体的业务模块有关]

  • 创建数据库表
  • 根据数据库表创建对应的模型类
  • 通过Dao层完成数据库表的增删改查(接口+自动代理)
  • 编写Service层[Service接口+实现类]
    • @Service
    • @Transactional
    • 整合Junit对业务层进行单元测试
      • @RunWith
      • @ContextConfiguration
      • @Test
  • 编写Controller层
    • 接收请求 @RequestMapping @GetMapping @PostMapping @PutMapping @DeleteMapping
    • 接收数据 简单、POJO、嵌套POJO、集合、数组、JSON数据类型
      • @RequestParam
      • @PathVariable
      • @RequestBody
    • 转发业务层
      • @Autowired
    • 响应结果
      • @ResponseBody

2. 整合配置

掌握上述的知识点后,接下来,我们就可以按照上述的步骤一步步的来完成SSM的整合。

步骤1:创建Maven的web项目

可以使用Maven的骨架创建

在这里插入图片描述

步骤2:添加依赖

pom.xml添加SSM所需要的依赖jar包

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.itheima</groupId>
  <artifactId>springmvc_08_ssm</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.2.10.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>5.2.10.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>5.2.10.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.6</version>
    </dependency>

    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>1.3.0</version>
    </dependency>

    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.47</version>
    </dependency>

    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.1.16</version>
    </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>

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

    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.0</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.1</version>
        <configuration>
          <port>80</port>
          <path>/</path>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>


步骤3:创建项目包结构

在这里插入图片描述

  • config目录存放的是相关的配置类
  • controller编写的是Controller类
  • dao存放的是Dao接口,因为使用的是Mapper接口代理方式,所以没有实现类包
  • service存的是Service接口,impl存放的是Service实现类
  • resources:存入的是配置文件,如Jdbc.properties
  • webapp:目录可以存放静态资源
  • test/java:存放的是测试类

步骤4:创建SpringConfig配置类

@Configuration
@ComponentScan({"com.itheima.service"})
@PropertySource("classpath:jdbc.properties")
@Import({JdbcConfig.class,MyBatisConfig.class})
@EnableTransactionManagement
public class SpringConfig {
}

步骤5:创建JdbcConfig配置类

public class JdbcConfig {
    @Value("${jdbc.driver}")
    private String driver;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.username}")
    private String username;
    @Value("${jdbc.password}")
    private String password;

    @Bean
    public DataSource dataSource(){
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driver);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }

    @Bean
    public PlatformTransactionManager transactionManager(DataSource dataSource){
        DataSourceTransactionManager ds = new DataSourceTransactionManager();
        ds.setDataSource(dataSource);
        return ds;
    }
}

步骤6:创建MybatisConfig配置类

public class MyBatisConfig {
    @Bean
    public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource){
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSource);
        factoryBean.setTypeAliasesPackage("com.itheima.domain");
        return factoryBean;
    }

    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer(){
        MapperScannerConfigurer msc = new MapperScannerConfigurer();
        msc.setBasePackage("com.itheima.dao");
        return msc;
    }
}

步骤7:创建jdbc.properties

在resources下提供jdbc.properties,设置数据库连接四要素

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm_db
jdbc.username=root
jdbc.password=root

步骤8:创建SpringMVC配置类

@Configuration
@ComponentScan("com.itheima.controller")
@EnableWebMvc
public class SpringMvcConfig {
}

步骤9:创建Web项目入口配置类

public class ServletConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
    //加载Spring配置类
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{SpringConfig.class};
    }
    //加载SpringMVC配置类
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringMvcConfig.class};
    }
    //设置SpringMVC请求地址拦截规则
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
    //设置post请求中文乱码过滤器
    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter filter = new CharacterEncodingFilter();
        filter.setEncoding("utf-8");
        return new Filter[]{filter};
    }
}

至此SSM整合的环境就已经搭建好了。在这个环境上,我们如何进行功能模块的开发呢?

3. 功能模块开发

需求:对表tbl_book进行新增、修改、删除、根据ID查询和查询所有

步骤1:创建数据库及表

create database ssm_db character set utf8;
use ssm_db;
create table tbl_book(
  id int primary key auto_increment,
  type varchar(20),
  name varchar(50),
  description varchar(255)
)

insert  into `tbl_book`(`id`,`type`,`name`,`description`) values (1,'计算机理论','Spring实战 第五版','Spring入门经典教程,深入理解Spring原理技术内幕'),(2,'计算机理论','Spring 5核心原理与30个类手写实践','十年沉淀之作,手写Spring精华思想'),(3,'计算机理论','Spring 5设计模式','深入Spring源码刨析Spring源码中蕴含的10大设计模式'),(4,'计算机理论','Spring MVC+Mybatis开发从入门到项目实战','全方位解析面向Web应用的轻量级框架,带你成为Spring MVC开发高手'),(5,'计算机理论','轻量级Java Web企业应用实战','源码级刨析Spring框架,适合已掌握Java基础的读者'),(6,'计算机理论','Java核心技术 卷Ⅰ 基础知识(原书第11版)','Core Java第11版,Jolt大奖获奖作品,针对Java SE9、10、11全面更新'),(7,'计算机理论','深入理解Java虚拟机','5个纬度全面刨析JVM,大厂面试知识点全覆盖'),(8,'计算机理论','Java编程思想(第4版)','Java学习必读经典,殿堂级著作!赢得了全球程序员的广泛赞誉'),(9,'计算机理论','零基础学Java(全彩版)','零基础自学编程的入门图书,由浅入深,详解Java语言的编程思想和核心技术'),(10,'市场营销','直播就这么做:主播高效沟通实战指南','李子柒、李佳奇、薇娅成长为网红的秘密都在书中'),(11,'市场营销','直播销讲实战一本通','和秋叶一起学系列网络营销书籍'),(12,'市场营销','直播带货:淘宝、天猫直播从新手到高手','一本教你如何玩转直播的书,10堂课轻松实现带货月入3W+');

步骤2:编写模型类

public class Book {
    private Integer id;
    private String type;
    private String name;
    private String description;
    //getter...setter...toString省略
}

步骤3:编写Dao接口

public interface BookDao {

//    @Insert("insert into tbl_book values(null,#{type},#{name},#{description})")
    @Insert("insert into tbl_book (type,name,description) values(#{type},#{name},#{description})")
    public void save(Book book);

    @Update("update tbl_book set type = #{type}, name = #{name}, description = #{description} where id = #{id}")
    public void update(Book book);

    @Delete("delete from tbl_book where id = #{id}")
    public void delete(Integer id);

    @Select("select * from tbl_book where id = #{id}")
    public Book getById(Integer id);

    @Select("select * from tbl_book")
    public List<Book> getAll();
}

步骤4:编写Service接口和实现类

@Transactional
public interface BookService {
    /**
     * 保存
     * @param book
     * @return
     */
    public boolean save(Book book);

    /**
     * 修改
     * @param book
     * @return
     */
    public boolean update(Book book);

    /**
     * 按id删除
     * @param id
     * @return
     */
    public boolean delete(Integer id);

    /**
     * 按id查询
     * @param id
     * @return
     */
    public Book getById(Integer id);

    /**
     * 查询全部
     * @return
     */
    public List<Book> getAll();
}
@Service
public class BookServiceImpl implements BookService {
    @Autowired
    private BookDao bookDao;

    public boolean save(Book book) {
        bookDao.save(book);
        return true;
    }

    public boolean update(Book book) {
        bookDao.update(book);
        return true;
    }

    public boolean delete(Integer id) {
        bookDao.delete(id);
        return true;
    }

    public Book getById(Integer id) {
        return bookDao.getById(id);
    }

    public List<Book> getAll() {
        return bookDao.getAll();
    }
}

说明:

  • bookDao在Service中注入的会提示一个红线提示,为什么呢?

    • BookDao是一个接口,没有实现类,接口是不能创建对象的,所以最终注入的应该是代理对象
    • 代理对象是由Spring的IOC容器来创建管理的
    • IOC容器又是在Web服务器启动的时候才会创建
    • IDEA在检测依赖关系的时候,没有找到适合的类注入,所以会提示错误提示
    • 但是程序运行的时候,代理对象就会被创建,框架会使用DI进行注入,所以程序运行无影响。
  • 如何解决上述问题?

    • 可以不用理会,因为运行是正常的

    • 设置错误提示级别

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TYzEwAb6-1682508971082)(assets/1630600227357.png)]

步骤5:编写Contorller类

@RestController
@RequestMapping("/books")
public class BookController {

    @Autowired
    private BookService bookService;

    @PostMapping
    public boolean save(@RequestBody Book book) {
        return bookService.save(book);
    }

    @PutMapping
    public boolean update(@RequestBody Book book) {
        return bookService.update(book);
    }

    @DeleteMapping("/{id}")
    public boolean delete(@PathVariable Integer id) {
        return bookService.delete(id);
    }

    @GetMapping("/{id}")
    public Book getById(@PathVariable Integer id) {
        return bookService.getById(id);
    }

    @GetMapping
    public List<Book> getAll() {
        return bookService.getAll();
    }
}

对于图书模块的增删改查就已经完成了编写,我们可以从后往前写也可以从前往后写,最终只需要能把功能实现即可。

接下来我们就先把业务层的代码使用Spring整合Junit的知识点进行单元测试:

4. 单元测试

步骤1:新建测试类

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfig.class)
public class BookServiceTest {

}

步骤2:注入Service类

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfig.class)
public class BookServiceTest {

    @Autowired
    private BookService bookService;


}

步骤3:编写测试方法

我们先来对查询进行单元测试。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfig.class)
public class BookServiceTest {

    @Autowired
    private BookService bookService;

    @Test
    public void testGetById(){
        Book book = bookService.getById(1);
        System.out.println(book);
    }

    @Test
    public void testGetAll(){
        List<Book> all = bookService.getAll();
        System.out.println(all);
    }

}

根据ID查询,测试的结果为:

在这里插入图片描述

查询所有,测试的结果为:

在这里插入图片描述

1.5 PostMan测试

新增

http://localhost/books

{
	"type":"类别测试数据",
    "name":"书名测试数据",
    "description":"描述测试数据"
}

在这里插入图片描述
在这里插入图片描述

修改

http://localhost/books

{
    "id":13,
	"type":"类别测试数据",
    "name":"书名测试数据",
    "description":"描述测试数据"
}

在这里插入图片描述
在这里插入图片描述

删除

`http://localhost/books/13

在这里插入图片描述
在这里插入图片描述

查询单个

http://localhost/books/1

在这里插入图片描述

查询所有

http://localhost/books

在这里插入图片描述

2,统一结果封装

1. 表现层与前端数据传输协议定义

SSM整合以及功能模块开发完成后,接下来,我们在上述案例的基础上分析下有哪些问题需要我们去解决下。首先第一个问题是:

  • 在Controller层增删改返回给前端的是boolean类型数据

在这里插入图片描述

  • 在Controller层查询单个返回给前端的是对象

在这里插入图片描述

  • 在Controller层查询所有返回给前端的是集合对象

在这里插入图片描述

目前我们就已经有三种数据类型返回给前端,如果随着业务的增长,我们需要返回的数据类型会越来越多。对于前端开发人员在解析数据的时候就比较凌乱了,所以对于前端来说,如果后台能够返回一个统一的数据结果,前端在解析的时候就可以按照一种方式进行解析。开发就会变得更加简单。

所以我们就想能不能将返回结果的数据进行统一,具体如何来做,大体的思路为:

  • 为了封装返回的结果数据:创建结果模型类,封装数据到data属性中
  • 为了封装返回的数据是何种操作及是否操作成功:封装操作结果到code属性中
  • 操作失败后为了封装返回的错误信息:封装特殊消息到message(msg)属性中

在这里插入图片描述

根据分析,我们可以设置统一数据返回结果类

public class Result{
	private Object data;
	private Integer code;
	private String msg;
}

注意: Result类名及类中的字段并不是固定的,可以根据需要自行增减提供若干个构造方法,方便操作。

2. 表现层与前端数据传输协议实现

前面我们已经分析了如何封装返回结果数据,具体在项目中该如何实现,我们通过个例子来操作一把

1. 环境准备

  • 创建一个Web的Maven项目
  • pom.xml添加SSM整合所需jar包
  • 创建对应的配置类
  • 编写Controller、Service接口、Service实现类、Dao接口和模型类
  • resources下提供jdbc.properties配置文件

因为这个项目环境的内容和SSM整合的内容是一致的,所以我们就不在把代码粘出来了,大家在练习的时候可以在前面整合的例子案例环境下,进行本节内容的开发。

最终创建好的项目结构如下:

在这里插入图片描述

2. 结果封装

对于结果封装,我们应该是在表现层进行处理,所以我们把结果类放在controller包下,当然你也可以放在domain包,这个都是可以的,具体如何实现结果封装,具体的步骤为:

步骤1:创建Result类
public class Result {
    //描述统一格式中的数据
    private Object data;
    //描述统一格式中的编码,用于区分操作,可以简化配置0或1表示成功失败
    private Integer code;
    //描述统一格式中的消息,可选属性
    private String msg;

    public Result() {
    }
	//构造方法是方便对象的创建
    public Result(Integer code,Object data) {
        this.data = data;
        this.code = code;
    }
	//构造方法是方便对象的创建
    public Result(Integer code, Object data, String msg) {
        this.data = data;
        this.code = code;
        this.msg = msg;
    }
	//setter...getter...省略
}
步骤2:定义返回码Code类
//状态码
public class Code {
    public static final Integer SAVE_OK = 20011;
    public static final Integer DELETE_OK = 20021;
    public static final Integer UPDATE_OK = 20031;
    public static final Integer GET_OK = 20041;

    public static final Integer SAVE_ERR = 20010;
    public static final Integer DELETE_ERR = 20020;
    public static final Integer UPDATE_ERR = 20030;
    public static final Integer GET_ERR = 20040;
}

注意: code类中的常量设计也不是固定的,可以根据需要自行增减,例如将查询再进行细分为GET_OK,GET_ALL_OK,GET_PAGE_OK等。

步骤3:修改Controller类的返回值
//统一每一个控制器方法返回值
@RestController
@RequestMapping("/books")
public class BookController {

    @Autowired
    private BookService bookService;

    @PostMapping
    public Result save(@RequestBody Book book) {
        boolean flag = bookService.save(book);
        return new Result(flag ? Code.SAVE_OK:Code.SAVE_ERR,flag);
    }

    @PutMapping
    public Result update(@RequestBody Book book) {
        boolean flag = bookService.update(book);
        return new Result(flag ? Code.UPDATE_OK:Code.UPDATE_ERR,flag);
    }

    @DeleteMapping("/{id}")
    public Result delete(@PathVariable Integer id) {
        boolean flag = bookService.delete(id);
        return new Result(flag ? Code.DELETE_OK:Code.DELETE_ERR,flag);
    }

    @GetMapping("/{id}")
    public Result getById(@PathVariable Integer id) {
        Book book = bookService.getById(id);
        Integer code = book != null ? Code.GET_OK : Code.GET_ERR;
        String msg = book != null ? "" : "数据查询失败,请重试!";
        return new Result(code,book,msg);
    }

    @GetMapping
    public Result getAll() {
        List<Book> bookList = bookService.getAll();
        Integer code = bookList != null ? Code.GET_OK : Code.GET_ERR;
        String msg = bookList != null ? "" : "数据查询失败,请重试!";
        return new Result(code,bookList,msg);
    }
}
步骤4:启动服务测试

在这里插入图片描述

至此,我们的返回结果就已经能以一种统一的格式返回给前端。前端根据返回的结果,先从中获取code,根据code判断,如果成功则取data属性的值,如果失败,则取msg中的值做提示。

笔记来自:黑马程序员SSM框架教程

3,图书推荐

计算机和通信系统,以及由它们所实现的许多事物遍布我们周围。其中一些在日常生活中随处可见,比如笔记本电脑、手机和互联网。今天,在任何公共场所,都会看到许多人在使用手机查询交通路线、购物以及和朋友聊天。与此同时,大部分计算机世界却是隐形的,比如电子设备、汽车、火车、飞机、电力系统和医疗设备中的计算机。这种几乎不可见的基础设施对我们产生了巨大的影响,如果没有这些在后台运行的系统,我们所处的现代社会将会坍塌。大多数情况下,它们确实在正确地执行任务,一切运转正常。但我们会不时得到令人不安的警示,这发生在当这些系统出现问题时,或当我们听到各种系统正在悄悄收集、共享,甚至滥用这些数据时。

《普林斯顿计算机公开课(原书第2版)》
在这里插入图片描述

本书篇幅不大,但对计算机和通信系统如何工作进行了详细和透彻的解释。本书展示了当今的计算和通信世界是如何运作的,从硬件到软件,再到互联网和Web。本书也讨论了新技术带来的社会、政治和法律问题(虽然主要是从美国的角度),由此你可以理解我们所面临的难题,并理解为了解决它们所必须做出的权衡。

迫不及待的小伙伴点击了解详情

🍓本次送 3本书 ,从评论区抽3位小伙伴送书🍓
活动时间:截止到 2023-06-15 12:00:00
抽奖方式:利用程序进行抽奖。
参与方式:关注博主、点赞、收藏,进行优质评论

🍓 获奖名单🍓
java小白冲刺者
-dzk-
计算机魔术师
名单公布时间: 2023-06-15 12:00:00

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

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

相关文章

【IE】浏览器兼容问题IE

IE11浏览器 1.安装npm i babel-polyfill -S 2.main.js引入&#xff1a; import “babel-polyfill” 3.build/webpack.base.conf.js 更改 : entry: { app: [‘babel-polyfill’, ‘./src/main.js’] } 以上操作之后IE11依旧空白&#xff0c;报错 缺少标识符 axios版本V1.1.3 …

手把手教你搭建一个vue3+ts项目(超祥/必看)

目录 一、创建vite项目 二、启动vite项目 三、处理一些配置问题 四、增加工程化插件 1、安装sass 2、安装vue-router 3、安装pinia 4、安装element-plus 5、安装axios 6、设置路径别名&#xff0c;将相对路径改为绝对路径 一、创建vite项目 1、在一个文件夹下通…

React基础教程(二):React的基本使用

React基础教程(二)&#xff1a;React的基本使用 1、HelloReact 1.1 引入react基础依赖包 注意点&#xff1a;①必须要在②之前引入 <!-- 引入react核心库--><script src"../js/react.development.js"></script><!-- 引入react-dom&…

毕业论文里引用文献率为0%的解决小技巧

快要毕业了&#xff0c;带着伤感&#xff0c;大学生们已开始加紧完成论文的编写和毕业答辩&#xff0c;祝大家都可以顺利拿到学位证书和毕业证书。 前两天&#xff0c;有位同学找我&#xff0c;咨询如何解决毕业论文里&#xff0c;引用文献率为0%的问题。 我在知网上将该论文通…

flutter创建、安装扩展包、打包apk

1、创建APK项目 要在VSCode中创建一个Flutter应用程序&#xff0c;请按照以下步骤进行操作&#xff1a; 安装Flutter SDK&#xff1a;请确保你已经安装了Flutter SDK&#xff0c;并配置了Flutter的环境。你可以在Flutter的官方网站上找到安装和设置Flutter的详细说明。 安装V…

完美解决 RabbitMQ 可视化界面中 Overview 不显示图形的问题

&#x1f4a7; 记录一下今天遇到的 b u g \color{#FF1493}{记录一下今天遇到的bug} 记录一下今天遇到的bug&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞见云的博客&#x1f390; &#x1f433; 数据结构与算法…

VBA基础(宏编程)

VBA介绍&#xff1a; Visual Basic for Applications&#xff08;VBA&#xff09;是 VisualBasic 的一种宏语言&#xff0c;是微软开发出来在其桌面应用程序中执行通用的自动化(OLE)任务的编程语言。主要能用来扩展 Windows 的应用程序功能&#xff0c;特别是Microsoft Office…

DolphinDB +机器学习,预测地震波形数据

1. 地震波形数据预测业务场景说明 在地震波形数据异常检测场景中&#xff0c;通常需要使用多种工具和方法来提高检测精度和鲁棒性。其中&#xff0c;FilterPicker 是一种常用的基于模板匹配的异常检测工具&#xff0c;可以实现地震波形数据的实时异常检测和定位。FilterPicker…

为什么看了那么多测试技术帖,自己都没有提升?

作为测试新手&#xff0c;最爱莫过于看各大牛发的技术贴&#xff0c;这篇很牛叉&#xff0c;那篇也很有道理&#xff0c;似乎自己看着看着也会成为高手。然而几年后&#xff0c;发现自己对专业知识的理解乱的很&#xff0c;里面更有很多自相矛盾的地方&#xff0c;这到底是哪里…

RedisSon高并发分布式锁实战

Redis高并发分布式锁实战 1.分布式场景下的synchronized失效的问题–用redis实现分布式锁 synchronized是通过monitor实现的jvm级别的锁&#xff0c;如果是分布式系统&#xff0c;跑在不同的虚拟机上的tomcat上&#xff0c;会导致synchronized无法锁住对象 ----------- 需要分…

01分数规划 易懂+例题讲解 (c++)

01分数规划 &#xff1a;01即取还是不取&#xff0c;分数即所求型式为&#xff0c;规划就是选取最好的方案。 一般情况题目给出n个物品&#xff0c;再给出每个物品的价值以及物重&#xff0c;选取k个物品&#xff0c;问你在所有可能选取的方案中&#xff0c;最大的单位价值为多…

通过零代码ETLCloud实现马帮ERP数据自动化同步

马帮ERP介绍 马帮ERP是一款云端跨境电商管理软件。与传统的ERP系统不同&#xff0c;马帮ERP专注于跨境电商领域&#xff0c;为电商企业提供一站式管理解决方案&#xff0c;包括财务管理、采购管理、进销存管理、订单管理等功能模块。该平台针对跨境电商行业特点&#xff0c;提…

MM32F3273G8P火龙果开发板MindSDK开发教程20 - freertos + letter shell 的移植

MM32F3273G8P火龙果开发板MindSDK开发教程20 - freertos letter shell 的移植 1、freertos下载 官网传送门 2、freertos移植 1、在工程目录device下新建freertos目录&#xff0c;将下载的源码source目录下的七个.c文件copy到新建的freertos目录。 2、将source/protable/G…

Word 2021入门指南:详细解读常用功能

软件安装&#xff1a;办公神器office2021安装教程&#xff0c;让你快速上手_正经人_____的博客-CSDN博客 一、 新建文档 打开Word 2021后&#xff0c;可以看到左上角的“文件”选项&#xff0c;点击它&#xff0c;在弹出的菜单中选择“新建”选项。然后可以选择空白文档或者使…

vue3+ts+vite+element plus中使用luckysheet(预览效果)

前言&#xff1a; 这两天一个项目&#xff0c;需要在页面中以excel的形式展示大量数据&#xff0c;喜欢偷懒的我果断扒拉了一堆适用于vue3的插件&#xff0c;下面简单说说我使用的luckysheet 使用&#xff1a; 一、准备一个vue3tsviteelement plus的项目 此处省略n个字。。。…

如何用 WampServer+快解析 搭建php文件管理器

基于网络&#xff0c;资源是大家最最基本的需求&#xff0c;许多网络爱好者不求利益&#xff0c;把自己收集的一些通过一些平台共享给大家&#xff0c;这就是资源共享。 资源共享程度越高&#xff0c;代表信息发展水平越高。现实工作中&#xff0c;由于用户提供的数据可能来自…

Linux基础IO - 软硬链接 | 动静态库

之前的文章中我们讲述了软硬链接中有关软连接的知识&#xff0c;本文中将继续讲述硬链接部分的知识&#xff0c;并且讲述一下动静态库的相关内容。 硬链接 硬链接本质上就是在当前目录建立一个新的文件名与指定文件inode的关系。 每当我们在当前目录下建立一个硬链接就会让文…

C++11多线程之条件变量

文章目录 一、关于多线程的同步二、初始条件变量三、关于条件变量的例题四、生产者消费者模型 一、关于多线程的同步 //函数被调用&#xff0c;分配相应的栈帧&#xff0c;进行现场保护void func(char c) {char filename[20] {};sprintf(filename, "test%c.txt",c)…

Fiddler Response私人订制

在客户端接口的测试中&#xff0c;我们经常会需要模拟各种返回状态或者特定的返回值&#xff0c;常见的是用Fiddler模拟各种请求返回值场景&#xff0c;如重定向AutoResponder、请求拦截修改再下发等等。小编在近期的测试中遇到的一些特殊的请求返回模拟的测试场景&#xff0c;…

《变形金刚7》票房大跳水!特效敷衍?剧情单薄?汽车人的未来在哪里?

《变形金刚&#xff1a;超能勇士崛起》 6.11&#xff08;上映第3天&#xff09; 单日票房8200万 6.12&#xff08;上映第4天&#xff09; 单日票房2173万 6.13&#xff08;上映第5天&#xff09; 单日票房1700万 说实在的&#xff0c;真没想到《变形金刚7》日票房会如此大幅…