SpringMVC Day 07 : 表单验证

news2024/12/26 21:05:29

前言

表单验证在Web开发中是非常常见和重要的一部分,它用于确保用户提交的数据符合预期的规则和限制。

通过表单验证,我们可以有效地捕获并处理用户输入中的错误或不正确的数据,从而提高应用程序的数据质量和用户体验。在本教程中,我们将学习如何使用Spring MVC的表单验证功能来验证用户提交的表单数据,并处理验证结果。

在接下来的内容中,我们将深入了解Spring MVC表单验证的各个方面,包括如何定义验证规则、如何显示验证错误信息以及如何处理验证结果等。我们还将探讨常见的表单验证场景,并提供实际示例来演示如何实现这些验证逻辑。

一、前期准备

1、新建项目,结构如下

 2、导入依赖 
    <dependencies>
    
        <!-- springmvc 依赖,会将spring的核心包一并添加进来 -->
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.23</version>
        </dependency>
     
 
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.30</version>
        </dependency>
 
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.4.5</version>
        </dependency>

        <!-- 集成 hibernata bean 验证器 -->
        <dependency>
            <groupId>org.hibernate.validator</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>6.0.13.Final</version>
        </dependency>
 
 
 
    </dependencies>

hibernate-validator是一个基于Hibernate Validator的Java Bean验证框架。它提供了一组用于验证Java Bean属性的注解,并具有灵活、可扩展的验证机制。

使用hibernate-validator可以实现对Java Bean对象进行数据验证和校验,确保对象符合预期的规则和约束。它可以用于以下方面:

  1. 参数校验:在方法参数上添加注解,对传入的参数进行验证,以确保参数满足指定的条件。例如,可以验证参数是否为非空、是否满足正则表达式、是否在指定的范围内等。

  2. 表单验证:在表单提交时,对表单中的字段进行验证,以确保用户输入的数据符合要求。例如,可以验证用户名、密码、邮箱等字段的格式和有效性。

  3. 实体类验证:在保存或更新实体对象时,对实体类中的字段进行验证,以确保数据的完整性和一致性。例如,可以验证实体对象的属性是否为空、长度是否符合要求、是否满足特定的业务规则等。

  4. 自定义验证:除了使用内置的验证注解外,还可以自定义验证注解和验证器,以实现更复杂的验证逻辑。通过自定义注解和验证器,可以灵活地定义和扩展验证规则。

通过引入hibernate-validator的依赖,可以在项目中使用其提供的注解来对Java Bean对象进行验证。在验证过程中,如果发现验证不通过,将会抛出相关的异常或返回验证结果,从而方便开发者处理验证失败的情况。

 3、配置 web.xml 
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

用于配置 Servlet 的映射和加载。在 Spring MVC 中,它用于配置 DispatcherServlet 的初始化和请求映射。

具体来说,这段配置的作用如下:

  1. 定义了一个名为 "dispatcher" 的 Servlet,并指定了 org.springframework.web.servlet.DispatcherServlet 作为其处理类。
  2. 设置了 load-on-startup 属性为 1,表示在应用启动时就加载该 Servlet。
  3. 使用 <servlet-mapping> 元素将 "dispatcher" Servlet 映射到所有的请求路径上(即 <url-pattern>/</url-pattern>),意味着所有的请求都会经过该 Servlet 进行处理。

 这段配置的作用是将所有的请求交给 DispatcherServlet 处理,并让它成为应用的核心控制器。DispatcherServlet 将根据请求的 URL 和其他配置信息,将请求分发给相应的处理器方法进行处理,然后返回响应结果。

4、在 resources 包下新建一个 message.properties
user.userName.notEmpty = 请输入用户名
user.age.notNull = 请输入年龄
user.age.min = 年龄不能小于18
user.birth.notNull = 请输入出生年月日
user.email.notEmpty = 请输入邮箱地址
user.email.legal = 请填写合法的email邮箱

这里面的值会在实体类中获取。 

5、新建 User 实体类

@Data
public class User {

    /**
     * 验证空字符串
     */
    @NotEmpty(message = "{user.userName.notEmpty}")
    private String userName;

