SSM基础整合

news2024/9/28 23:32:35

SSM基础整合

文章目录

  • SSM基础整合
    • @[toc]
    • SSM基础整合
      • SSM整合流程
    • 表现层数据封装
      • 设置统一数据返回结果类
      • 定义code类
      • 优化Controller
      • 优化后的返还结果
    • 异常处理器
      • 异常处理
    • 项目异常处理方案
      • 项目异常分类
      • 处理

SSM基础整合

SSM整合流程

  1. 创建工程

  2. SSM整合

    • Spring

      • SpringConfig

      • @Configuration
        @ComponentScan({"com.ityc.service"})
        @PropertySource("classpath:jdbc.properties")
        @Import({JdbcConfig.class,MybatisConfig.class})
        //事物
        @EnableTransactionManagement
        public class SpringConfig {
        }
        
        
    • MyBatis

      • MyBatisConfig

        public class MybatisConfig {
            @Bean
            public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource){
                SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
                factoryBean.setDataSource(dataSource);
                factoryBean.setTypeAliasesPackage("com.ityc.domain");
        
                return factoryBean;
            }
        
            @Bean
            public MapperScannerConfigurer mapperScannerConfigurer(){
                MapperScannerConfigurer msc= new MapperScannerConfigurer();
                msc.setBasePackage("com.ityc.dao");
                return msc;
            }
        }
        
        
      • JdbcConfig

        public class JdbcConfig {
            @Value("${jdbc.driver}")
            private String driver;
            @Value("${jdbc.url}")
            private String url;
            @Value("${jdbc.username}")
            private String username;
            @Value("${jdbc.passworld}")
            private String passworld;
        
        
            //导入MySQL
            @Bean
            public DataSource DataSource(){
                DruidDataSource dataSource = new DruidDataSource();
                dataSource.setDriverClassName(driver);
                dataSource.setUrl(url);
                dataSource.setUsername(username);
                dataSource.setPassword(passworld);
                return dataSource;
            }
        
            //事物
            @Bean
            public PlatformTransactionManager transactionManager(DataSource dataSource){
                DataSourceTransactionManager ds = new DataSourceTransactionManager();
                ds.setDataSource(dataSource);
                return ds;
        
            }
        }
        
        
      • jdbc.properties

        jdbc.driver=com.mysql.jdbc.Driver
        jdbc.url=jdbc:mysql://localhost:3306/ssm_db?useSSL=false
        jdbc.username=root
        jdbc.passworld=lyc
        
    • SpringMVC

      • SpringMvcConfig

        @Configuration
        @ComponentScan("com.ityc.controller")
        @EnableWebMvc
        public class SpringMvcConfig {
        }
        
  3. 功能模块

    • 表与实体类

      package com.ityc.domain;
      
      public class Book {
          private Integer id;
          private String type;
          private String name;
          private String description;
      
      
      
          public Integer getId() {
              return id;
          }
      
          public void setId(Integer id) {
              this.id = id;
          }
      
          public String getType() {
              return type;
          }
      
          public void setType(String type) {
              this.type = type;
          }
      
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      
          public String getDescription() {
              return description;
          }
      
          public void setDescription(String description) {
              this.description = description;
          }
      
          @Override
          public String toString() {
              return "Book{" +
                      "id=" + id +
                      ", type='" + type + '\'' +
                      ", name='" + name + '\'' +
                      ", description='" + description + '\'' +
                      '}';
          }
      }
      
      
      DROP TABLE IF EXISTS `tbl_book`;
      CREATE TABLE `tbl_book`  (
        `id` int(11) NOT NULL AUTO_INCREMENT,
        `type` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
        `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
        `description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
        PRIMARY KEY (`id`) USING BTREE
      ) ENGINE = InnoDB AUTO_INCREMENT = 13 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
      
      INSERT INTO `tbl_book` VALUES (1, '计算机理论', 'Spring实战 第5版', 'Spring入门经典教程,深入理解Spring原理技术内幕');
      INSERT INTO `tbl_book` VALUES (2, '计算机理论', 'Spring 5核心原理与30个类手写实战', '十年沉淀之作,手写Spring精华思想');
      INSERT INTO `tbl_book` VALUES (3, '计算机理论', 'Spring 5 设计模式', '深入Spring源码剖析Spring源码中蕴含的10大设计模式');
      INSERT INTO `tbl_book` VALUES (4, '计算机理论', 'Spring MVC+MyBatis开发从入门到项目实战', '全方位解析面向Web应用的轻量级框架,带你成为Spring MVC开发高手');
      INSERT INTO `tbl_book` VALUES (5, '计算机理论', '轻量级Java Web企业应用实战', '源码级剖析Spring框架,适合已掌握Java基础的读者');
      INSERT INTO `tbl_book` VALUES (6, '计算机理论', 'Java核心技术 卷I 基础知识(原书第11版)', 'Core Java 第11版,Jolt大奖获奖作品,针对Java SE9、10、11全面更新');
      INSERT INTO `tbl_book` VALUES (7, '计算机理论', '深入理解Java虚拟机', '5个维度全面剖析JVM,大厂面试知识点全覆盖');
      INSERT INTO `tbl_book` VALUES (8, '计算机理论', 'Java编程思想(第4版)', 'Java学习必读经典,殿堂级著作!赢得了全球程序员的广泛赞誉');
      INSERT INTO `tbl_book` VALUES (9, '计算机理论', '零基础学Java(全彩版)', '零基础自学编程的入门图书,由浅入深,详解Java语言的编程思想和核心技术');
      INSERT INTO `tbl_book` VALUES (10, '市场营销', '直播就该这么做:主播高效沟通实战指南', '李子柒、李佳琦、薇娅成长为网红的秘密都在书中');
      INSERT INTO `tbl_book` VALUES (11, '市场营销', '直播销讲实战一本通', '和秋叶一起学系列网络营销书籍');
      INSERT INTO `tbl_book` VALUES (12, '市场营销', '直播带货:淘宝、天猫直播从新手到高手', '一本教你如何玩转直播的书,10堂课轻松实现带货月入3W+');
      
      
    • dao(接口+自动代理)

      package com.ityc.dao;
      
      import com.ityc.domain.Book;
      import org.apache.ibatis.annotations.Delete;
      import org.apache.ibatis.annotations.Insert;
      import org.apache.ibatis.annotations.Select;
      import org.apache.ibatis.annotations.Update;
      import org.springframework.web.servlet.config.annotation.EnableWebMvc;
      
      import java.util.List;
      
      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();
      }
      
      
    • service(接口+实体类)

      • 业务层接口测试(整合JUnit)
      //接口
      package com.ityc.service;
      
      import com.ityc.domain.Book;
      import org.apache.ibatis.annotations.Delete;
      import org.apache.ibatis.annotations.Insert;
      import org.apache.ibatis.annotations.Select;
      import org.apache.ibatis.annotations.Update;
      import org.springframework.transaction.annotation.Transactional;
      
      import java.util.List;
      
      //开启事物
      @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();
      }
      
      
      //实现类
      package com.ityc.service.impl;
      
      import com.ityc.dao.BookDao;
      import com.ityc.domain.Book;
      import com.ityc.service.BookService;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.stereotype.Service;
      
      import java.util.List;
      @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);
              
              if(bookDao.getById(id)!=null){
                  bookDao.delete(id);
                  return true;
              }else{
                   return false;
              }
          }
      
          public Book getById(Integer id) {
              return bookDao.getById(id);
          }
      
          public List<Book> getALL() {
              return bookDao.getALL();
          }
      }
      
      
      //测试
      package com.ityc.service;
      
      import com.ityc.config.SpringConfig;
      import com.ityc.domain.Book;
      import org.junit.Test;
      import org.junit.runner.RunWith;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.test.context.ContextConfiguration;
      import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
      
      import java.util.List;
      
      @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> bookAll = bookService.getALL();
              System.out.println(bookAll);
          }
      }
      
    • conroller

      • 表现层接口测试(PostMan)

        package com.ityc.controller;
        
        
        import com.ityc.domain.Book;
        import com.ityc.service.BookService;
        import org.apache.ibatis.annotations.Delete;
        import org.springframework.beans.factory.annotation.Autowired;
        import org.springframework.stereotype.Controller;
        import org.springframework.web.bind.annotation.*;
        
        import java.util.List;
        
        //基于Restful的controller开发
        @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();
            }
        
        }
        
        
      • web配置类

        package com.ityc.config;
        
        import org.springframework.web.filter.CharacterEncodingFilter;
        import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
        import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;
        
        import javax.servlet.Filter;
        
        public class SelectConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
        
            //根配置
            protected Class<?>[] getRootConfigClasses() {
                return new Class[]{SpringConfig.class};
            }
        
            //专门应对web请求的处理
            //这里创建的容器对象与上方的容器对象不是同一个
            protected Class<?>[] getServletConfigClasses() {
                return new Class[]{SpringMvcConfig.class};
            }
        
            protected String[] getServletMappings() {
                return new String[]{"/"};
            }
        
            //POST提交乱码处理
            @Override
            protected Filter[] getServletFilters() {
                CharacterEncodingFilter filter = new CharacterEncodingFilter();
                filter.setEncoding("UTF-8");
                return new Filter[]{filter};
            }
        }
        
        

