• SpringMVC入门案例和@RequestMapping注解


    一:SpringMVC简介

    1.什么是MVC

    MVC是一种软件架构的思想,将软件按照模型、视图、控制器来划分
    M:Model,模型层,指工程中的JavaBean,作用是处理数据
    JavaBean分为两类:
    一类称为实体类Bean:专门存储业务数据的,如 Student、User 等
    一类称为业务处理 Bean:指 Service 或 Dao 对象,专门用于处理业务逻辑和数据访问。

    V:View,视图层,指工程中的html或jsp等页面,作用是与用户进行交互,展示数据
    C:Controller,控制层,指工程中的servlet,作用是接受数据和响应浏览器数据

    MVC的工作流程: 用户通过视图层发送请求到服务器,在服务器中请求被Controller接收,Controller调用相应的Model层处理请求,处理完毕将结果返回到Controller,Controller再根据请求处理的结果找到相应的View视图,渲染数据后最终响应给浏览器

    2.什么是SpringMVC

    SpringMVC是Spring的一个后续产品,是Spring的一个子项目
    SpringMVC 是 Spring 为表述层开发提供的一整套完备的解决方案。在表述层框架历经 Strust、WebWork、Strust2 等诸多产品的历代更迭之后,目前业界普遍选择了SpringMVC 作为 Java EE 项目表述层开发的首选方案

    注:三层架构分为表述层(或表示层)、业务逻辑层、数据访问层,表述层表示前台页面和后台servlet

    3.SpringMVC的特点

    Spring 家族原生产品,与 IOC 容器等基础设施无缝对接
    基于原生的Servlet,通过了功能强大的前端控制器DispatcherServlet,对请求和响应进行统一处理
    表述层各细分领域需要解决的问题全方位覆盖,提供全面解决方案
    代码清新简洁,大幅度提升开发效率
    内部组件化程度高,可插拔式组件即插即用,想要什么功能配置相应组件即可
    性能卓著,尤其适合现代大型、超大型互联网项目要求

    二:入门案例

    1.首先使用创建工程Maven

    项目目录如下:
    在这里插入图片描述

    2.配置pom.xml文件

    
    <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/maven-v4_0_0.xsd">
    
      <modelVersion>4.0.0modelVersion>
      
      <packaging>warpackaging>
    
      <name>spring-mvc-helloworldname>
      <groupId>com.xingroupId>
      <artifactId>spring-mvc-helloworldartifactId>
      <version>1.0-SNAPSHOTversion>
    
      
      <dependencies>
        
        <dependency>
          <groupId>org.springframeworkgroupId>
          <artifactId>spring-webmvcartifactId>
          <version>5.3.1version> dependency>
        
        <dependency>
          <groupId>ch.qos.logbackgroupId>
          <artifactId>logback-classicartifactId>
          <version>1.2.3version> dependency>
        
        <dependency>
          <groupId>javax.servletgroupId>
          <artifactId>javax.servlet-apiartifactId>
          <version>3.1.0version>
          <scope>providedscope>
        dependency>
        
        <dependency>
          <groupId>org.thymeleafgroupId>
          <artifactId>thymeleaf-spring5artifactId>
          <version>3.0.12.RELEASEversion>
        dependency>
      dependencies>
    project>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    注:由于 Maven 的传递性,我们不必将所有需要的包全部配置依赖,而是配置最顶端的依赖,其他靠
    传递性导入。
    在这里插入图片描述

    3.配置web.xml文件

    
    <web-app version="2.4"
             xmlns="http://java.sun.com/xml/ns/j2ee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    
      
      <servlet>
        <servlet-name>SpringMvcservlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
      servlet>
      <servlet-mapping>
        <servlet-name>SpringMvcservlet-name>
        <url-pattern>/url-pattern>
      servlet-mapping>
    web-app>
            
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    补充:

    url-pattern中/和/*的区别:
    /:匹配浏览器向服务器发送的所有请求(不包括.jsp)
    / *:匹配浏览器向服务器发送的所有请求(包括.jsp)
    jsp的本质是servlet,DispatcherServlet(前端控制器)不能处理.jsp,因为在Tomcat的web.xml文件中已经配置了
    一个servlet,是专门用来处理.jsp请求的,在Tomcat->conf->web.xml文件中,有如下配置:
    在这里插入图片描述
    在这里插入图片描述
    所以< url-pattern>/< /url-pattern>的路径要设置为“/”

      定义Servlet的名称,一般跟Servlet类名有关,该名称在整个应用中必须是唯一的
      指向我们要注册的Servlet 的类地址, 要带包路径
       是用来配置我们注册的组件的访问路径,里面包括两个节点,
      
      1).:要与前面元素中声明的名字一致。
      2).:指定相对于Servlet的URL的路径。该路径相对于web应用程序上下文的根路径。
      将URL模式映射到某个Servlet,即该Servlet处理的URL。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    4.创建请求控制器

    由于前端控制器对浏览器发送的请求进行了统一的处理,但是具体的请求有不同的处理过程,因此需要创建处理具体请求的类,即请求控制器
    请求控制器中每一个处理请求的方法成为控制器方法
    因为SpringMVC的控制器由一个POJO(普通的Java类)担任,因此需要通过@Controller注解将其标识为一个控制层组件,交给Spring的IoC容器管理,此时SpringMVC才能够识别控制器的存在

    package com.xin.controller;
    
    @Controller
    public class HelloController {
        
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    5.配置SpringMvc的配置文件

    注:SpringMvc的配置文件默认的位置和名称:
    位置:WEB-INF下
    名称:< servlet-name>-servlet.xml,当前配置下的配置文件名为SpringMvc-servlet.xml

    这个配置文件是自动加载的,在DispatcherServlet初始化的时候,就会加载SpringMvc-servlet.xml,这个过程是自动完成的,加载SpringMvc-servlet.xml的代码在DispatcherServlet已经写好了,因此SpringMvc的配置文件是一个固定的名字和固定的位置。

    SpringMvc-servlet.xml:

    
    <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"
           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">
    
        
        <context:component-scan base-package="com.xin.controller">context:component-scan>
        
        <bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
            <property name="order" value="1"/>
            <property name="characterEncoding" value="UTF-8"/>
            <property name="templateEngine">
                <bean class="org.thymeleaf.spring5.SpringTemplateEngine">
                    <property name="templateResolver">
                        <bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
                            
                            <property name="prefix" value="/WEB-INF/templates/"/>
                            
                            <property name="suffix" value=".html"/>
                            <property name="templateMode" value="HTML5"/>
                            <property name="characterEncoding" value="UTF-8" />
                        bean>
                    property>
                bean>
            property>
        bean>
    beans>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    6.测试HelloWorld

    1.实现对首页的访问
    在请求控制器中创建处理请求的方法

    // @RequestMapping注解:处理请求和控制器方法之间的映射关系 
    // @RequestMapping注解的value属性可以通过请求地址匹配请求,/表示的当前工程的上下文路径 
    // localhost:8080/springMVC/ 
    @RequestMapping("/") 
    public String HelloController() 
    { 
    	//设置视图名称 
    	return "index"; 
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    当控制器方法中,仅仅用来实现页面跳转,即只需要设置视图名称时,可以将处理器方法使用view-controller标签进行表示

    
        <mvc:view-controller path="/" view-name="index">mvc:view-controller>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    若设置视图控制器,则只有视图控制器所设置的请求会被处理,其他的请求将全部报404
    此时必须设置一个标签:

        <mvc:annotation-driven/>
    
    
    • 1
    • 2

    2.通过超链接跳转到指定页面

    在主页index.html中设置超链接

    DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>首页title>
    head>
    <body>
    <h1>index.htmlh1>
    <a th:href="@{/hello}">测试SpringMVCa>
    <a href="/hello">测试绝对路径a>
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    < a th:href=“@{/hello}”>测试SpringMVC< /a> 得到的路径是:http://localhost:8080/SpringMvc/hello
    < a href=“/hello”>测试绝对路径< /a>得到的路径是:http://localhost:8080/hello
    浏览器会将“@{/}”解析为:http://localhost:8080/上下文路径,既http://localhost:8080/SpringMvc/
    将“/”解析为:http://localhost:8080/

    在请求控制器中创建处理请求的方法:

    package com.xin.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @Controller
    public class HelloController {
        @RequestMapping("/")
        //  "/":被服务器解析为http://localhost:8080/SpringMvc/
        public String protal() {
            return "index";
        }
        @RequestMapping(value = "/hello")
        public String hello() {
            return "success";
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    7.总结(运行原理):

    浏览器发送请求,若请求地址符合前端控制器的url-pattern,该请求就会被前端控制DispatcherServlet处理。前端控制器会读取SpringMVC的核心配置文件,通过扫描组件找到控制器,将请求地址和控制器中@RequestMapping注解的value属性值进行匹配,若匹配成功,该注解所标识的控制器方法就是处理请求的方法。处理请求的方法需要返回一个字符串类型的视图名称,该视图名称会被视图解析器解析,加上前缀和后缀组成视图的路径,通过Thymeleaf对视图进行渲染,最终转发到视图所对应页面

    扩展:
    1.如果不想要把SpringMvc-servlet.xml文件放在WEB-INF路径下,则可以使用初始化参数来设置
    位置在resources目录下
    在这里插入图片描述

    
        <init-param>
          
          <param-name>contextConfigLocationparam-name>
          <param-value>classpath:springmvc.xmlparam-value>
        init-param>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    2.由于DispatcherServlet在初始化的过程中执行的操作是非常非常多的,要花费很长时间,因此最好不要让DispatcherServlet在第一次访问的时候进行初始化,可以使用< load-on-startup>标签

    
        <load-on-startup>1load-on-startup>
    
    • 1
    • 2

    springmvc.xml文件

    
    <web-app version="2.4"
             xmlns="http://java.sun.com/xml/ns/j2ee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    
      
      <servlet>
        <servlet-name>SpringMvcservlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
        
        <init-param>
          
          <param-name>contextConfigLocationparam-name>
          <param-value>classpath:springmvc.xmlparam-value>
        init-param>
        
        <load-on-startup>1load-on-startup>
      servlet>
      <servlet-mapping>
        <servlet-name>SpringMvcservlet-name>
        <url-pattern>/url-pattern>
      servlet-mapping>
    web-app>
            
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    三:@RequestMapping注解

    1.@RequestMapping注解的功能

    从注解名称上我们可以看到,@RequestMapping注解的作用就是将请求与处理请求的控制器方法关联起来,建立映射关系

    2.@RequestMapping注解的位置

    @RequestMapping标识一个类:设置映射请求的请求路径的初始信息
    @RequestMapping标识一个方法:设置映射请求的请求路径的具体信息

    HelloController.java

    package com.xin.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @Controller
    public class HelloController {
        @RequestMapping("/")
        public String protal() {
            return "index";
        }
        @RequestMapping(value = "/hello")
        public String hello() {
            return "success";
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    新建TestRequestMappingController.java

    package com.xin.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @Controller
    public class TestRequestMappingController {
        @RequestMapping("/hello")
        public String hello() {
            return "sucess";
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    运行程序会发生错误,是因为此时HelloController.java中已经映射了该请求路径"/hello",不能在TestRequestMappingController.java中再进行映射
    在这里插入图片描述
    解决办法:将@RequestMapping标识一个类,此时控制器方法所匹配的请求的请求路径就会发生改变
    修改TestRequestMappingController.java

    package com.xin.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @Controller
    @RequestMapping("/test")
    public class TestRequestMappingController {
        //此时控制方法所匹配的请求的请求路径为:/test/hello,既//localhost:8080/SpringMvc/test/hello
        @RequestMapping("/hello")
        public String hello1() {
            return "success";
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    3.@RequestMapping注解的value属性

    @RequestMapping注解的value属性通过请求的请求地址匹配请求映射,即浏览器发送的请求的请求地址必须满足value属性 的设置
    @RequestMapping注解的value属性是一个字符串类型的数组,表示该请求映射能够匹配多个请求地址所对应的请求
    @RequestMapping注解的value属性必须设置,至少通过请求地址匹配请求映射

    @Controller
    @RequestMapping(value = {"/test","/testRequest"})
    public class TestRequestMappingController {
        //此时控制方法所匹配的请求的请求路径为:/test/hello,既//localhost:8080/SpringMvc/test/hello
        @RequestMapping("/hello")
        public String hello1() {
            return "success";
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    4.@RequestMapping注解的method属性

    @RequestMapping注解的method属性通过请求的请求方式(get或post)匹配请求映射,即浏览器发送的请求的请求方式必须满足method属性的设置
    @RequestMapping注解的method属性是一个RequestMethod类型的数组,表示该请求映射能够匹配多种请求方式的请求
    若当前请求的请求地址满足请求映射的value属性,但是请求方式不满足method属性,则浏览器报错405:Request method ‘POST’ not supported
    先将HelloController.java中的@RequestMapping(value = “/hello”)注释,避免出现冲突

    @Controller
    public class HelloController {
        @RequestMapping("/")
        public String protal() {
            return "index";
        }
    //    @RequestMapping(value = "/hello")
    //    public String hello() {
    //        return "success";
    //    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    @Controller
    //@RequestMapping(value = {"/test","/testRequest"})
    public class TestRequestMappingController {
        @RequestMapping(
                value ={"/hello","/testRequest"},
                method = {RequestMethod.GET,RequestMethod.POST}
        )
        public String hello1() {
            return "success";
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    注: 1、对于处理指定请求方式的控制器方法,SpringMVC中提供了@RequestMapping的派生注解
    处理get请求的映射–>@GetMapping 处理post请求的映射–>@PostMapping
    处理put请求的映射–>@PutMapping 处理delete请求的映射–>@DeleteMapping
    2、常用的请求方式有get,post,put,delete
    但是目前浏览器只支持get和post,若在form表单提交时,为method设置了其他请求方式的字符
    串(put或delete),则按照默认的请求方式get处理
    若要发送put和delete请求,则需要通过spring提供的过滤器HiddenHttpMethodFilter,在
    RESTful部分会讲到

    5.@RequestMapping注解的params属性(了解)

    @RequestMapping注解的params属性通过请求的请求参数匹配请求映射,即浏览器发送的请求的请求参数必须满足params属性 的设置
    @RequestMapping注解的params属性是一个字符串类型的数组,可以通过四种表达式设置请求参数和请求映射的匹配关系
    “param”:要求请求映射所匹配的请求必须携带param请求参数
    “!param”:要求请求映射所匹配的请求一定不能携带param请求参数
    “param=value”:要求请求映射所匹配的请求必须携带param请求参数且值必须为value
    “param!=value”:要求请求映射所匹配的请求可以不携带param请求参数,若携带值一定不能是value

    index.html

    DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>首页title>
    head>
    <body>
    <h1>index.htmlh1>
    <a th:href="@{/hello}">测试SpringMVCa><br/>
    <a href="/hello">测试绝对路径a><br/>
    <form th:action="@{/hello}" method="post">
        <input type="submit" value="测试@RequestMapping注解的method属性">
    form>
    <a th:href="@{/hello?username='admin'}">测试测试@RequestMapping注解的params属性a><br/>
    <a th:href="@{/hello(username='admin')}">测试测试@RequestMapping注解的params属性a><br/>
    
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    @{/hello?username=‘admin’}和@{/hello(username=‘admin’)}作用是一样的,但通常采用第二种写法。

    @Controller
    //@RequestMapping(value = {"/test","/testRequest"})
    public class TestRequestMappingController {
        //此时控制方法所匹配的请求的请求路径为:/test/hello,既//localhost:8080/SpringMvc/test/hello
        @RequestMapping(
                value ={"/hello","/testRequest"},
                method = {RequestMethod.GET,RequestMethod.POST},
                params = {"username","!password","age=20","sex!=女"}
        )
        public String hello1() {
            return "success";
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    可以在地址栏上手动添加参数信息
    在这里插入图片描述

    在这里插入图片描述

    注:
    若当前请求满足@RequestMapping注解的value和method属性,但是不满足params属性,此时页面回报错400:Parameter
    conditions “username, password!=123456” not met for actual request
    parameters: username={admin}, password={123456}
    在这里插入图片描述

    6.@RequestMapping注解的headers属性(了解)

    @RequestMapping注解的headers属性通过请求的请求头信息匹配请求映射,即浏览器发送的请求的请求头信息必须满足headers属性的设置
    @RequestMapping注解的headers属性是一个字符串类型的数组,可以通过四种表达式设置请求头信
    息和请求映射的匹配关系
    “header”:要求请求映射所匹配的请求必须携带header请求头信息
    “!header”:要求请求映射所匹配的请求必须不能携带header请求头信息
    “header=value”:要求请求映射所匹配的请求必须携带header请求头信息且header=value
    “header!=value”:要求请求映射所匹配的请求必须携带header请求头信息且header!=value

    若当前请求满足@RequestMapping注解的value和method属性,但是不满足headers属性,此时页面显示404错误,即资源未找到

    7.SpringMVC支持ant风格的路径

    ?:表示任意的单个字符(不包括?),因为在地址栏上,?表示分隔符,?前面的是请求路 径 ,?后面的是参数
    *:表示任意的0个或多个字符(不包括?和/)
    http://localhost:8080/SpringMvc/aa/test/ant,在地址/aa/中可以加任意个字符
    ( * *):表示任意层数的任意目录
    注意:在使用 * *时,只能使用/**/xxx的方式

    @Controller
    public class TestAnt {
    //    @RequestMapping("/a?a/test/ant")
    //    @RequestMapping("/a*a/test/ant")
        @RequestMapping("/**/test/ant")
        public String testAnt() {
            return "success";
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    <a th:href="@{/aaa/test/ant}">测试SpringMVC支持ant风格的路径a><br/>
    
    • 1

    8.SpringMVC支持路径中的占位符(重点)

    原始方式:/deleteUser?id=1
    rest方式:/user/delete/1

    SpringMVC路径中的占位符常用于RESTful风格中,当请求路径中将某些数据通过路径的方式传输到服务器中,就可以在相应的@RequestMapping注解的value属性中通过占位符{xxx}表示传输的数据,在通过@PathVariable注解,将占位符所表示的数据赋值给控制器方法的形参

    <a th:href="@{/testRest/1/admin}">测试路径中的占位符a><br/>
    
    
    • 1
    • 2
    @RequestMapping("/testRest/{id}/{username}")
        public String test(@PathVariable("id")Integer id,@PathVariable("username") String username) {
            System.out.println("id:"+id+",username:"+username);
            return "success";
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在控制台上输出:
    在这里插入图片描述

  • 相关阅读:
    福布斯:Salesforce和ZohoCRM,哪个更适合你?
    音视频开发成长之路与音视频知识点总结
    JSP page指令
    软件工程:帕金森定律,项目工期的那点事儿
    Verilog 基础知识
    C++11多线程第三篇:线程传参详解,detach()大坑,成员函数做线程参数
    MySQL数据库,从入门到精通:第三篇——MySQL 数据库规范和基础查询语句
    做好制造项目管理的5个技巧
    基于SpringBoot的SSMP整合案例(消息一致性处理与表现层开发)
    C语言模拟类的宏
  • 原文地址:https://blog.csdn.net/m0_56336875/article/details/126053384