请求方式(基于注解实现)

1.编写web.xml文件配置启动信息

<!DOCTYPE web-app PUBLIC
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
    <display-name>Archetype Created Web Application</display-name>
    <servlet>
        <servlet-name>ssm</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextClass</param-name>
            <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
        </init-param>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>com.pyb.config.SpringConfig</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>ssm</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>
  • 文件作用分析

1.Web容器启动: 当Web服务器(如Tomcat)启动,并且加载部署在其中的Web应用时,它会读取web.xml文件来了解如何配置和初始化该应用。 2.解析DOCTYPE声明: Web容器检查web.xml文件的DOCTYPE声明,以确保其符合指定的DTD标准。这一步是验证配置文件格式正确性的过程。 3.创建Servlet实例: 根据<servlet>标签中的定义,Web容器创建名为ssm的Servlet实例。这里使用的是Spring MVC框架的核心控制器DispatcherServlet。 4.初始化Servlet: 在创建Servlet实例后,Web容器调用Servlet的init()方法进行初始化。 DispatcherServlet在初始化过程中会读取<init-param>参数,根据这些参数创建Spring的应用上下文。 它使用AnnotationConfigWebApplicationContext作为上下文类,意味着它将通过注解扫描的方式来查找并注册Bean。 上下文配置的位置被设置为com.pyb.config.SpringConfig,即具体的Java配置类。 5.加载上下文: DispatcherServlet初始化完成后,它会加载由SpringConfig类配置的Spring应用上下文,包括所有必要的Bean定义和服务配置。 6.Servlet加载顺序: 由于设置了<load-on-startup>值为1,所以这个Servlet会在Web应用启动时优先加载,保证应用可以立即响应请求。 7.映射URL模式: <servlet-mapping>定义了哪个Servlet应该处理哪些URL模式的请求。在这个例子中,/表示所有的请求都将由ssm Servlet处理,除了那些静态资源(如图片、CSS文件等),通常它们会有默认的Servlet处理。 8.处理HTTP请求: 一旦Web应用完全启动并且DispatcherServlet已经准备好,它就可以开始接收HTTP请求,并根据Spring MVC的路由规则将请求分发给相应的处理器或控制器进行处理。 处理器完成业务逻辑后,返回模型和视图信息给DispatcherServlet,再由它选择适当的视图技术(如JSP, Thymeleaf等)渲染页面,最终返回HTTP响应给客户端。

2.编写Java核心配置类文件

package com.pyb.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScans;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
/**
 * @version 1.0
 * @Author 彭彦彬
 * @Date 2025/1/10 8:47
 * @注释
 */
@Configuration
@ComponentScan("com.pyb")
@EnableWebMvc
@Import({MyBatisConfig.class,DataBaseConfig.class})
public class SpringConfig
{
}
  • 该类作用

1配置类标识: 使用 @Configuration 注解标记该类为一个Spring配置类,意味着它包含用于定义应用上下文的Bean和其他配置信息。 2组件扫描: 通过 @ComponentScan("com.pyb") 自动扫描 com.pyb 包及其子包内的组件(如服务、控制器等),并将它们注册为Spring容器中的Bean。 3启用Web MVC支持: @EnableWebMvc 启用了Spring MVC的功能,自动配置了处理HTTP请求所需的各种组件。 4导入额外配置: 使用 @Import 注解导入了 MyBatisConfig 和 DataBaseConfig 配置类,以便将数据访问层和MyBatis框架的相关配置分离出来,保持配置的模块化和清晰度。

  • 数据源配置类

package com.pyb.config;
import com.zaxxer.hikari.HikariDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.PropertySource;
import javax.sql.DataSource;
/**
 * @version 1.0
 * @Author 彭彦彬
 * @Date 2025/1/10 9:10
 * @注释
 */
@PropertySource("classpath:db.properties")
public class DataBaseConfig {
    @Value("${jdbc.password}") String password;
    @Value("${jdbc.username}") String username;
    @Value("${jdbc.url}") String url;
    @Value("${jdbc.driver}") String driver;
    @Bean
    public DataSource dataSource(){
        HikariDataSource hikariDataSource=new HikariDataSource();
        hikariDataSource.setUsername(username);
        hikariDataSource.setPassword(password);
        hikariDataSource.setJdbcUrl(url);
        hikariDataSource.setDriverClassName(driver);
        return hikariDataSource;
    }
}