表现层数据封装

  • 前端接收数据格式——创建结果模型类,封装数据到data属性中
  • 前端接收数据格式——封装操作结果到code属性中
  • 前端接收数据格式——封装特殊消息到message(msg)属性中

设置统一数据返回结果类

//Result类中的字段不是固定的,可以根据需要自行增减
//提供若干个构造方法,方便操作
package com.ityc.controller;

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

    public Result() {
    }

    public Result( Integer code,Object data, String msg) {
        this.data = data;
        this.code = code;
        this.msg = msg;
    }

    public Result( Integer code,Object data) {
        this.data = data;
        this.code = code;
    }



    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}

定义code类

package com.ityc.controller;

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;


}

优化Controller

package com.ityc.controller;


import com.ityc.domain.Book;
import com.ityc.service.BookService;
import org.apache.ibatis.annotations.Delete;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@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);
        String msg= flag?"删除成功":"数据为空,删除失败";
        return new Result(flag?Code.DELETE_OK:Code.DELETE_ERR,flag,msg);
    }

    @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);
    }

}

优化后的返还结果

在这里插入图片描述

注:

表现层数据封装,通过Result与Code类配合业业务,将数据整理成统一格式,反馈给前端页面,再由前端页面的书写人员进行统一解析。


异常处理器

