当前位置: 首页 > news >正文

第6章 初识Spring框架

目录/Contents

  • 第6章 初识Spring框架
    • 学习目标
      • 了解Spring框架及其优点
      • 了解Spring框架的体系结构与Spring 5的新特性
      • 熟悉Spring框架的下载及目录结构
      • 掌握Spring框架入门程序的编写
      • 理解控制反转的概念
      • 掌握依赖注入的概念、类型和应用
    • 学习内容
      • 1 Spring介绍
        • 1.1 Spring概述
          • 1.1.1 String框架的核心技术
          • 1.1.2 String在表现层、业务逻辑层和持久层的作用
        • 1.2 Spring框架的优点
          • 1.2.1 String框架的作用
          • 1.2.2 String框架的优点:a.非侵入式设计
          • 1.2.3 String框架的优点:b.降低耦合性
          • 1.2.4 String框架的优点:c.支持AOP编程
          • 1.2.5 String框架的优点:d.支持声明式事务
          • 1.2.6 String框架的优点:e.方便程序的测试
          • 1.2.7 String框架的优点:f.方便集成框架
          • 1.2.8 String框架的优点:g.降低Java EE API的使用难度
        • 1.3 Spring的体系结构
          • 1.3.1 Spring 5框架组成模块
          • 1.3.2 a.核心容器模块(Core Container)
          • 1.3.3 核心容器模块各模块组成
          • 1.3.4 b.数据访问及集成模块(Data Access/Integration)
          • 1.3.5 数据访问及集成模块各模块组成
          • 1.3.6 c.Web模块
          • 1.3.7 Web模块各模块组成
          • 1.3.8 d.其他模块
          • 1.3.9 其他模块各模块组成
        • 1.4 Spring 5的新特性
          • 1.4.1 Spring 5与其他版本的比较
          • 1.4.2 Spring 5新特性:a.更新JDK基线
          • 1.4.3 Spring 5新特性:b.修订核心框架
          • 1.4.4 Spring 5新特性:c.更新核心容器
          • 1.4.5 Spring 5新特性:d.支持响应式编程
          • 1.4.6 Spring 5新特性:e.支持函数式Web框架
          • 1.4.7 Spring 5新特性:f.支持Kotlin
          • 1.4.8 Spring 5新特性:g.提升测试功能
        • 1.5 Spring的下载及目录结构
          • 1.5.1 Spring框架简单介绍
          • 1.5.2 下载Spring的相关jar包可按如下步骤进行。
            • STEP 01
            • STEP 02
          • 1.5.3 Spring目录结构下文件夹介绍
            • STEP 03
      • 2 Spring的入门程序
        • 2.1 STEP 01
        • 2.2 STEP 02
        • 2.3 STEP 03
        • 2.4 XML文件的约束信息配置
        • 2.5 Spring帮助文档获取约束信息
          • 2.5.1 步骤1
          • 2.5.2 步骤2
          • 2.5.3 步骤3
        • 2.6 STEP 04
        • 2.7 STEP 05
      • 3 控制反转与依赖注入
        • 3.1 控制反转的概念
          • 3.1.1 传统面向对象程序设计原则
          • 3.1.2 IoC设计原则
        • 3.2 依赖注入的概念
          • 3.2.1 什么是依赖注入
          • 3.2.2 依赖注入和控制反转的比较
        • 3.3 依赖注入的类型
          • 3.3.1 依赖注入的实现方式
          • 3.3.2 构造方法注入
            • STEP 01 编写用户类
            • STEP 02 获取Bean的配置信息
            • <constructor-arg>元素
            • STEP 03 编写测试类
        • 3.4属性setter方法注入
            • STEP 01 编写用户类
            • STEP 02 获取Bean的配置信息
            • STEP 03 编写测试类
        • 3.4 依赖注入的应用
          • 3.4.1下面以属性setter方法注入为例,实现一个简单的登录验证。
            • STEP 01 编写DAO层
            • STEP 02 编写DAO层的实现类
            • STEP 03 编写Service层
            • STEP 04 编写Service层实现类
            • STEP 05 编写applicationContext.xml配置文件
            • STEP 06 编写测试类

第6章 初识Spring框架

学习目标

了解Spring框架及其优点

了解Spring框架的体系结构与Spring 5的新特性

熟悉Spring框架的下载及目录结构

掌握Spring框架入门程序的编写

理解控制反转的概念

掌握依赖注入的概念、类型和应用

学习内容

1 Spring介绍

1.1 Spring概述