    /**
     * 验证空值
     */
    @NotNull(message = "{user.age.notNull}")
    /**
     * 最小值范围
     */
    @Min(value = 18,message = "{user.age.min}")
    private Integer age;

    @NotNull(message = "{user.birth.notNull}")
    //@DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date brith;

    @NotEmpty(message = "{user.email.notEmpty}")
    @Email(message = "{user.email.legal}")
    private String email;

}

这段代码是一个User类的定义,使用了一些注解来进行数据验证。下面是每个注解的作用:

  1. @NotEmpty(message = "{user.userName.notEmpty}"):该注解用于验证字符串属性值是否非空。如果userName属性为空字符串,则会产生一个指定消息的验证错误。

  2. @NotNull(message = "{user.age.notNull}"):该注解用于验证属性值是否非空。如果age属性为空值(null),则会产生一个指定消息的验证错误。

  3. @Min(value = 18, message = "{user.age.min}"):该注解用于验证数值属性值是否大于等于指定的最小值。在这个例子中,如果age属性的值小于18,则会产生一个指定消息的验证错误。

  4. @NotNull(message = "{user.birth.notNull}"):该注解用于验证属性值是否非空。如果birth属性为空值(null),则会产生一个指定消息的验证错误。

  5. //@DateTimeFormat(pattern = "yyyy-MM-dd"):这是一个注释,用于指定日期类型属性的格式化规则。在这个例子中,如果取消注释并指定了合适的格式化规则,可以对brith属性的日期进行格式验证。

  6. @NotEmpty(message = "{user.email.notEmpty}"):该注解用于验证字符串属性值是否非空。如果email属性为空字符串,则会产生一个指定消息的验证错误。

  7. @Email(message = "{user.email.legal}"):该注解用于验证字符串属性值是否符合Email的格式要求。如果email属性不是合法的Email格式,则会产生一个指定消息的验证错误。

通过在User类的属性上添加这些注解,可以对属性值进行验证,确保满足特定的条件和格式要求。当验证失败时,会生成相应的错误消息供使用者查看和处理。

6、新建一个 ResultVO
@Data
public class ResultVO<T> {

    // 响应状态码,默认 200
    private Integer code = HttpStatus.OK.value();
    private String message;
    private T data;

}

泛型类ResultVO,用于封装接口的响应结果。下面是每个属性的作用:

  1. private Integer code = HttpStatus.OK.value():该属性表示响应的状态码,默认为200,表示成功。HttpStatus.OK.value()是Spring提供的常量,表示HTTP状态码200。

  2. private String message:该属性表示响应的消息,用于描述响应的详细信息。根据具体的业务需求,可以设置不同的消息内容。

  3. private T data:该属性表示响应的数据,是一个泛型类型,可以根据实际情况指定具体的数据类型。根据接口的需求,可以将查询结果、返回对象等放在这个属性中。

通过定义这个ResultVO类,可以将接口的响应结果统一封装并返回给前端。它包含了响应的状态码、消息和数据,可以方便地进行操作和处理。在实际使用中,可以根据业务需要对ResultVO类进行扩展,添加更多的属性和方法。

二、使用 @Valid 验证

1、编写 controller 控制器

@RestController
public class UserController {

    /**
     * 注册日期格式化器
     * @param binder
     */
    @InitBinder
    public void regFormatter (WebDataBinder binder){
        binder.addCustomFormatter(new DateFormatter("yyyy-MM-dd"));
    }

    /**
     * @Valid 注解:标注的参数实体要参与 Bean 验证
     * 通常放在实体上
     *
     * @param user
     * @param result 这个结果集存放了验证信息,如果这个校验未通过
     *               就从这个结果集中获取验证消息
     * @return
     */
    @PostMapping("/add")
    public ResultVO add(@Valid User user, BindingResult result) throws JsonProcessingException {

        ResultVO vo = new ResultVO();
        // 先验证是否校验通过,如果存在错误消息则表示未通过
        if ( result.hasErrors() ){
            // 创建一个 map 来保存这些错误信息
            Map<String,String> error = new HashMap<>();
            // 循环遍历所有的错误信息
            result.getFieldErrors().forEach(fieldError -> {
                // 以字段名作为 key ,错误信息作为 value 保存到 map 中
                error.put(fieldError.getField(), fieldError.getDefaultMessage());
            });
            // 设置响应状态码
            vo.setCode(HttpStatus.INTERNAL_SERVER_ERROR.value());
            // 将 map 序列化成 JSON 字符串
            String messages = new ObjectMapper().writeValueAsString(error);
            vo.setMessage(messages);

            // 直接将 errors 保存到 data 中
//            vo.setData(Keymap);
            return vo;
        }

        return vo;
    }

}