异常处理

出现异常现象的常见位置与常见诱因如下

  • 框架内部抛出的异常:因使用不合规导致
  • 数据层抛异常:因外部服务器故障导致(例:服务器访问超时)
  • 业务层抛出的异常:因业务逻辑书写错误导致(例:遍历业务书写操作,导致索引异常)
  • 表现层抛出的异常:因数据收集,校验等规则导致(例如:不匹配的数据类型间导致异常)
  • 工具类抛出的异常:因工具类书写不严谨,不够健壮导致(例如:必要释放的连接长期未释放)

思考:各个层级均出现异常,异常处理代码书写在哪一层?

  • 所有的异常均抛出到表现层进行处理

    1. 表现层处理异常,每个方法中单独书写,代码书写量巨大,且意义不强,如何解决?——AOP思想

    2. SpringMVC为我们提供了异常处理器,来为我们集中的,统一的处理项目中的异常。

      package com.ityc.controller;
      
      import org.springframework.web.bind.annotation.ControllerAdvice;
      import org.springframework.web.bind.annotation.ExceptionHandler;
      import org.springframework.web.bind.annotation.RestController;
      import org.springframework.web.bind.annotation.RestControllerAdvice;
      
      //Rest风格开发的控制器类做增强,本注解自带@ResponseBody注解与@Component注解,具备对应的功能
      @RestControllerAdvice
      public class ProjectExceptionAdvice {
          //写一个方法用于处理异常
          
          //设置拦截处理的异常类型
          @ExceptionHandler(Exception.class)
          public Result doException(Exception ex){
              System.out.println("异常出来吧,别藏了");
              return new Result(666,null,"异常出现了");
          }
      }
      
      

