【SpringMVC】数据格式化+数据验证

news2024/10/6 12:19:48

目录
一、前言
二、目录结构
三、数据格式化
四、数据验证
五、数据格式化、验证梳理图
六、数据格式化、验证梳理图


相关文章

【SpringMVC】入门篇:带你了解SpringMVC的执行流程【SpringMVC】入门篇:带你了解SpringMVC的执行流程
【SpringMVC】使用篇:SpringMVC的开始 【SpringMVC】使用篇:SpringMVC的开始
【SpringMVC】SpringMVC模型数据+视图解析器 【SpringMVC】SpringMVC模型数据+视图解析器

一、前言

 在上一节的内容中,我们着重了解了SpringMVC的视图解析器。理清了一个请求从发送到响应的整个大致流程,最主要的是在Controller中为什么可以通过return一个字符串,就可以跳转到响应的页面。
 这节我们来了解一下SpingMVC其余的一些内容。在此之前,我们先提出一个需求:当我们需要对提交数据的类型进行限制的时候,应该如何来处理❓
✅利用之前所学的知识 ,我们可以通过前端js来做限制,也可以通过在后端Servlet中根据需求来做一些数据的转化工作。以上这些,虽然都可以完成我们的工作但很明显的一个问题就是:我们需要知道这个数据到底需要哪些类型的数据。
✅基于以上的问题SpringMVC给我们提供了一个解决方案:在后端定义数据类型的时候,通过注解直接来指定我们的数据类型(类型的自动转换)或者说是对数据做一些限制,这种方式使得我们业务逻辑更加的清晰。

二、目录结构

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

三、数据格式化

1. 普通类型的转换

前端

<%--
  Created by IntelliJ IDEA.
  User: huawei
  Date: 2022/11/28
  Time: 18:56
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>SpringMVC数据格式化</title>
</head>
<body>
<h1>SpringMVC数据格式化</h1>
<hr>
<a href="<%=request.getContextPath()%>/addMonsterUI">添加妖怪</a>
</body>
</html>

<h3>添加妖怪</h3>
<form action="save">
    妖怪名字:<input type="text" name="name"/><br/>
    妖怪年龄:<input type="text" name="age"/><br/>
    妖怪邮箱:<input type="text" name="email"/><br/>
    <input type="submit" value="添加妖怪">
</form>

后端 Montser类

package com.jl.web.datavild.entity;

import org.hibernate.validator.constraints.NotEmpty;
import org.hibernate.validator.constraints.Range;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.format.annotation.NumberFormat;

import javax.validation.constraints.NotNull;
import java.util.Date;

/**
 * ClassName: Monster
 * Package: com.jl.web.datavild.entity
 * Description: 数据转换测试需要用到的类
 *
 * @Author: Long
 * @Create: 2022/11/28 - 18:54
 * @Version: v1.0
 */
public class Monster {
    private String name;
    private Integer age;
    private String email;
    public Monster() {
    }
    public Monster(String name, Integer age, String email) {
        this.name = name;
        this.age = age;
        this.email = email;
    }
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
    
    @Override
    public String toString() {
        return "Monster{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", email='" + email + '\'' +
                '}';
    }
}

 在SpringMVC的使用那一章节中,我们提到了请求映射数据:SpringMVC可以将前端提交的数据,封装成对象。在这个例子中:我们看一下不同情况下的响应结果。

  1. 前端年龄age为非数字时:
    在这里插入图片描述
    在这里插入图片描述
  2. 前端年龄age为数字时:
    在这里插入图片描述
    在这里插入图片描述
     通过上边的这个示例,我们可以看到:当前端数据为字符串的时候,SpringMVC可以将根据需要转换的类型进行自动转换,但当转换失败的时候(例如:非数字无法转换成数数字),会返回400错误