UserController类,用于处理用户相关的请求。下面是每个方法的作用:

  1. regFormatter方法:该方法使用@InitBinder注解,用于注册日期格式化器。在这个例子中,通过调用binder.addCustomFormatter(new DateFormatter("yyyy-MM-dd"))方法,将日期格式化器注册到WebDataBinder中,指定日期的格式为"yyyy-MM-dd"。

  2. add方法:该方法使用@PostMapping("/add")注解,用于处理添加用户的请求。在这个例子中,通过@Valid注解标注了User参数,表示要对User对象进行Bean验证。同时,该方法还接受一个BindingResult参数,用于存放验证结果的信息。

    • 首先,通过创建一个ResultVO对象vo来存放响应结果。
    • 然后,通过result.hasErrors()判断是否存在验证错误消息。如果存在错误,则进行错误处理。
    • 在错误处理中,创建一个Map<String, String>对象error来保存错误信息,循环遍历所有的错误信息,并将字段名作为键,错误信息作为值,保存到error中。
    • 设置响应状态码为500(HttpStatus.INTERNAL_SERVER_ERROR.value()),并将error对象序列化为JSON字符串,赋给vomessage属性。
    • 如果需要,可以将error对象直接保存到vodata属性中。
    • 最后,返回vo对象作为响应结果。

通过定义这个UserController类,并使用注解进行日期格式化注册和Bean验证,可以处理用户添加请求,并根据验证结果返回相应的响应结果。在实际使用中,可以根据业务需求对方法进行扩展和优化。

2、配置 dispatcher-servlet.xml 
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">


    <!-- 扫描 -->
    <context:component-scan base-package="edu.nf.ch07"/>
    <!-- mvc 注解驱动 注意:需要重新引用验证器的 id  -->
    <mvc:annotation-driven validator="validator"/>
    <!-- 默认 servlet 处理静态资源 -->
    <mvc:default-servlet-handler/>
    <!-- 内部资源视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>


    <!-- 配置资源消息 -->
    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <!-- 配置资源文件的路径 -->
        <property name="basenames">
            <list>
                <!-- 指定资源文件的位置,注意,不需要写文件后缀 -->
                <value>classpath:message</value>
            </list>
        </property>
        <!-- 指定编码格式 -->
        <property name="defaultEncoding" value="utf-8"/>
    </bean>

    <!-- 配置校验器 -->
    <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
        <!-- 设置校验器的提供方 -->
        <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
        <!-- 引用资源文件 -->
        <property name="validationMessageSource" ref="messageSource"/>
    </bean>

</beans>

每个属性的作用:

  1. <context:component-scan base-package="edu.nf.ch07"/>:该配置用于告诉Spring扫描指定包下的类,以便自动注册为Spring的组件(如控制器、服务等)。

  2. <mvc:annotation-driven validator="validator"/>:该配置启用Spring MVC对注解驱动的支持,其中validator属性指定用于处理验证的验证器Bean的ID。它会自动将验证错误与错误消息关联起来。

  3. <mvc:default-servlet-handler/>:该配置用于将静态资源的请求交给默认的Servlet处理,而不是通过DispatcherServlet处理。这样可以让静态资源(如CSS、JavaScript等)能够直接访问。

  4. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">:这是一个内部资源视图解析器的配置,用于解析并返回JSP视图的路径。prefix属性指定JSP文件所在的目录,suffix属性指定JSP文件的后缀名。

  5. <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">:该配置用于配置资源消息,即国际化文本消息的配置。basenames属性指定资源文件的位置,defaultEncoding属性指定资源文件的编码格式。

  6. <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">:这是一个校验器的配置,用于对验证框架进行配置。providerClass属性指定所使用的验证器的提供者,validationMessageSource属性引用了前面配置的消息资源。

 3、新建一个 reg.html 页面提交数据
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户注册</title>
    <script src="js/JQuery文件.txt.js"></script>