1.1.1 String框架的核心技术

Spring是由Rod Johnson组织和开发的一个分层的JavaSE/EE一站式(full-stack)轻量级开源框架。它最为核心的理念是IoC(控制反转)和AOP(面向切面编程),其中,IoC是Spring的基础,它支撑着Spring对JavaBean的管理功能;AOP是Spring的重要特性,AOP是通过预编译方式和运行期间动态代理实现程序功能,也就是说可以在不修改源代码的情况下,给程序统一添加功能。

1.1.2 String在表现层、业务逻辑层和持久层的作用

(1)在表现层它提供了Spring MVC框架,并且Spring还可以与Struts框架整合。
(2)在业务逻辑层可以管理事务、记录日志等。
(3)在持久层可以整合MyBatis、Hibernate、JdbcTemplate等技术。

1.2 Spring框架的优点

1.2.1 String框架的作用

Spring作为Java EE的一个全方位应用程序框架,为开发企业级应用提供了一个健壮、高效的解决方案。它不仅可以应用于Java应用的开发,也可以应用于服务器端开发。Spring之所以得到如此广泛应用,是因为Spring框架具有以下几个优点。

1.2.2 String框架的优点:a.非侵入式设计

Spring是一种非侵入式(non-invasive)框架,所谓非侵入式是指Spring框架的API不会在业务逻辑上出现,也就是说业务逻辑应该是纯净的,不能出现与业务逻辑无关的代码。由于业务逻辑中没有Spring的API,所以业务逻辑代码也可以从Spring框架快速地移植到其他框架。

1.2.3 String框架的优点:b.降低耦合性

Spring就是一个大工厂,可以将所有对象的创建和依赖关系的维护工作都交给Spring容器管理,大大降低了组件之间的耦合性。

1.2.4 String框架的优点:c.支持AOP编程

Spring提供了对AOP的支持,AOP可以将一些通用的任务进行集中处理,如安全、事务和日志等,以减少通过传统OOP方法带来的代码冗余和繁杂。

1.2.5 String框架的优点:d.支持声明式事务

在Spring中,可以直接通过Spring配置文件管理数据库事务,省去了手动编程的繁琐,提高了开发效率。

1.2.6 String框架的优点:e.方便程序的测试

Spring提供了对Junit的支持,开发人员可以通过Junit进行单元测试。

1.2.7 String框架的优点:f.方便集成框架

Spring提供了一个广阔的基础平台,其内部提供了对各种框架的直接支持,如Struts、Hibernate、MyBatis、Quartz等,这些优秀框架可以与Spring无缝集成。

1.2.8 String框架的优点:g.降低Java EE API的使用难度

Spring对Java EE开发中的一些API(如JDBC、JavaMail等)都进行了封装,大大降低了这些API的使用难度。

1.3 Spring的体系结构

在这里插入图片描述

1.3.1 Spring 5框架组成模块

Spring 框架主要有8大模块,每个大模块由多个或1个小模块组成,如Spring的核心容器模块(Core Container)是由Beans模块、Core模块、Context模块和SpEL模块组成。下面结合String 的体系结构图对Spring体系结构中的主要模块进行简单介绍。

1.3.2 a.核心容器模块(Core Container)

核心容器模块在Spring的功能体系中起着支撑性作用,是其他模块的基石。核心容器层主要由Beans模块、Core模块、Contex模块和SpEL模块组成。

1.3.3 核心容器模块各模块组成

(1)Beans模块。它提供了BeanFactory类,是工厂模式的经典实现,Beans模块的主要作用是创建和管理Bean对象。
(2)Core模块。它提供了Spring框架的基本组成部分,包括IoC和DI功能。
(3)Context模块。它构建于Beans模块和Core模块的基础之上,它可以通过ApplicationContext接口提供上下文信息。
(4)SpEL模块。它是Spring 3.0后新增的模块,提供了对SpEL表达式语言(Spring Expression Language)的支持,SpEL表达式语言是一个在程序运行时支持操作对象图的表达式语言。

1.3.4 b.数据访问及集成模块(Data Access/Integration)

数据访问及集成模块用于访问和操作数据库中的数据,它主要包含JDBC模块、ORM模块、OXM模块、JMS模块和Transactions模块。

1.3.5 数据访问及集成模块各模块组成