2. 特殊类型的转换

 除了字符串转换为数字之外,我们在使用中也会遇到很多其他特殊类型的数据格式需要进行转换。
 下边我们演示两种特使格式的转化(格式化):

前端

<h3>添加妖怪</h3>
<form action="save1">
    妖怪名字:<input type="text" name="name"/><br/>
    妖怪年龄:<input type="text" name="age"/><br/>
    妖怪邮箱:<input type="text" name="email"/><br/>
    生日:<input type="text" name="birthday"/>格式:"2000-11-11"<br/>
    薪水:<input type="text" name="salary"/>格式:"666,666.66"<br/>
    <input type="submit" value="添加妖怪">
</form>

后端

package com.jl.web.datavild.entity;

import org.hibernate.validator.constraints.NotEmpty;
import org.hibernate.validator.constraints.Range;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.format.annotation.NumberFormat;

import javax.validation.constraints.NotNull;
import java.util.Date;

/**
 * ClassName: Monster
 * Package: com.jl.web.datavild.entity
 * Description: 数据转换测试需要用到的类
 *
 * @Author: Long
 * @Create: 2022/11/28 - 18:54
 * @Version: v1.0
 */
public class Monster {
    private String name;
    private Integer age;
    private String email;
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date birthday;
    @NumberFormat(pattern = "###,###.##")
    private Float salary;

    public Monster(String name, Integer age, String email, Date birthday, Float salary) {
        this.name = name;
        this.age = age;
        this.email = email;
        this.birthday = birthday;
        this.salary = salary;
    }