DataBaseConfig 类的主要作用是配置和提供一个高效的数据源给Spring应用。它读取外部化的数据库配置信息,并创建一个优化过的HikariCP连接池实例,这有助于提高数据库操作的性能和可靠性。同时,这种做法也使得数据库配置易于管理和更改,无需修改代码即可适应不同的环境(如开发、测试、生产)。

  • 整和Mybatis配置类

package com.pyb.config;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import javax.sql.DataSource;
import java.io.IOException;
/**
 * @version 1.0
 * @Author 彭彦彬
 * @Date 2025/1/10 9:09
 * @注释
 */
@MapperScan("com.pyb.dao")
public class MyBatisConfig {
    @Bean
    public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource) throws IOException {
        SqlSessionFactoryBean sqlSessionFactoryBean=new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
​
       sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));
        return sqlSessionFactoryBean;
    }
}

总结来说,MyBatisConfig 类的作用是配置MyBatis框架,使其与Spring应用无缝集成。它实现了以下几点:

1.自动扫描并注册指定包下的所有Mapper接口。 2.创建并配置 SqlSessionFactoryBean,用于生成MyBatis的SQL会话。 3.指定MyBatis映射文件的位置,使得MyBatis能够找到并加载这些文件以执行SQL语句。

3.用以上整合好的配置类,编写对员工信息操作的业务接口

  • 建立一张员工信息表

create table emp
(
    empno    int auto_increment comment '雇员编号'
        primary key,
    ename    varchar(20) null comment '雇员姓名',
    job      varchar(9)  null comment '表示工作职位',
    mgr      int         null comment '表示一个雇员的领导编号',
    hiredate datetime    null comment '表示雇佣日期',
    sal      double      null comment '表示月薪,工资',
    comm     double      null comment '表示奖金或佣金',
    deptno   int         null
);
​
  • 编写实体类映射上面数据库表

@Data
public class Emp {
    private int empno;
    private String ename;
    private String job;
    private int mgr;
    private double sal;
    private double comm;
    private int deptno;
}
  • 编写要操作员工数据的dao层接口

@Select("select *from emp")
    List<Emp>findAllUser();
    @Insert("insert into emp(empno,ename,job,mgr,sal,comm,deptno)values (#{empno},#{ename},#{job},#{mgr},#{sal},#{comm},#{deptno})")
    int addEmp(Emp emp);
    @Delete("delete from emp")
    int deleteAll();
    @Select("select *from emp where empno=#{empNo}")
    Emp selectEmpByNo(@Param("empNo")String empNo);
    @Select("select*from emp where ename like concat(#{name},'%')")
    List<Emp> empSByLike(@Param("name")String name);
    @Delete("delete from emp where empno=#{empNo}")
    int deleteEmpByNo(@Param("empNo")String empNo);
    List<Emp> selectEmpByPage(@Param("currentPage") int currentPage, @Param("pageSize") int pageSize);
  • 接口分析

findAllUser(): 注解:@Select("select * from emp") 功能:查询所有员工记录。 返回值:返回一个包含所有员工信息的 List<Emp> 集合。 addEmp(Emp emp): 注解:@Insert("insert into emp(empno, ename, job, mgr, sal, comm, deptno) values (#{empno}, #{ename}, #{job}, #{mgr}, #{sal}, #{comm}, #{deptno})") 功能:向数据库中的emp表插入一条新的员工记录。 参数:接受一个 Emp 对象作为参数,该对象包含了要插入的新员工的所有属性。 返回值:返回受影响的行数,通常为1表示成功插入了一条记录。 deleteAll(): 注解:@Delete("delete from emp") 功能:删除emp表中所有的员工记录。 返回值:返回受影响的行数,即被删除的记录总数。 selectEmpByNo(@Param("empNo") String empNo): 注解:@Select("select * from emp where empno=#{empNo}") 功能:根据提供的员工编号查找特定的员工记录。 参数:接受一个名为empNo的字符串参数,代表要查找的员工编号。 返回值:返回匹配的 Emp 对象,如果未找到则可能返回null。 empSByLike(@Param("name") String name): 注解:@Select("select * from emp where ename like concat(#{name},'%')") 功能:模糊查询员工姓名,返回所有名字以给定字符串开头的员工。 参数:接受一个名为name的字符串参数,用于构建LIKE查询条件。 返回值:返回符合查询条件的 List<Emp> 集合。 deleteEmpByNo(@Param("empNo") String empNo): 注解:@Delete("delete from emp where empno=#{empNo}") 功能:根据提供的员工编号删除特定的员工记录。 参数:接受一个名为empNo的字符串参数,代表要删除的员工编号。 返回值:返回受影响的行数,即被删除的记录数。 selectEmpByPage(@Param("currentPage") int currentPage, @Param("pageSize") int pageSize): 功能:分页查询员工记录。 参数:接受两个整型参数,currentPage 表示当前页码,pageSize 表示每页显示的记录数。 返回值:返回对应页码和页面大小的 List<Emp> 集合。