(1) JDBC模块。它提供了一个JDBC的抽象层,消除了冗长的JDBC编码并能够解析数据库供应商特有的错误代码。
(2)ORM模块。它为主流的对象关系映射API提供了集成层,用于集成主流的对象关系映射框架。
(3)OXM模块。它提供了对XML映射的抽象层的支持,如JAXB、Castor等。
(4)JMS模块。它主要用于传递消息,包含消息的生产和消费。自4.1版本后,JMS模块支持与Spring-message模块的集成。
(5)Transactions模块。它的主要功能是事务管理。

1.3.6 c.Web模块
    Web模块的实现基于APPlicationContext基础之上,它提供了Web应用的各种工具类,包括了Web模块、Servlet模块、WebSocket模块和Portlet模块。
1.3.7 Web模块各模块组成

(1) Web模块。它提供了针对Web开发的集成特性,如大部分文件上传功能等。此外,Web模块还包含一个HTTP客户端和Spring远程处理支持的Web相关部分。
(2)Servlet模块。它提供了Spring的模型、视图、控制器以及Web应用程序的REST Web服务实现。
(3)WebSocket模块。它是Spring 4.0以后新增的模块,它提供了WebSocket 和SockJS的实现,以及对STOMP的支持。
(4)Portlet模块。它类似Servlet模块的功能,提供了Portlet环境下的MVC实现。

1.3.8 d.其他模块

Spring框架的其他模块还有AOP模块、Aspects模块、Instrumentation模块以及Test模块。

1.3.9 其他模块各模块组成

(1) AOP模块。它提供了对面向切面编程的支持,程序可以定义方法拦截器和切入点,将代码按照功能进行分离,以降低程序的耦合性。
(2)Aspects模块。它提供了与AspectJ集成的支持。
(3)Instrumentation模块。它提供了对类工具的支持,并且实现了类加载器,该模块可以在特定的应用服务器中使用。
(4)Messaging模块。它是Spring 4.0以后新增的模块,它提供了对消息传递体系结构和协议的支持。
(5)Test模块。它提供了对程序单元测试和集成测试的支持。

1.4 Spring 5的新特性

1.4.1 Spring 5与其他版本的比较

Spring 5是Spring当前最新的版本,与历史版本对比,Spring 5对Spring核心框架进行了修订和更新,增加了很多新特性,如支持响应式编程等。

1.4.2 Spring 5新特性:a.更新JDK基线

因为Spring 5代码库运行于JDK 8之上,所以Spring 5对JDK的最低要求是JDK 8,这可以促进Spring的使用者积极运用Java 8新特性。

1.4.3 Spring 5新特性:b.修订核心框架

(1)基于JDK 8的反射增强,通过Spring 5提供的方法可以更加高效的对类或类的参数进行访问。
(2)核心的Spring接口提供了基于JDK 8的默认方法构建的选择性声明。
(3)用@Nullable和@NotNull注解来表明可为空的参数以及返回值,可以在编译时处理空值而不是在运行时抛出NullPointerExceptions异常。

1.4.4 Spring 5新特性:c.更新核心容器
         Spring 5支持候选组件索引作为类路径扫描的替代方案。从索引读取实体类,会使加载组件索引开销更低,因此,Spring程序的启动时间将会缩减。
1.4.5 Spring 5新特性:d.支持响应式编程

响应式编程是另外一种编程风格,它专注于构建对事件做出响应的应用程序。Spring 5包含响应流和Reactor(ReactiveStream的Java实现),响应流和Reactor支撑了Spring自身的功能及相关API。

1.4.6 Spring 5新特性:e.支持函数式Web框架

Spring 5提供了一个函数式Web框架。该框架使用函数式编程风格来定义端点,它引入了两个基本组件: HandlerFunction和RouterFunction。HandlerFunction 表示处理接收到的请求并生成响应函数;RouterFunction替代了@RequestMapping注解,用于将接收到的请求转发到处理函数。

1.4.7 Spring 5新特性:f.支持Kotlin

Spring 5提供了对Kotlin语言的支持。Kotlin是一种支持函数式编程风格的面向对象语言,它运行在JVM之上,可以让代码更具有表现力、简洁性和可读性。有了对Kotlin的支持,开发人员可以进行深度的函数式Spring编程,这拓宽了Spring的应用领域。

1.4.8 Spring 5新特性:g.提升测试功能

Spring 5完全支持Junit 5 Jupiter,因此可以使用Junit 5编写测试代码。除此之外,Spring 5还提供了在Spring TestContext Framework中进行并行测试的扩展。针对响应式编程模型,Spring 5引入了支持Spring webFlux的WebTestClient集成测试。

1.5 Spring的下载及目录结构