    public Monster() {
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public Float getSalary() {
        return salary;
    }

    public void setSalary(Float salary) {
        this.salary = salary;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

     @Override
    public String toString() {
        return "Monster{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", email='" + email + '\'' +
                ", birthday=" + birthday +
                ", salary=" + salary +
                '}';
    }
  1. 生日和薪水格式都正确的情况:
    在这里插入图片描述
    在这里插入图片描述
  2. 生日和薪水格式有误的情况:
    在这里插入图片描述
    在这里插入图片描述

 从上边这些我们都可以看出,当我们的数据转换出现问题的时候,都会返回400错误,而这种回显方式显然是很不合理的,下边我们会给出解决方案。

四、数据验证

数据验证需要的jar包。
在这里插入图片描述


 数据验证实际上就是我们有的场景下需要对一些数据做一些限制,例如:不为空,数值范围做一些限制等…


前端

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="from" uri="http://www.springframework.org/tags/form" %>
<%--
  Created by IntelliJ IDEA.
  User: huawei
  Date: 2022/11/28
  Time: 18:57
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>添加妖怪页面</title>
</head>
<body>
<h3>添加妖怪</h3>
<form:form action="save" modelAttribute="monster">
    妖怪名字:<from:input path="name"/><form:errors path="name"/><br/>
    妖怪年龄:<from:input path="age"/><form:errors path="age"/><br/>
    妖怪邮箱:<from:input path="email"/><form:errors path="email"/><br/>
    生日:<form:input path="birthday"/><form:errors path="birthday"/><br/>
    薪水:<form:input path="salary"/><form:errors path="salary"/><br/>
    <input type="submit" value="添加妖怪">
</form:form>
</body>
</html>

 在这个表单中,我们使用了<form:form>这个标签,这是SpringMVC提供的一个标签。它的使用主要注意以下几点:

  1. SpringMVC 表单标签在显示之前必须在request中有一个 bean, 该 bean 的属性和表单标签的字段要对应。
  2. request 中的 key 为: form 标签的modelAttrite属性值, 比如这里的 monsters。

 在上边的前端代码中,我们使用了SpringMVC提供的标签,这是为了方便于回显我们的数据。也就是当出现数据转换错误,或者数据验证错误的时候,不会回显我们的400错误,而是回显提示信息

后端

package com.jl.web.datavild.entity;

import org.hibernate.validator.constraints.NotEmpty;
import org.hibernate.validator.constraints.Range;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.format.annotation.NumberFormat;

import javax.validation.constraints.NotNull;
import java.util.Date;

/**
 * ClassName: Monster
 * Package: com.jl.web.datavild.entity
 * Description: 数据转换测试需要用到的类
 *
 * @Author: Long
 * @Create: 2022/11/28 - 18:54
 * @Version: v1.0
 */
public class Monster {
    private Integer id;
    // 不能为空(null),也不能为empty
    // Asserts that the annotated string, collection, map or array is not {@code null} or empty.
    @NotEmpty
    private String name;

    // 我们的注解可以配合使用。但需要注意的是:NotNull和NotEmpty是有所区别的,NotNull支持所有的类型
    @NotNull(message = "age不能为空")
    // 指定数值的范围,默认最小值是0,最大值是Long的最大值(Long.MAX_VALUE)
    @Range(min = 1,max=100)
    private Integer age;
    @NotEmpty(message = "邮箱不能为空")
    private String email;
    @NotNull(message = "生日不能为空")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date birthday;
    @NotNull(message = "薪水不能为空")
    @NumberFormat(pattern = "###,###.##")
    private Float salary;

    public Monster(Integer id, String name, Integer age, String email, Date birthday, Float salary) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.email = email;
        this.birthday = birthday;
        this.salary = salary;
    }

    public Monster() {
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public Float getSalary() {
        return salary;
    }

    public void setSalary(Float salary) {
        this.salary = salary;
    }

    @Override
    public String toString() {
        return "Monster{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", email='" + email + '\'' +
                ", birthday=" + birthday +
                ", salary=" + salary +
                '}';
    }
}
package com.jl.web.datavild;

import com.jl.web.datavild.entity.Monster;
import org.springframework.context.annotation.Scope;
import org.springframework.core.convert.ConversionService;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.DataBinder;
import org.springframework.validation.Errors;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.validation.Valid;
import java.util.List;
import java.util.Map;

/**
 * ClassName: MonsterHandler
 * Package: com.jl.web.datavild
 * Description: 用于演示数据转换/验证
 *
 * @Author: Long
 * @Create: 2022/11/28 - 19:12
 * @Version: v1.0
 */
@Controller
@Scope(value = "prototype")
public class MonsterHandler {
    /**
     * 当我们在map存放数据的时候,他会存放到request
     * @param map
     * @return
     */
    // 显示添加monster的页面
    @RequestMapping(value = "/addMonsterUI")
    public String addMonster(Map<String,Object> map){
        // 如果使用了SpringMVC的表单,那么就得在request中放入一个bean对象
        // 这个对象的属性名要对应 表单标签的 modelAttribute 属性值。
        map.put("monster",new Monster());
        return "datavaild/monster_addUI";
    }

    /**
     * SpringMVC可以将提交的数据,按参数名和对象的属性匹配,封装成一个对象。
     * @Valid Monster monster表示对monster进行校验
     * Errors errors,如果校验的过程中出现错误,会将其保存到 errors 对象中
     * Map<String,Object> map,如果校验出现错误,讲错误信息保存到map中去,同时报错monster对象
     *
     * 校验发生的时机:在SpringMVC底层反射调用目标方法时,会接收到http请求,然后根据注解来进行校验
     *      在校验过程中,如果出现了错误,就把错误信息填充到errors和 map 中
     * @param monster
     * @return
     */
    // 编写方法,处理添加妖怪
    @RequestMapping(value = "/save")
    public String save(@Valid Monster monster, Errors errors, Map<String,Object> map){
        System.out.println("----monster----" + monster);
        System.out.println("====map=====");
        for (Map.Entry<String, Object> entry : map.entrySet()) {
            System.out.println("key= " + entry.getKey() + " " + "value= " +entry.getValue());
        }
        System.out.println("====errors=====");
        if (errors.hasErrors()){
            List<ObjectError> allErrors = errors.getAllErrors();
            for (ObjectError allError : allErrors) {
                System.out.println("error=" + allError);
            }
            return "datavaild/monster_addUI";
        }
        return "datavaild/success";
    }

注意:我们想要使用数据验证,还得再验证的数据(对象)之前,加上@Vaild注解才能生效。

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

在这里插入图片描述

 通过后端控制台输出的信息发现,SpringMVC会将错误信息封装到Error对象中,同时也会将信息存入Map对象中。
 除此之外,我们前端虽然回显了错误信息,但是这中回显信息可以说是巨丑😜的。所以还需要做一些配置,来处理这种问题。
配置国际化文件

NotEmpty.monster.name=\u7528\u6237\u540d\u4e0d\u80fd\u4e3a\u7a7a
typeMismatch.monster.age=\u5e74\u9f84\u4e0d\u6b63\u786e
typeMismatch.monster.birthday=\u751f\u65e5\u683c\u5f0f\u4e0d\u6b63\u786e
typeMismatch.monster.salary=\u85aa\u6c34\u683c\u5f0f\u4e0d\u6b63\u786e

这里创建的是properties文件。key是错误信息类型,value是该错误对应的回显的信息,这里我们需要将中文转成unicode
我们的错误信息类型可以在控制台输出信息中找到:
在这里插入图片描述
创建好国际化配置文件之后,我们还需要添加到SpirngMVC配置文件中。

 <!--配置国际化资源处理Bean-->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    <!--配置国际化文件名字
        这样表示 messageSource 会到src/i18nXXX.properties去读取错误信息
    -->
    <property name="basename" value="i18n"/>
</bean>

这里的il8n是我们的国际化配置文件名称。

配置好这些之后,我们看一下效果:
在这里插入图片描述

五、@InitBinder注解的使用

 讲解@InitBinder是在有些场景下,我们不想自动绑定某个属性,我们的这个注解可以取消属性的绑定。

@InitBinder
public void initBinder(WebDataBinder webDataBinder){
   /**
    * 1. 方法上标注@initBinder springMVC底层会初始化WebDataBinder
    * 2. 调用webDataBinder.setDisallowedFields("name")。表示取消指定属性的绑定
    * 3. 底层:springMVC通过反射调用目标方法时,接收到http请求的参数和值,使用反射+注解的结束,取消
    *          对指定属性的填充。
    * 4. setDisallowedFields;支持可变参数,参数可以有多个
    * 5. 如果我们取消某个属性的绑定,验证也就没有意义了,应当把验证的注解去掉
    */
   webDataBinder.setDisallowedFields("name");
}

我们这里演示取消Monster类中的name属性绑定。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们这里可以发现,虽然我们的前端数据提交了name数据,大但我们取消了属性的绑定,所以name的值为null。

 在取消属性绑定的时候,需要注意的是:取消了name的属性绑定,那么name上也就不能@NotEmpty等验证注解,否则提交不了数据。

六、数据格式化、验证流程梳理图

在这里插入图片描述

 以上就是这节的所有内容。
如果文章中有描述不准确或者错误的地方,还望指正。您可以留言📫或者私信我。🙏
最后希望大家多多 关注+点赞+收藏^_^,你们的鼓励是我不断前进的动力!!!
感谢感谢~~~🙏🙏🙏

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

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

相关文章

ref的使用方法 ,组件通信父传子,组件通信子传父,组件分离模块化, v-model 传值的3种方式

原生获取一个节点&#xff1a;document.getElementById() vue方式操作dom节点&#xff1a;ref 通过给元素设定ref属性在vue实例中获取这个元素: <input type"text" ref"input" placeholder"请输入内容"> 组件挂载后(mounted)才能访问…

【重要】有三AI技术专栏作者邀请,5大权益助力共同成长

知识分享平台众多&#xff0c;我们有三AI公众号是其中一个&#xff0c;在过去的3年里&#xff0c;我们已经写了700多篇&#xff0c;超过200万字的技术文&#xff0c;其中一些专栏作者的贡献功不可没。我们公众号只做原创内容&#xff0c;因为我并不希望平台成为一个靠复制转载内…

通过运维编排实现自动化智能运维与故障自愈

自动化帮助用户消除重复性任务&#xff0c;从而降低运营成本、提高效率并提高团队生产力。但是&#xff0c;将自动化引入复杂的 IT 环境还需要编排。编排是指一次性自动执行多项任务&#xff0c;涉及到计算机系统、中间件和服务的自动布置、协调和管理&#xff0c;利用自动执行…

10个最频繁使用的聚类算法 Python 实现(附完整代码)

大家好&#xff0c;聚类或聚类分析是无监督学习问题。它通常被用作数据分析技术&#xff0c;用于发现数据中的有趣模式&#xff0c;例如基于其行为的客户群。 有许多聚类算法可供选择&#xff0c;对于所有情况&#xff0c;没有单一的最佳聚类算法。相反&#xff0c;最好探索一…

46. 批量规范化

训练深层神经网络是十分困难的&#xff0c;特别是在较短的时间内使他们收敛更加棘手。 本节将介绍批量规范化&#xff08;batch normalization&#xff09;,这是一种流行且有效的技术&#xff0c;可持续加速深层网络的收敛速度。 再结合在 将介绍的残差块&#xff0c;批量规范…

盘点 | 基于小程序语法的跨端开发平台

最近&#xff0c;微信于2022年12月18日悄悄的推出了一款名叫“Donut”的开发平台。根据开发文档的产品介绍来看&#xff0c;该平台的核心是多端框架&#xff0c;支持使用小程序进行代码编写&#xff0c;并进行多端编译&#xff0c;从而实现多端开发。 目前Donut开发平台已经开…

Android 音视频入门/进阶教程

后续的音视频文章&#xff0c;都会在这里更新 作为安卓开发仔&#xff0c;对音视频这块&#xff0c;一直是比较感兴趣的&#xff0c;所以&#xff0c;本着学习和记录的态度&#xff0c;我也把我所学的知识记录起来&#xff0c;希望对想音视频感兴趣的小伙伴有所帮忙。 一. 基础…

SpringBoot maven 项目 JDBC 连接多源数据库

此方法支持 mysql&#xff0c;oracle&#xff0c;postgre&#xff0c;sqlserver等等 基本逻辑&#xff1a;1. 加载驱动; 2. 通过DriverManager传入数据库地址&#xff0c;用户名&#xff0c;密码&#xff0c;获取本地数据库连接 1. pom文件下添加依赖 <dependency><…

Android 多线程下载以及断点续传

多线程下载 在日常开发中&#xff0c;我们不可避免的会接到类似这样的需求&#xff0c;下载一个比较大的素材文件或者安装包文件&#xff0c;以此实现APP的自动更新&#xff0c;APP内的素材替换等。由于一般此类文件都比较大&#xff0c;一般会在50M以上&#xff0c;如果我们不…

高效好用的开发工具箱——猿如意

目录 前言&#xff1a; 1.我常用的功能介绍 2.主要功能chatGPT测评 3.我的使用体验和改进建议 前言&#xff1a; 猿如意是一款帮助开发的效率工具&#xff0c;集成了许多有用的工具和文档教程。帮助开发者提升开发效率&#xff0c;帮你从“问题”找到“答案”。尤其是12月…

加注超融合 星辰天合推出 XHERE V2 系列

近日&#xff0c;北京星辰天合科技股份有限公司&#xff08;简称&#xff1a;“XSKY星辰天合”&#xff09;成功举办了主题为“能存会算&#xff0c;创新不断”的 XHERE 超融合新品渠道推介会&#xff0c;正式向市场推出 XHERE V2 超融合软件平台。通过继续加大对超融合产品线的…

上云节省 35%计算资源,420 个运维人天:运满满实时计算实践和思考

摘要&#xff1a;本文整理自满帮实时数据团队 TL 欧锐&#xff0c;在 FFA 2022 行业案例专场的分享。本篇内容主要分为四个部分&#xff1a;满帮业务及平台架构介绍实时数据实时产品未来计划Tips&#xff1a;点击「阅读原文」查看原文视频&演讲 ppt01满帮业务及平台架构介绍…

数据可视化系列-01大数据可视化基础

文章目录1.概述2.大数据可视化基础2.1 数据可视化基础知识1、数据可视化简史&#xff1a;2、数据可视化是什么&#xff1a;3、数据可视化的分类&#xff1a;4、数据可视化流程&#xff1a;5、数据可视化的意义&#xff1a;2.2 认识BI和数据可视化工具1、BI的简介&#xff1a;BI…

RabbitMQ:订阅模型-匹配模式

阅模型-匹配模式&#xff0c;相比于前两种订阅模型&#xff0c;是更细致的分组&#xff0c;允许 在RoutingKey 中使用匹配符 *&#xff1a;匹配一个单词#&#xff1a;匹配0个或多个单词 RabbitMQ 订阅模型-匹配&#xff08;topics&#xff09;模式主要有以下六个角色构成&#…

FFmpeg功能命令汇总

前言 如此强大的FFmpeg&#xff0c;能够实现视频采集、视频格式转化、视频截图、视频添加水印、视频切片、视频录制、视频推流、更改音视频参数功能等。通过终端命令如何实现这些功能&#xff0c;Richy在本文做一记录&#xff0c;以备之后查阅。 注意&#xff1a;下面一一列举…

AI4DB-Cardinality Estimation

一个学期已经结束了&#xff0c;通过这篇文章总结一下自己在CE方面所学习的内容。 由于大数据技术的飞速发展&#xff0c;使数据库在查询方面面临很大的挑战。原来数据量不大的时候&#xff0c;查询可以在很快的时间内得到结果&#xff0c;但是现在动辄就是上万上千万甚至上亿的…

数据结构之红黑树的生成、添加以及删除详解(附代码)

一&#xff0c;红黑树的来历 红黑树&#xff0c;首先是一个二叉树&#xff0c;对于二叉树&#xff0c;人们为了提升它的搜索效率&#xff0c;降低时间复杂度&#xff0c;创造出了二叉搜索树&#xff0c;把时间复杂度降低为对数级&#xff08;LOGn)&#xff0c;但是会出现一些极…

zookeeper之基本使用及实现分布式锁

写在前面 本文一起看下zk的基本用法。 安装 。 1&#xff1a;数据结构 采用类似于linux系统的文件系统存储结构&#xff0c;但不同于Linux系统文件&#xff0c;zk每个节点都可以存储数据&#xff0c;结构如下图&#xff1a; 节点类型分为如下四种&#xff1a; PERSISTENT&…

RK3568平台开发系列讲解(设备驱动篇)中断下文之tasklet的使用

🚀返回专栏总目录 文章目录 一、tasklet 的概念二、tasklet 参考步骤沉淀、分享、成长,让自己和他人都能有所收获!😄 📢我们一般将中断分为上下两个部分,分为上半部,下半部。上半部完成有严格时限的工作(必须),例如回复硬件等,这些工作都是在禁止其他中断情况下进…

汽车相关概念记录

目录 一、汽车电路相关概念 1.1、两个电源 1.2、单线制 1.3、低压直流供电 1.4、常电与ACC 1.4.1、大众ACC供电开关 1.4.2、奥迪ACC开关 二、电子电路 2.1、三极管 2.1.2、截止状态 2.1.3、放大区 2.1.4、饱和区 2.1.4、实例分析 一、汽车电路相关概念 1.1、两个电…