项目异常处理方案

项目异常分类

  • 业务异常(BusinessException)

    • 不规范用户行为操作产生的异常

      • 处理:发送对应消息传递给用户,提醒规范操作
    • 规范的用户行为产生的异常

  • 系统异常(SystemException)

    • 项目运行的过程中可预计且无法避免的异常
      • 处理:发送固定的消息给用户,安抚用户
      • 发送特定信息给运维人员,提醒维护
      • 记录日志
  • 其他异常(Exception)

    • 编程人员未预期到的异常
      • 处理:发送固定的消息给用户,安抚用户
      • 发送特定消息给编程人员,提醒维护(纳入预期范围)
      • 记录日志

处理

  1. 自定义项目系统级异常

    package com.ityc.exception;
    
    public class SystemException extends RuntimeException{
        private Integer code;
    
        public SystemException( Integer code,String message) {
            super(message);
            this.code = code;
        }
    	
        public SystemException(Integer code, String message, Throwable cause) {
            super(message, cause);
            this.code = code;
        }
        -
        public Integer getCode() {
            return code;
        }
    
        public void setCode(Integer code) {
            this.code = code;
        }
    
    
    }
    
    
  2. 自定义项目业务级异常

    package com.ityc.exception;
    
    public class BusinessException extends RuntimeException {
        private Integer code;
    
    
        public BusinessException( Integer code,String message) {
            super(message);
            this.code = code;
        }
        public BusinessException(Integer code, String message, Throwable cause) {
            super(message, cause);
            this.code = code;
        }
    
        public Integer getCode() {
            return code;
        }
    
        public void setCode(Integer code) {
            this.code = code;
        }
    
        
        public BusinessException(Integer code, String message, Throwable cause) {
            super(message, cause);
            this.code = code;
        }
    }
    
    
  3. 自定义异常编码(可持续补充)

    package com.ityc.controller;
    
    public class Code {
    
        public static final Integer SYSTEM_ERR = 50001;
        public static final Integer SYSTEM_TIMEOUT_ERR = 50002;
        public static final Integer BUSINESS_ERR = 50003;
        public static final Integer SYSTEM_UNKNOW_ERR = 59999;
    
    
    }
    
  4. 触发自定义异常

                                                                                                 
        public Book getById(Integer id) {                                                        
            if (id < 1){                                                                         
                throw new BusinessException(Code.BUSINESS_ERR,"警告,非法操作");                        
            }                                                                                    
            return bookDao.getById(id);                                                          
        }                                                                                        
    
  5. 拦截并处理异常

    @RestControllerAdvice
    public class ProjectExceptionAdvice {
    
        @ExceptionHandler(SystemException.class)
        public Result doSystemException(SystemException sex){
            //记录日志
            //发送消息给运维
            //发送邮件给开发人员,sex对象发给开发人员
            return new Result(sex.getCode(),null,sex.getMessage());
        }
    
        @ExceptionHandler(BusinessException.class)
        public Result doBusinessException(BusinessException bex){
            //记录日志
            //发送消息给运维
            //发送邮件给开发人员
            return new Result(bex.getCode(),null,bex.getMessage());
        }
    
        //写一个方法用于处理异常
        //设置拦截异常类型
    
        @ExceptionHandler(Exception.class)
        public Result doException(Exception ex){
            //记录日志
            //发送消息给运维
            //发送邮件给开发人员,sex对象发给开发人员
            System.out.println("异常出来吧,别藏了");
            return new Result(Code.SYSTEM_UNKNOW_ERR,null,"出现了位置异常,系统繁忙请稍后再试");
        }
    }
    
    
  6. 异常处理器效果

    在这里插入图片描述

注:

  • 异常处理器
  • 自定义异常
  • 异常编码
  • 自定义消息

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

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

相关文章

CAS 的使用场景 CAS的ABA问题的优化 以及 synchronized 的三大优化