1.5.1 Spring框架简单介绍
    Spring是一个独立的框架,它不需要依赖任何Web服务器或容器,既可以在独立的Java SE项目中使用,也可以在Java EE项目中使用。在使用Spring之前需要获取它的jar包,这些jar包可以在Spring官网下载。
1.5.2 下载Spring的相关jar包可按如下步骤进行。
STEP 01

使用浏览器访问Spring的官方下载地址,访问org→springframework→spring路径,就可以看到Spring框架各个版本压缩包的下载链接,这里选择5.2.8.RELEASE版本,单击链接下载该文件。在官网单击下面这个链接下载该文件。

spring-5.2.8.RELEASE-dist.zip
STEP 02

下载完成后,将文件解压得到一个名为spring-framework-5.2.8.RELEASE的文件夹。

在这里插入图片描述

1.5.3 Spring目录结构下文件夹介绍

docs文件夹:该文件夹下存放Spring的相关文档,包括开发指南、API参考文档。
libs文件夹:该文件夹下存放开发所需的jar包和源码。整个Spring框架由21个模块组成,libs目录下Spring为每个模块都提供了三个压缩包,因此,libs文件夹下一共有63个jar包。这63个jar包分为三类。
schema文件夹:该文件夹下存放Spring各种配置文件的XML Schema文档。

STEP 03

加载JAR包。
在使用Spring开发时,除了要使用自带的jar包外,Spring的核心容器还需要依赖commons.logging的jar包。该jar包可以通过commons的官方地址下载。下载完成后,会得到一个名为commons-logging-1.2-bin.zit的压缩包。将压缩包解压到自定义目录后,即可找到commons.logging对应jar包commons-logging-1.2.jar。

2 Spring的入门程序

下面通过一个简单的入门程序演示Spring框架的使用,要求在控制台打印“张三,欢迎来到Spring”,实现步骤具体如下。

2.1 STEP 01

在IDEA中创建名称为chapter06的Maven项目,然后在pom.xml文件中加载需使用到的Spring四个基础包以及Spring依赖包。

<!--此处只展示了一个-->
<dependency>       
	<groupId>org.springframework</groupId>
	<artifactId>spring-expression</artifactId>
               <version>5.2.8.RELEASE</version>	
</dependency>

2.2 STEP 02

创建名为HelloSpring的类,在HelloSpring类中定义userName属性和show()方法。

package com.itheima;
public class HelloSpring {
    private String userName;
    public void setUserName(String userName){
        this.userName=userName;	}
    public void show() { 
        System.out.println(userName+":欢迎来到Spring");	}
}

2.3 STEP 03

新建applicationContext.xml文件作为HelloSpring类的配置文件,并在该配置文件中创建id为helloSpring的Bean。

<!-- 将指定类配置给Spring,让Spring创建HelloSpring
	对象的实例 -->
<bean id="helloSpring" class="com.itheima.HelloSpring">
        <!--为userName属性赋值-->
        <property name="userName" value="张">
        </property>
</bean>

2.4 XML文件的约束信息配置

XML文件包含了很多约束信息,如果自己动手去编写,不但浪费时间,还容易出错。XML的约束信息如下所示。

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans  
	   http://www.springframework.org/schema/beans/spring-beans.xsd">

其实,在Spring的帮助文档中,就可以找到这些约束信息。

2.5 Spring帮助文档获取约束信息

2.5.1 步骤1

打开Spring目录结构下的docs文件夹,在spring-framework-reference文件夹的Spring的参考文件目录下找到index.html文件。
在这里插入图片描述

2.5.2 步骤2

使用浏览器打开index.html。
在这里插入图片描述

2.5.3 步骤3

在步骤2中单击“Core”链接进入Core Technologies页面,单击1.The IoC container→1.2.Container overview→1.2.1.Configuration Metadata目录,可以查看配置文件的约束信息。
在这里插入图片描述

2.6 STEP 04

创建测试类TestHelloSpring,在main()方法中初始化Spring容器并加载applicationContext.xml配置文件,通过Spring容器获取HelloSpring类的helloSpring实例,调用HelloSpring类中的show()方法在控制台输出信息。