4.编写前端代码

  • 配置代理服务器

   // 为本地 Spring Boot 应用创建一个代理规则
      '/api': {
        target: 'http://localhost:8080', // Spring Boot 应用的地址
        ws: true,                        // 是否代理WebSocket
        changeOrigin: true,              // 是否改变源
        rewrite: path => path.replace(/^\/api/, '') // 将 /api 前缀重写为空字符串
      }
  • 设置Axios实例来与后端通信

import axios from 'axios';
const apiClient = axios.create({
  baseURL: '/api', // 这个路径会根据Vite配置自动代理到Spring Boot后端
  withCredentials: false, // 如果不需要跨域认证,可以设置为false
  headers: {
    'Content-Type': 'application/json',
  }
});
export default apiClient;
  • 用elementplus编写表格主键展示员工信息

  <!-- 显示所有员工信息 -->
      <el-table :data="employees" style="width: 100%" stripe v-loading="loading">
        <el-table-column prop="empno" label="员工编号" width="180"></el-table-column>
        <el-table-column prop="ename" label="姓名" width="180"></el-table-column>
        <el-table-column prop="job" label="职位"></el-table-column>
        <el-table-column prop="mgr" label="上级"></el-table-column>
        <el-table-column prop="sal" label="薪资"></el-table-column>
        <el-table-column prop="comm" label="奖金"></el-table-column>
        <el-table-column prop="deptno" label="部门编号"></el-table-column>
        <el-table-column label="操作" width="300">
          <template #default="scope">
            <el-button size="small" type="danger" @click="handleDelete(scope.row)">删除</el-button>
            <el-button size="small" type="primary" @click="dialogVisible = true">新增员工</el-button>
          </template>
        </el-table-column>
      </el-table>
  • 定义响应式变量接收数据展示表格

const employees = ref([]);
  • 发送请求,获取分页数据

// 获取分页员工信息
const fetchEmployees = async () => {
  loading.value = true;
  try {
    const response = await apiClient.get('/emp/page', {
      params: { currentPage: currentPage.value, pageSize: pageSize.value }
    });
    employees.value = response.data.content || response.data;
    total.value = response.data.totalElements || response.data.length;
    error.value = null;
  } catch (err) {
    error.value = '获取员工列表失败,请稍后再试';
    ElMessage.error(error.value);
    console.error('API请求失败:', err.response ? err.response.data : err.message);
  } finally {
    loading.value = false;
  }
};
  • 定义输入框组件实现查找功能

<div style="margin-bottom: 20px;">
        <el-input v-model="searchName" placeholder="请输入员工姓名" style="width: 200px;"></el-input>
      </div>
  • 绑定输入框数据

const searchName = ref('');
  • 向服务器发送请求获取模糊查询数据,更新表格数据

// 根据姓名模糊查询员工
const fetchEmployeesByName = async () => {
  if (!searchName.value.trim()) {
    ElMessage.warning('请输入要搜索的员工姓名');
    return;
  }
  loading.value = true;
  try {
    const response = await apiClient.get('/emp/searchByName', {
      params: {name: searchName.value}
    });
    employees.value = response.data;
    total.value = response.data.length;
    currentPage.value = 1;
    error.value = null;
  } catch (err) {
    error.value = '搜索员工失败,请稍后再试';
    ElMessage.error(error.value);
    console.error('API请求失败:', err.response ? err.response.data : err.message);
  } finally {
    loading.value = false;
  }
};
  • 监听搜索框变化自动完成模糊查询