目录 &#x1f388;专栏链接:多线程相关知识详解 一.什么是CAS 二.CAS最常用的两个场景 Ⅰ.实现原子类 Ⅱ.实现自旋锁 三.CAS的ABA问题 四.优化解决CAS的ABA问题 五.synchronized的优化 Ⅰ.锁升级/锁膨胀 Ⅱ.锁消除 Ⅲ.锁粗化 一.什么是CAS CAS&#xff08;Compar…

p2深度学习基本概念简介下笔记

3. 第 1 讲&#xff1a;深度学习基本概念简介下_哔哩哔哩_bilibili 线性模型太简单&#xff0c;我们需要比较复杂的模型。 不管怎样弄&#xff0c;蓝色描述不出红色的线 强调model bias 无法模拟真实的状况 写出一个有未知参数更复杂的model 观察红色的曲线 &#xff1a;可…

你知道数据在内存中是如何存储的嘛?

&#x1f996;作者&#xff1a;学写代码的恐龙 &#x1f996;博客主页&#xff1a;学写代码的恐龙博客主页 &#x1f996;专栏&#xff1a;【初级c语言】 &#x1f996;语录&#xff1a;❀未来的你&#xff0c;一定会感谢现在努力奋斗的自己❀ 深度剖析数据在内存中的存储一、…

数据结构精讲——排序(二)

数据结构精讲——排序&#xff08;二&#xff09; 排序的分类 上节课我们已经了解过插入排序和选择排序&#xff0c;这节课主要讲的是快排排序&#xff0c;冒泡排序应该都很熟悉&#xff0c;少提一下吧。 冒泡排序 冒泡排序是我们刚接触编程时就学习的排序方法&#xff08;还…

达梦数据库实施、运维与使用经验(一)

一、使用Xshell输入Insert语句&#xff0c;回车执行系统没反应 问题解决思路 查下数据库的活动会话数并登录数据库服务器看数据库的资源负载 select * from v$sessions where stateACTIVE;在数据库Xshell中输入语句查询数据库磁盘是否满了 df -lh上图中的第一个命令是用来查…

C++的IO流

目录 1. 流是什么 2. CIO流 2.1 C标准IO流 2.2 C文件IO流 2.2.1 简单读取文件流 2.2.2 C读取文件巧妙之处 3. stringstream的简单介绍 1. 流是什么 “流”即是流动的意思&#xff0c;是物质从一处向另一处流动的过程&#xff0c;是对一种有序连续且具有方向性的数据&am…

【我的渲染技术进阶之旅】关于OpenGL纹理压缩的相关资料

文章目录一、为啥要了解压缩纹理1.1 为啥要使用压缩纹理1.2 如何自定义压缩纹理以及使用压缩纹理的效果1.2.1 使用压缩纹理节省显存1.2.2 自定义压缩纹理&#xff1a;将压缩好的纹理数据保存在本地1.2.3 使用自定义的压缩纹理1.2.3 示例原理二、纹理压缩相关知识2.0 什么是压缩…

FOLOLane论文阅读

论文地址&#xff1a;https://arxiv.org/pdf/2105.13680.pdf 一、论文创新点 主流的车道线检测方法使用语义分割和聚类实现&#xff0c;但像素级的输出存在信息冗余&#xff0c;同时会带来大量噪声。而该论文使用两个分支&#xff0c;一个输出heatmap用于判断像素是否是关键点…

干货 | 初窥 Pytest 测试框架,基础薄弱也能轻松 hold 住

pytest 是一个成熟的全功能Python测试工具&#xff0c;可以帮助您编写更好的程序。它与 python 自带的 unittest 测试框架类似&#xff0c;但 pytest 使用起来更简洁和高效&#xff0c;并且兼容 unittest 框架。pytest 能够支持简单的单元测试和复杂的功能测试&#xff0c;pyte…

java中修改List的对象元素时碰到的坑