</head>
<body>
<!-- 这个 div 用于显示验证的消息 -->
<div id="msg"></div>

<form id="f1">
    Name:<input type="text" name="userName"><br>
    Age:<input type="text" name="age"><br>
    Birth:<input type="text" name="birth"><br>
    Email:<input type="text" name="email"><br>
    <input type="button" value="注册"><br>
</form>


<script>
    $(function () {
        $(':button').on('click',function () {
            $.ajax({
                url:'../add',
                type:'post',
                data:$('#f1').serialize(),
                success:function ( result ) {
                    if ( result.code === 500 ){
                        $('#msg').empty();
                        let errors = result.message;
                        // 将 json 字符串转换为 json 对象
                        errors = $.parseJSON(errors);
                        // 循环遍历错误消息放到 div 中
                        $.each(errors,function (key,val) {
                            $('#msg').append(val + '<br>')
                        })
                    } else{
                        $('#msg').empty();
                    }
                }
            })
        })
    })
</script>

</body>
</html>

这段代码是一个简单的前端页面,用于用户注册。它使用了jQuery库来处理表单提交和异步请求。

在页面中,有一个<form>标签,包含了用户需要填写的字段,如姓名、年龄、出生日期和电子邮件等。其中,每个字段都使用了<input>标签,并通过name属性指定了字段名。

在页面底部的JavaScript代码中,使用了jQuery的$(function(){})方法,确保文档加载完成后执行相应代码。首先,通过$(':button')选择器选中所有<input type="button">元素,并绑定了一个点击事件处理函数。当按钮被点击时,触发了一个AJAX请求。

AJAX请求使用了$.ajax()方法,其中传入了请求的URL、请求类型和数据等参数。请求的URL为../add,表示将请求发送到服务器上的/add路径。请求类型为POST,即使用HTTP POST方法发送请求。数据使用$('#f1').serialize()方法对表单进行序列化,将表单中的输入值转换为URL编码的字符串。

当请求成功返回时,会执行success回调函数。在回调函数中,首先判断响应的result对象中的code属性是否为500(表示服务器内部错误)。如果是500,则说明存在验证错误消息。然后,通过$('#msg')选中页面中的<div>元素,并清空其内容。接下来,将响应的message属性(包含错误信息的JSON字符串)转换为JSON对象,并使用$.each()方法遍历错误信息,将每条错误信息添加到<div>元素中显示出来。

总体而言,这段代码实现了一个简单的用户注册页面,并使用AJAX请求将表单数据发送到服务器进行处理。在服务器端,通过验证结果返回不同的响应。在前端页面中,通过jQuery来处理和显示服务器返回的验证错误信息。

4、运行效果

我们测试的结果,刚开始什么都不写的时候都提示了为空,当一个一个输进去后,就没有了提示,不满足条件的也会提示。 

 三、使用 Springmvc 表单验证的好处

Spring MVC的表单验证功能具有以下几个好处:

  1. 提高数据的有效性和完整性:通过表单验证,可以确保用户提交的数据符合预期的格式、长度、范围等要求。这可以避免因为不合法的数据导致程序出错或产生意外结果。有效的表单验证可以提高数据的质量和可靠性。

  2. 减少后端开发工作量:使用Spring MVC的表单验证,可以在后端自动执行验证逻辑,而无需手动编写大量的验证代码。框架会根据注解配置或自定义验证规则,自动完成验证过程。这样可以极大地减少开发人员的工作量,并提高开发效率。

  3. 支持代码重用和模块化:通过使用Spring MVC的表单验证,可以将验证逻辑从业务逻辑中分离出来,形成独立的验证模块。这样可以提高代码的重用性和可维护性,减少重复代码的编写。同时,验证模块可以针对不同的实体对象进行复用,进一步提高开发效率。

  4. 提供友好的用户反馈:通过表单验证,可以及时地向用户提供错误信息或者警告信息,帮助用户发现并纠正输入错误。这可以提升用户体验,让用户更加轻松地填写正确的数据。同时,通过在前端页面显示验证错误信息,可以帮助开发人员快速定位并修复问题。

  5. 防止安全漏洞和数据损坏:表单验证还可以用于防范安全漏洞,例如输入校验、XSS(跨站脚本攻击)预防等。通过限制输入的数据格式和内容,可以有效地防止恶意用户提交恶意代码或其他危险数据,提高应用程序的安全性。