watch(searchName, (newValue) => {
  clearTimeout(searchTimeout.value); // 清除之前的定时器
​
  // 设置一个短暂的延迟以避免频繁请求
  searchTimeout.value = setTimeout(() => {
    if (newValue.trim()) {
      fetchEmployeesByName();
    } else {
      // 如果输入框为空,则重新加载全部员工列表
      fetchEmployees();
    }
  }, 300); // 300ms 的延迟
});
  • 编写新增按钮

  <el-button size="small" type="primary" @click="dialogVisible = true">新增员工</el-button>
  • 编写新增对话框

<!-- 新增员工对话框 -->
      <el-dialog title="新增员工" v-model="dialogVisible" width="30%">
        <el-form :model="newEmployee" :rules="rules" ref="newEmployeeFormRef" label-width="100px">
          <el-form-item label="员工编号" prop="empno">
            <el-input v-model="newEmployee.empno"></el-input>
          </el-form-item>
          <el-form-item label="姓名" prop="ename">
            <el-input v-model="newEmployee.ename"></el-input>
          </el-form-item>
          <el-form-item label="职位" prop="job">
            <el-input v-model="newEmployee.job"></el-input>
          </el-form-item>
          <el-form-item label="上级" prop="mgr">
            <el-input v-model="newEmployee.mgr"></el-input>
          </el-form-item>
          <el-form-item label="薪资" prop="sal">
            <el-input v-model="newEmployee.sal"></el-input>
          </el-form-item>
          <el-form-item label="奖金" prop="comm">
            <el-input v-model="newEmployee.comm"></el-input>
          </el-form-item>
          <el-form-item label="部门编号" prop="deptno">
            <el-input v-model="newEmployee.deptno"></el-input>
          </el-form-item>
        </el-form>
        <template #footer>
          <span class="dialog-footer">
            <el-button @click="dialogVisible = false">取 消</el-button>
            <el-button type="primary" @click="submitNewEmployee">确 定</el-button>
          </span>
        </template>
      </el-dialog>
  • const dialogVisible = ref(false);默认对话框不展现

  • 向服务器发送请求,新增数据