坑 case1 case1:Data class Person {Integer age;String name;public Person(Integer age, String name) {this.age age;this.name name;} } List<Person> v1List new ArrayList<>(); v1List.add(new Person(11, "小刚")); v1List.add(new Person(1…

前端基础(五)_运算符(算术运算符、赋值运算符、比较运算符、逻辑运算符、三目运算符、运算符优先级和结合性、数据类型的隐式转换)

一、算术运算符 算术运算符即&#xff1a;加&#xff08;&#xff09;减&#xff08;-&#xff09;乘&#xff08;*&#xff09;除&#xff08;/&#xff09;取余&#xff08;%&#xff09;加加&#xff08;&#xff09;减减&#xff08;–&#xff09; 算术运算符里比较特殊的…

CleanMyMacX软件有哪些优缺点?值不值得下载

CleanMyMac X 2023是一款可靠且功能强大的Mac清洁工具工具&#xff0c;他可以让你随时检查Mac电脑的健康情况&#xff0c;并删除电脑中的垃圾文件&#xff0c;来腾出存储空间&#xff0c;保持Mac系统的整洁。至问世以来&#xff0c;CleanMyMac 系统倍受国内外用户推崇&#xff…

【4】SCI易中期刊推荐——神经科学研究(中科院4区)

🚀🚀🚀NEW!!!SCI易中期刊推荐栏目来啦 ~ 📚🍀 SCI即《科学引文索引》(Science Citation Index, SCI),是1961年由美国科学信息研究所(Institute for Scientific Information, ISI)创办的文献检索工具,创始人是美国著名情报专家尤金加菲尔德(Eugene Garfield…

C#使用迷宫地图来模拟新冠疫情的传播速度(一)

国家开始发布疫情放开政策&#xff0c;本人于2022-12-21开始感染并发高烧。 最近才康复。有感于此 我们用初始感染源来影响九宫网格来查看新冠的传播速度 小游戏规则如下&#xff1a; 一个感染源 可以传播附近相邻的8个网格【类似于扫雷】&#xff0c;假如每个感染源一天只…

Vue--》setup、ref、reactive函数使用讲解

目录 setup ref函数 reactive函数 Vue3中的响应式原理 setup Vue3中的一个新的配置项&#xff0c;值为一个函数。组件中所用到的数据、方法等等&#xff0c;均要配置在setup中。setup函数的两种返回值&#xff0c;如下&#xff1a; 若返回一个对象&#xff0c;则对象中的…

使用Docker快速搭建Hfish蜜罐

HFish简介 HFish是一款社区型免费蜜罐&#xff0c;侧重企业安全场景&#xff0c;从内网失陷检测、外网威胁感知、威胁情报生产三个场景出发&#xff0c;为用户提供可独立操作且实用的功能&#xff0c;通过安全、敏捷、可靠的中低交互蜜罐增加用户在失陷感知和威胁情报领域的能…

源码讲解ThreadLocal父子线程通信问题(图+文+源码)

1 缘起 在复习ThreadLocal相关应用的知识&#xff0c; 有一个老生常谈的问题&#xff1a;父子线程通信&#xff0c; 起初&#xff0c;对于父子线程通信&#xff0c;仅了解ThreadLocal无法通过子线程获取线程数据&#xff0c; 并不了解为什么会这样&#xff1f;以及为什么Inher…

15.4 宏任务和微任务

宏任务和微任务 start 如果彻底理解了事件循环&#xff0c;其实大多数 JS 执行的逻辑都能理解了但是在 ES6 中引入了 Promise, 就引出了两个新概念&#xff0c;宏任务和微任务。 1.宏任务和微任务 1.1 名词 宏任务&#xff1a;macrotask 微任务&#xff1a;microtask 在 E…

异构操作系统的“融合计算”

这些年&#xff0c;由随着应用场景日益丰富和多样化&#xff0c;计算工作越来越复杂&#xff0c;传统的计算方式&#xff08;单机计算/分布式计算&#xff09;已经不能满足&#xff0c;需要一种新的更强大的计算模式来解决这些问题&#xff0c;这是融合计算产生的背景。 …

117.(leaflet之家)leaflet空间判断-点与geojson面图层的空间关系(turf实现)

听老人家说:多看美女会长寿 地图之家总目录(订阅之前建议先查看该博客) 文章末尾处提供保证可运行完整代码包,运行如有问题,可“私信”博主。 效果如下所示: 下面献上完整代码,代码重要位置会做相应解释 <!DOCTYPE html> <html>