总之,Spring MVC的表单验证功能在提高数据质量、减少开发工作量、提供友好用户反馈、增强应用程序安全性等方面具有重要的好处。它是开发Web应用程序时不可或缺的一部分,能够提升开发效率和用户体验。

四、gitee 案例

地址:CH07 · qiuqiu/SpringMVC - 码云 - 开源中国 (gitee.com)

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

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

相关文章

Gerrit 事件监听实现

环境 Centos 7.9 Gerrit 2.15 Gerrit 2.15容器搭建 docker-compose.yml version: 3 services:gerrit:image: gerritcodereview/gerrit:2.15ports:- 8080:8080- 29418:29418volumes:- ./review_site:/var/gerrit/review_siteenvironment:- CANONICAL_WEB_URLhttp://localhos…

.jnlp

首先配置电脑的java环境。 百度搜索jre下载&#xff0c;会有很多结果&#xff0c;一般选择官网进行下载。 下载正确的jre版本。 我的电脑是windows 64位&#xff0c;根据你自己电脑的情况选择版本进行下载。不懂自己电脑是多少位的可以看下一步。 查看电脑是64位还是32…

并行和并发有什么区别?

并行和并发 并行和并发最早其实描述的是 Java 并发编程里面的概念。他们强调的是 CPU 处理任务的能力。简单来说&#xff1a; 并发&#xff0c;就是同一个时刻&#xff0c;CPU 能够处理的任务数量&#xff0c;并且对于应用程序来说&#xff0c;不会出现卡顿现象。并行&#x…

如何改善设备综合效率(OEE)并提高工厂的生产力

在现代制造业中&#xff0c;提高设备综合效率&#xff08;Overall Equipment Efficiency&#xff0c;OEE&#xff09;是企业追求高效生产和优化生产能力的重要目标之一。OEE是一个关键的绩效指标&#xff0c;可以帮助企业评估设备的利用效率、生产效率和质量水平。本文将从三个…

ERROR: There can be only one Game target per project.

UATHelper: Packaging (Windows (64-bit)): ERROR: There can be only one Game target per project. D:\dock\Intermediate\Source 把旧的文件删去 一般会出现在更改项目名称后 感谢 There can be only one Game target per project - Development Discussion / Content C…

YOLOv8修改特征金字塔(替换SPPF模块)

1.引言 1.1 引言 修改特征金字塔模块&#xff0c;即SPPF模块是YOLOv8改进中非常常见的一个改进点。 以下将介绍如何在yolov8中修改SPPF模型。 2.2 常见特征金字塔模块 常见特征金字塔可以看此贴&#xff1a;常见特征金字塔模块代码实现 1.3 本文示例 本文使用SimSPPF模块…

JAVA 学习笔记——抽象类

概念&#xff1a; 当定义一个类时&#xff0c;常常需要定义一些成员方法来描述类的行为特征&#xff0c;但有时这些方法的实现方式是无法确定的。 例如&#xff0c;前面在定义 Animal 类时&#xff0c;walk()方法用于描述动物的行走行为&#xff0c;但是针对不同的动物&#…

用友 GRP-U8 存在sql注入漏洞复现

0x01 漏洞介绍 用友 GRP-U8 license_check.jsp 存在sql注入&#xff0c;攻击者可利用该漏洞执行任意SQL语句&#xff0c;如查询数据、下载数据、写入webshell、执行系统命令以及绕过登录限制等。 fofa&#xff1a;app”用友-GRP-U8” 0x02 POC: /u8qx/license_check.jsp?kj…

Leetcode—2562.找出数组的串联值【简单】

2023每日刷题&#xff08;十四&#xff09; Leetcode—2562.找出数组的串联值 实现代码 long long findTheArrayConcVal(int* nums, int numsSize){int left 0;int right numsSize - 1;long long sum 0;while(left < right) {if(left right) {sum nums[left];break;}…

Linux启动之uboot分析