// 提交新增员工
const submitNewEmployee = async () => {
  newEmployeeFormRef.value.validate(async (valid) => {
    if (valid) {
      try {
        await apiClient.post('/emp/add', newEmployee.value);
        ElMessage({message: '新增成功', type: 'success'});
        dialogVisible.value = false;
        await fetchEmployees();
      } catch (err) {
        ElMessage.error('新增失败,请检查输入或稍后再试');
        console.error('API请求失败:', err.response ? err.response.data : err.message);
      }
    } else {
      console.log('验证失败');
      return false;
    }
  });
  • 编写删除逻辑,动态获取所在行的数据

<el-button size="small" type="danger" @click="handleDelete(scope.row)">删除</el-button>
  • 向服务器发送请求,删除数据

// 处理删除
const handleDelete = async (row) => {
  try {
    const confirmResult = await ElMessageBox.confirm(
        '确定要删除该员工吗?',
        '警告',
        {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        }
    );
    if (confirmResult !== 'confirm') return;
​
    await apiClient.delete(`/emp/delete/${row.empno}`);
    ElMessage({message: '删除成功', type: 'success'});
​
    await fetchEmployees();
  } catch (err) {
    if (err === 'cancel') {
      ElMessage({
        type: 'info',
        message: '已取消删除'
      });
    } else {
      ElMessage.error('删除失败,请检查输入或稍后再试');
      console.error('API请求失败:', err.response ? err.response.data : err.message);
    }
  }
};
  • 分页组件的使用

<el-pagination
    v-show="!searchName"
    @size-change="handleSizeChange"
    @current-change="handleCurrentChange"
    :current-page="currentPage"
    :page-sizes="[5, 10, 20, 50]"
    :page-size="pageSize"
    layout="total, sizes, prev, pager, next, jumper"
    :total="total"
    style="margin-top: 20px;"
>
</el-pagination>

@size-change="handleSizeChange": 当用户改变了每页显示的条目数时触发此事件,并调用 handleSizeChange 方法处理逻辑,通常会更新 pageSize 并重新加载数据。 @current-change="handleCurrentChange": 当用户点击了不同的页码或使用“上一页”、“下一页”按钮时触发此事件,并调用 handleCurrentChange 方法处理逻辑,通常会更新 currentPage 并重新加载对应页的数据。

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

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

相关文章

WMS仓库管理系统,Vue前端开发,Java后端技术源码(源码学习)

一、项目背景和建设目标 随着企业业务的不断扩展&#xff0c;仓库管理成为影响生产效率、成本控制及客户满意度的重要环节。为了提升仓库作业的透明度、准确性和效率&#xff0c;本方案旨在构建一套全面、高效、易用的仓库管理系统&#xff08;WMS&#xff09;。该系统将涵盖库…

Pathview包:整合表达谱数据可视化KEGG通路

Pathview是一个用于整合表达谱数据并用于可视化KEGG通路的一个R包&#xff0c;其会先下载KEGG官网上的通路图&#xff0c;然后整合输入数据对通路图进行再次渲染&#xff0c;从而对KEGG通路图进行一定程度上的个性化处理&#xff0c;并且丰富其信息展示。&#xff08;KEGG在线数…

数据结构:DisjointSet

Disjoint Sets意思是一系列没有重复元素的集合。一种常见的实现叫做&#xff0c;Disjoint-set Forest可以以接近常数的时间复杂度查询元素所属集合&#xff0c;用来确定两个元素是否同属一个集合等&#xff0c;是效率最高的常见数据结构之一。 Wiki链接&#xff1a;https://en…

更好的世界:用定制托管对象上下文(NSManagedObjectContext)防止产生“空白”托管对象(下)

概述 用 SwiftUI CoreData 这对“双剑合璧”的强力开发组合&#xff0c;我们可以事倍功半、非常 easy 的开发出界面元素丰富且背后拥有持久数据库支持的 App。 不过&#xff0c;在某些情况下它们被误用或错用也可能带来一些“藏形匿影”的顽疾。 在本篇博文中&#xff0c;您…

个人在技术领导力方面的自我反思与提升

大家好&#xff01;我是 [数擎 AI]&#xff0c;一位热爱探索新技术的前端开发者&#xff0c;在这里分享前端和 Web3D、AI 技术的干货与实战经验。如果你对技术有热情&#xff0c;欢迎关注我的文章&#xff0c;我们一起成长、进步&#xff01; 开发领域&#xff1a;前端开发 | A…

Win10本地部署大语言模型ChatGLM2-6B

鸣谢《ChatGLM2-6B&#xff5c;开源本地化语言模型》作者PhiltreX 作者显卡为英伟达4060 安装程序 打开CMD命令行&#xff0c;在D盘新建目录openai.wiki if not exist D:\openai.wiki mkdir D:\openai.wiki 强制切换工作路径为D盘的openai.wiki文件夹。 cd /d D:\openai.wik…

排列高手

这篇主要是求再排位为 {1&#xff0c;3&#xff0c;4&#xff0c;....&#xff0c;n&#xff0c;2}的最优顺序下求mex。 但不知道为什么这样是最优 子数列的个数公式&#xff1a; 对于一个长度为N的数组&#xff0c; #include <bits/stdc.h> using namespace std; lon…

公众号如何通过openid获取unionid

通过接口 https://api.weixin.qq.com/cgi-bin/user/info?access_tokenxxxxxxx&langzh_CN 返回的数据如下&#xff1a; 前提是必须绑定 微信开放平台 token如何获取呢 代码如下&#xff1a; String tokenUrl "https://api.weixin.qq.com/cgi-bin/token"; …

软件测试预备知识④—NTFS权限管理、磁盘配额与文件共享

在软件测试的实际环境搭建与管理过程中&#xff0c;了解和掌握NTFS权限管理、磁盘配额以及文件共享等知识至关重要。这些功能不仅影响系统的安全性和稳定性&#xff0c;还对测试数据的存储、访问以及多用户协作测试有着深远的影响。 一、NTFS权限管理 1.1 NTFS简介 NTFS&am…

类结构——构造方法

类结构——构造方法 构造方法的基本特性默认构造方法构造方法重载使用this关键字私有构造方法总结 构造方法&#xff08;Constructor&#xff09;是Java编程语言中的一个重要概念&#xff0c;用于初始化新创建的对象。在对象实例化时被调用&#xff0c;并负责设置对象的初始状态…

【linux系统之redis6】redis的安装与初始化

下载redis的linux对应的安装包&#xff0c;并上传到linux虚拟机里面 解压压缩包 tar -zxzf redis-6.2.6.tar.gz解压后&#xff0c;进入redis文件 cd redis-6.2.6执行编译 make && make install看到下图&#xff0c;就说明redis安装成功了 默认的安装路径&#xff0c…

STM32-笔记40-BKP(备份寄存器)

一、什么是BKP&#xff08;备份寄存器&#xff09;&#xff1f; 备份寄存器是42个16位的寄存器&#xff0c;可用来存储84个字节的用户应用程序数据。他们处在备份域里&#xff0c;当VDD电源被切断&#xff0c;他们仍然由VBAT维持供电。当系统在待机模式下被唤醒&#xff0c;或…

MobaXterm界面的简单介绍

界面全局 “命令行界面”&#xff08;Command Line Interface&#xff0c;简称CLI&#xff09;或“终端”&#xff08;Terminal&#xff09; 在这个界面中&#xff0c;用户可以输入命令来与操作系统进行交互,灰色光标是输入命令的位置 标签栏&#xff08;Tab Bar&#xff09; …

有收到腾讯委托律师事务所向AppStore投诉带有【水印相机】主标题名称App的开发者吗

近期&#xff0c;有多名开发者反馈&#xff0c;收到来自腾讯科技 (深圳) 有限公司委托北京的一家**诚律师事务所卞&#xff0c;写给AppStore的投诉邮件。 邮件内容主要说的是&#xff0c;腾讯注册了【水印相机】这四个字的商标&#xff0c;所以你们这些在AppStore上的app&…

UI自动化测试保姆级教程①

欢迎来到阿妮莫的学习小屋慢也好&#xff0c;步子小也好&#xff0c;在往前走就好 目录 自动化测试 简介 作用 分类 优缺点 优点 缺点(误区) UI自动化测试 自动化测试使用场景 自动化测试实现时间 Selenium框架 特点 Web自动化测试环境部署 Selenium包安装 浏览…

Linux 下信号的保存和处理

信号的几个状态 信号抵达: 当接收到的信号被处理时, 此时就成为信号的抵达信号的未决: 从信号的产生到信号抵达这个时间段之间, 称为信号未决信号阻塞: 当进程设置了某个信号为阻塞后, 这个进程就不会在接收到这个信号信号忽略: 将信号设置为忽略后, 接收到这个信号, 对这个信…

IntelliJ IDEA中Maven项目的配置、创建与导入全攻略

大家好&#xff0c;我是袁庭新。 IntelliJ IDEA是当前最流行的Java IDE&#xff08;集成开发环境&#xff09;之一&#xff0c;也是业界公认最好用的Java开发工具之一。IntelliJ IDEA支持Maven的全部功能&#xff0c;通过它我们可以很轻松地实现创建Maven项目、导入Maven项目、…

深度学习笔记11-优化器对比实验(Tensorflow)

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目录 一、导入数据并检查 二、配置数据集 三、数据可视化 四、构建模型 五、训练模型 六、模型对比评估 七、总结 一、导入数据并检查 import pathlib,…

JavaEE之定时器及自我实现

在生活当中&#xff0c;有很多事情&#xff0c;我们不是立马就去做&#xff0c;而是在规定了时间之后&#xff0c;在到该时间时&#xff0c;再去执行&#xff0c;比如&#xff1a;闹钟、定时关机等等&#xff0c;在程序的世界中&#xff0c;有些代码也不是立刻执行&#xff0c;…

Qt学习笔记第81到90讲

第81讲 串口调试助手实现自动发送 为这个名叫“定时发送”的QCheckBox编写槽函数。 想要做出定时发送的效果&#xff0c;必须引入QT框架下的毫秒级定时器QTimer&#xff0c;查阅手册了解详情。 在widget.h内添加新的私有成员变量&#xff1a; QTimer *timer; 在widget类的构造…