public class TestHelloSpring {
    public static void main(String[] args){
        // 初始化spring容器,加载applicationContext.xml配置
        ApplicationContext applicationContext=new 
     ClassPathXmlApplicationContext("applicationContext.xml");
        // 通过容器获取配置中helloSpring的实例
        HelloSpring helloSpring=
        (HelloSpring)applicationContext.getBean("helloSpring");
        helloSpring.show();// 调用方法	}
}

2.7 STEP 05

在IDEA中启动测试类TestHelloSpring,控制台会输出结果。
在这里插入图片描述

3 控制反转与依赖注入

3.1 控制反转的概念

3.1.1 传统面向对象程序设计原则

在这里插入图片描述

3.1.2 IoC设计原则

在这里插入图片描述

3.2 依赖注入的概念

3.2.1 什么是依赖注入

依赖注入(Dependency Inject,缩写DI)就是由IoC容器在运行期间动态地将某种依赖资源注入对象之中。例如,将对象B注入(赋值)给对象A的成员变量。依赖注入的基本思想是:明确地定义组件接口,独立开发各个组件,然后根据组件的依赖关系组装运行。

3.2.2 依赖注入和控制反转的比较

依赖注入(DI)和控制反转(IoC)是从不同角度来描述了同一件事情。依赖注入是从应用程序的角度描述,即应用程序依赖IoC容器创建并注入它所需要的外部资源;而控制反转是从IoC容器的角度描述,即IoC容器控制应用程序,由IoC容器反向地向应用程序注入应用程序所需要的外部资源。这里所说的外部资源可以是外部实例对象,也可以是外部文件对象等。

3.3 依赖注入的类型

3.3.1 依赖注入的实现方式

依赖注入的作用就是在使用Spring框架创建对象时,动态的将其所依赖的对象注入到Bean组件中。依赖注入通常有两种实现方式,一种是构造方法注入,另一种是属性setter方法注入。这两种实现方式具体介绍如下。

3.3.2 构造方法注入

构造方法注入是指Spring容器调用构造方法注入被依赖的实例,构造方法可以是有参的或者是无参的。Spring在读取配置信息后,会通过反射方式调用实例的构造方法,如果是有参构造方法,可以在构造方法中传入所需的参数值,最后创建类对象。

STEP 01 编写用户类

新建User1类,在User1类中定义id、name和password三个属性。

public class User1 {
  private int id;   private String name;   private String password;
  public User1(int id, String name, String password){
      this.id=id;	this.name=name;
      this.password=password; }
  public String toString(){
      return "id="+id+",name="+name+",password="+password;
  }}
STEP 02 获取Bean的配置信息

创建applicationContext-User.xml文件,在该文件中添加User1类的配置信息。

<bean id="user1" class="com.itheima.User1">
        <constructor-arg name="id" value="1">
        </constructor-arg>
        <constructor-arg name="name" value="张三">
        </constructor-arg>
        <constructor-arg name="password" 	value="123"></constructor-arg>
</bean>
元素

一个元素表示构造方法的一个参数,且定义时不区分顺序,只需要通过元素的name属性指定参数即可。元素还提供了type属性类指定参数的类型,避免字符串和基本数据类型的混淆。

STEP 03 编写测试类

创建测试类TestUser1,用于测试依赖注入的结果。

public class TestUser1 {
    public static void main(String[] args)throws Exception{
        //加载applicationContext.xml配置
        ApplicationContext applicationContext=new 
        ClassPathXmlApplicationContext("applicationContext-User.xml");
        //获取配置中的User1实例
        User1 user1=applicationContext.getBean("user1", User1.class);
        System.out.println(user1);
    }
}

3.4属性setter方法注入

属性setter方法注入是Spring最主流的注入方法,这种注入方法简单、直观,它是在被注入的类中声明一个setter方法,通过setter方法的参数注入对应的值。

STEP 01 编写用户类

新建User2类,在User2类中定义id、name和password三个属性。

public class User2 {
    private int id;	private String name;	
    private String password;
    // 省略getter/setter方法
    public String toString(){
        return "id="+id+",name="+name+",password="+password;
    } 
}
STEP 02 获取Bean的配置信息

创建applicationContext-User2.xml文件,并在该文件的bean元素中添加User2类的配置信息。

<bean id="user2" class="com.itheima.User2">
    <property name="id" value="2"></property>
    <property name="name" value="李四"></property>
    <property name="password" value="456">
	</property>
</bean>
STEP 03 编写测试类

创建测试类TestUser2,用于测试依赖注入的结果。

public class TestUser2 {
    public static void main(String[] args)throws Exception {
        //加载applicationContext.xml配置
        ApplicationContext applicationContext = new 
        ClassPathXmlApplicationContext("applicationContext-User2.xml");
        //获取配置中的User2实例
        User2 user2 = applicationContext.getBean("user2", User2.class);
        System.out.println(user2);
}}

3.4 依赖注入的应用

3.4.1下面以属性setter方法注入为例,实现一个简单的登录验证。
STEP 01 编写DAO层

创建接口UserDao.java,在UserDao.java接口中添加方法login(),用于实现登录功能。

public interface UserDao {
    public boolean login(String name,String password);
}
STEP 02 编写DAO层的实现类

创建UserDao接口的实现类UserDaoImpl,在UserDaoImpl类中实现login()方法。

public class UserDaoImpl implements UserDao {
    @Override
    public boolean login(String name, String password) {
        if (name.equals(“张三”)&&password.equals(123)){ 
	return true;
        }
        return false;
    }
}
STEP 03 编写Service层

新建service包,在service包下创建接口UserService.java,在接口中添加方法login()。

public interface UserService {
    public boolean login(String name,String password);
}
STEP 04 编写Service层实现类

创建UserService接口的实现类UserServiceImpl,在UserServiceImpl类中实现login()方法。

public class UserServiceImpl implements UserService {
    UserDao userDao;
    public void setUserDao(UserDaouserDao)
        { this.userDao=userDao; }
    @Override
    public boolean login(String name, String password) {
        return userDao.login(name,password);
    }
}
STEP 05 编写applicationContext.xml配置文件

使用元素添加创建的UserDaoImpl类和UserServiceImpl类的实例,并配置其相关属性。

<bean id="userDao" 	class="com.itheima.dao.impl.UserDaoImpl"></bean>
<bean 	id=“userService”class="com.itheima.service.impl
	.UserServiceImpl">
	<property name="userDao" ref="userDao">
       	</property>
</bean>
STEP 06 编写测试类

在com.itheima包中新建测试类TestSpring。

public class TestSpring {
    public static void main(String[] args) {
        // 加载applicationContext.xml配置
        ApplicationContext applicationContext=new 
        ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService=(UserService) // 获取配置中的UserService实例
        applicationContext.getBean("userService");
        boolean flag =userService.login("张三","123");
        if (flag) { System.out.println("登录成功");
        } else { System.out.println(“登录失败"); }
}}

相关文章:

  • 【明年找到好工作】:面试题打卡第二天
  • 企业Java实战面试题
  • 多次握手登录
  • gdb调试 常用命令
  • 华为云上安装mysql-5.7.38-极其详细的安装教程
  • vue父子组件传值:父传子、子传父
  • 使用花生壳做内网穿透
  • 基于SSM的学生宿舍管理系统
  • 第二章第六节 ST图与迭代优化
  • Kotlin(九)类、属性、构造函数
  • Java 八股文能不背吗?Java 面试都只是背答案吗?
  • [CC2642R1][VSCODE+Embedded IDE+IAR Build+Cortex-Debug] TI CC2642R1基于VsCode的开发环境
  • JS垃圾回收与内存泄漏
  • MySQL数据库笔记
  • 基于SSM的高校餐厅防疫管理系统
  • 【译】理解JavaScript:new 关键字
  • Angular 响应式表单 基础例子
  • Django 博客开发教程 16 - 统计文章阅读量
  • HTTP那些事
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • javascript数组去重/查找/插入/删除
  • Js基础知识(四) - js运行原理与机制
  • Magento 1.x 中文订单打印乱码
  • Mybatis初体验
  • nginx 配置多 域名 + 多 https
  • Python学习笔记 字符串拼接
  • Redis 中的布隆过滤器
  • VUE es6技巧写法(持续更新中~~~)
  • 测试开发系类之接口自动化测试
  • 创建一种深思熟虑的文化
  • 大数据与云计算学习:数据分析(二)
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 仿天猫超市收藏抛物线动画工具库
  • 高性能JavaScript阅读简记(三)
  • 基于HAProxy的高性能缓存服务器nuster
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 通过git安装npm私有模块
  • 消息队列系列二(IOT中消息队列的应用)
  • 小程序button引导用户授权
  • 硬币翻转问题,区间操作
  • 责任链模式的两种实现
  • 湖北分布式智能数据采集方法有哪些?
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • ​水经微图Web1.5.0版即将上线
  • #前后端分离# 头条发布系统
  • (javascript)再说document.body.scrollTop的使用问题
  • (分享)自己整理的一些简单awk实用语句
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (力扣题库)跳跃游戏II(c++)
  • (六)c52学习之旅-独立按键
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • .cfg\.dat\.mak(持续补充)
  • .md即markdown文件的基本常用编写语法