Linux启动之uboot分析 uboot是什么&#xff1f;一、补充存储器概念1.存储器种类1.norflash - 是非易失性存储器&#xff08;也就是掉电保存&#xff09;2.nandflash - 是非易失性存储器&#xff08;也就是掉电保存&#xff09;3.SRAM - 静态随机访问存储器 - Static Random Acc…

Matlab | 基于二次谱提取地震数据的地震子波

本文通过地震数据二次谱求取地震子波谱&#xff0c;具体方法如下&#xff1a; MATLAB代码实现如下&#xff1a; function w SndSpecExtWavelet(x, M) % 功能&#xff1a;基于二次谱提取输入地震数据data的地震子波wavelet % Extracting Wavelet from Input Seismic Dat…

高等数学啃书汇总重难点(八)向量代数与空间解析几何

持续更新&#xff0c;高数下第一章&#xff0c;整体来说比较简单&#xff0c;但是需要牢记公式&#xff0c;切莫掉以轻心~ 一.向量平行的充要条件 二.向量坐标的线性运算 三.向量的几何性质 四.数量积 五.向量积 六.混合积 七.曲面方程 八.空间曲线方程 九.平面的点法式方程 十…

阿里云的OSS云存储的基本使用

阿里云官网&#xff1a;阿里云-计算&#xff0c;为了无法计算的价值 通过阿里云官网&#xff0c;登录进入用户的界面&#xff0c;在搜索框中输入OSS&#xff0c;然后进入阿里云的对象存储OSS的控制台。&#xff08;未开通的开通即可&#xff09; 创建 Bucket 点击【Bucket 列…

sql在线练习

SQLBolt - 学习 SQL - SQL 简介https://sqlbolt.com/拿走不谢&#xff01;&#xff01;&#xff01; UIUC什么乱七八糟的啊

[UDS] --- RoutineCommunicationControl 0x31

1 0x31功能描述 client端使用RoutineControl服务执行定义的步骤序列并获取任何相关结果。该服务具有很大的灵活性&#xff0c;典型的用法包括擦除内存&#xff0c;复位或学习自适应数据&#xff0c;运行自检&#xff0c;覆盖正常服务器控制策略以及控制服务器值随时间变化等功…

jmeter和postman你选哪个做接口测试?

软件测试行业做功能测试和接口测试的人相对比较多。在测试工作中&#xff0c;有高手&#xff0c;自然也会有小白&#xff0c;但有一点我们无法否认&#xff0c;就是每一个高手都是从小白开始的&#xff0c;所以今天我们就来谈谈一大部分人在做的接口测试&#xff0c;小白变高手…

LabVIEW背景颜色设为和其他程序或图像中一样

LabVIEW背景颜色设为和其他程序或图像中一样 有时候LabVIEW背景色要和其他程序或者图片的颜色保持一致&#xff0c;如果要求不高可以大致设置一下。如果要求较高&#xff0c;那可以按照如下的方式。 先用PS打开标准图像&#xff0c;之后用吸管工具选择图像上中的点&#xff0…

深度学习(生成式模型)——DDIM:Denoising Diffusion Implicit Models

文章目录 前言为什么DDPM的反向过程与前向过程步数绑定DDIM如何减少DDPM反向过程步数DDIM的优化目标DDIM的训练与测试 前言 上一篇博文介绍了DDIM的前身DDPM。DDPM的反向过程与前向过程步数一一对应&#xff0c;例如前向过程有1000步&#xff0c;那么反向过程也需要有1000步&a…

MySQL(3):基本的 SELECT 语句

SQL 语言 SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;是使用关系模型的数据库应用语言&#xff0c; 与数据直接打交道 。 SQL 有两个重要的标准&#xff0c;分别是 SQL92 和 SQL99&#xff0c;它们分别代表了 92 年和 99 年颁布的 SQL 标…

7 款用于解锁iPhone密码的苹果解锁软件

无法访问您的 iPhone 一定是最烦人的情况之一。 即使您以前从未遇到过这种情况&#xff0c;做好准备总是一个好主意&#xff0c;而不是在它发生时感到无助。事实上&#xff0c;这种情况经常发生并且可能有很多实例&#xff0c;例如忘记密码或购买锁定的二手 iPhone。 牢记 Ap…