JavaEE简单示例——基于XML配置文件的SSM整合

news2025/6/19 12:57:54

SSM整合

在本节中,我们会将之前我们学习过的三个框架结合起来,让他们可以融合起来,搭建成一个完整的贯穿整个三层架构的整体框架。

三层框架与对应的框架功能

我们首先回顾一下我们编写软件的三层框架以及对应使用的框架都分别是什么,尤其是框架对应实现的功能,让我们在整合框架的时候有一个清晰的思路。

  • 数据持久层:这一层的作用是做数据持久化,也就是将我们的数据保存在数据库中,与数据库做交互行为的层。在这一层工作的框架是我们第一个接触的MyBatis。
  • 业务逻辑层:这一层的作用是处理用户发来的请求,根据用户的操作,计算出对应的结果,完成对应的业务逻辑。在这一层工作的是Spring,他会负责管理持久层和表现层的Bean对象,并且做事务管理。
  • 表现层:这一层的作用是接收用户的请求,并将业务逻辑层的对请求处理的结构展示给用户。在这一层工作的框架是SpringMVC。

在简单的了解了三层框架的基本构成之后,我们就可以来进行SSM框架的整合了,在进行整合之前,我们需要做一些前期准备工作

前期准备

首先,我们需要创建一个基本的Maven项目,然后导入对应的依赖:

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>conformityByXML</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!--    设置打包方式-->
    <packaging>war</packaging>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <!--        mybatis的核心依赖坐标-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.13</version>
        </dependency>
        <!--        mysql连接类的依赖坐标-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.32</version>
        </dependency>
        <!--        这是整合中后加的Spring整合MyBatis的依赖-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.1</version>
        </dependency>
        <!--        数据源-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.20</version>
        </dependency>
        <!--        junit单元测试的依赖坐标-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>
        <!--        配合Spring进行测试的单元-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.2.21.RELEASE</version>
        </dependency>
        <!--        servlet的依赖坐标-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <!--        jsp的依赖坐标-->
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.1</version>
            <scope>provided</scope>
        </dependency>
        <!--        spring的核心依赖坐标-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.21.RELEASE</version>
        </dependency>
        <!--        spring的Jdbc包-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.2.21.RELEASE</version>
        </dependency>
        <!--        spring的用于事务管理的依赖坐标 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>5.2.21.RELEASE</version>
        </dependency>
        <!--        用于解析切入点表达式-->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.7.2</version>
        </dependency>
        <!--        添加SpringMVC的web包-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.21.RELEASE</version>
        </dependency>
        <!--        JavaSon转换核心类-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.9.5</version>
        </dependency>
        <!--        转换的数据绑定所需要的依赖坐标-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.2</version>
        </dependency>
        <!--        JSON转换注解包-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.9.0</version>
        </dependency>
        <!--        文件上传和下载的依赖-->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.5</version>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>RELEASE</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.1</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
    <build>
        <!--        plugins的作用是添加maven的插件-->
        <!--        我们添加了两个插件,分别是用来编译代码的maven-compiler-plugin-->
        <!--        以及我们的的tomcat插件-->
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.2</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <!--                这里面包含了我们tomcat的一些基本设置,比如端口号和编码格式以及我们的虚拟路径的一些设置-->
                <configuration>
                    <!--                    设置tomcat的编码格式-->
                    <uriEncoding>utf-8</uriEncoding>
                    <!--                    设置tomcat的端口号-->
                    <port>80</port>
                    <!--                    设置项目的虚拟路径,这里的根路径表示不设置虚拟路径,直接使用根目录-->
                    <path>/</path>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

然后来到我们的数据库,在数据库中创建一个表叫做tb_book,里面存放我们的一些基本数据,方便我们之后的查询操作。

show databases ;
drop database if exists mybatis;
create database if not exists mybatis;
use mybatis;
drop table if exists tb_book;
create table if not exists tb_book(
                                      id int,
                                      name varchar(20),
                                      price int
);
insert into tb_book values (1,'Java基础',12),
                           (2,'JavaEE',12),
                           (3,'JavaWeb',14);

完成这一步之后,我们的数据库就准备好了,然后就是在项目中创建对应的文件。 首先,我们要创建与数据表对应的数据封装类,我们创建一个com.spring.pojo包,然后在包下面创建book类,这个类的属性与tb_book的列对应,并且创建对应的带参构造方法,无参构造方法,getter、setter方法,toString方法 

package com.spring.pojo;

public class book {
    private int id;
    private int price;
    private String name;

    @Override
    public String toString() {
        return "book{" +
                "id=" + id +
                ", price=" + price +
                ", name='" + name + '\'' +
                '}';
    }

    public int getId() {
        return id;
    }

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

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    public String getName() {
        return name;
    }

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

    public book(int id, int price, String name) {
        this.id = id;
        this.price = price;
        this.name = name;
    }

    public book() {
    }
}

首先,我们要先按照之前使用MyBatis框架的时候,搭建一个基于XML文件的MyBatis环境,并完成查询表中所有数据的功能 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="@gaoyang1"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="Mapper/bookMapper.xml"/>
    </mappers>
</configuration>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="Mapper.bookMapper">
<!--    根据ID查找对应的书-->
    <select id="selectBookById" resultType="com.spring.pojo.book" parameterType="Integer">
        select * from tb_book where id = #{id}
    </select>
<!--    查询所有的数据-->
    <select id="selectAll" resultType="com.spring.pojo.book">
        select * from tb_book;
    </select>
</mapper>

 进行MyBatis的单元测试:

import com.spring.pojo.book;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class MyBatisText {
    public static void main(String[] args) throws IOException {
        InputStream stream = Resources.getResourceAsStream("MyBatis.xml");
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(stream);
        SqlSession session = build.openSession(true);
        List<book> books = session.selectList("Mapper.bookMapper.selectAll");
        for(book b : books){
            System.out.println(b.toString());
        }
    }
}

在我们测试好了MyBatis的查询语句之后,我们之后所有的框架整合操作都会基于MyBatis来增加,首先从整合spring开始:

Spring整合MyBatis

首先,我们需要在现有的框架中将,spring框架整合进去。我们首先介绍一下Spring整合MyBatis的思想,以及在整合的时候,各自扮演的角色。

整合思想

Spring整合MyBatis的思想非常的简单,Spring扮演一个容器的角色,在我们使用MyBatis的过程中使用到的两个重要的类,一个是SqlSessionFactory和Mapper对象都,以及我们的数据源对象,全部都交由Spring来管理。

具体实现

思想非常的简单,我们就按照这个思想去实现,首先我们来正常的编写一个spring配置文件,起名叫做application-dao.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--    配置数据源-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
        <property name="password" value="@gaoyang1"/>
        <property name="username" value="root"/>
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
    </bean>
<!--    配置SqlSessionFactory-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
    </bean>
<!--    配置映射-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="Mapper"/>
    </bean>
</beans>

在这里我们需要做一个修改,因为之前我们是直接调用Sql映射文件来调用我们的Sql语句,但是我们在之后的配置中要基于接口文件去调用SQL语句,所以我们要创建一个接口,改造成接口式开发的模式,创建一个软件包叫做:Mapper,然后在下面创建一个接口,起名叫做:bookMapper,文件内容如下:

package Mapper;

import com.spring.pojo.book;

import java.util.List;

public interface bookMapper {
    public book selectBookById(int id);
    public List<book> selectAll();
}

我们继续看application-dao.xml文件,可以看到,我们在配置文件中,配置了三个类,我们来依次介绍这三个类的作用以及替代的配置文件内容:

  • com.alibaba.druid.pool.DruidDataSource:这个类是阿里的数据源对象,它可以帮我们配置与数据源有关的信息,也就是和配置数据库连接的相关信息,包括url,用户名,密码,驱动
  • org.mybatis.spring.SqlSessionFactoryBean:这个类是配置SqlSessionFactory的类,我们可以通过这个类将我们的SqlSessionFactory交给Spring来管理,这样其中一个重要的类就完成了整合
  • org.mybatis.spring.mapper.MapperScannerConfigurer:这个类可以扫描dao包,并将Mapper接口注册到IoC容器中,然后就可以完成对所有Mapper接口的管理,并且我们可以不用创建接口的实现类,Spring的底层会自动的创建Mapper接口的动态代理对象,我们可以像调用一个类一样去调用这个接口。

以上就是这些类的含义,然后我们就可以来到我们的测试类中,测试我们是否可以通过IoC容器获取SqlSessionFactory类


import Mapper.bookMapper;
import com.spring.pojo.book;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class getSqlSessionFactoryTest {
    public static void main(String[] args) {
        ApplicationContext ac = new ClassPathXmlApplicationContext("application-dao.xml");
        SqlSessionFactory ssf = (SqlSessionFactory) ac.getBean("sqlSessionFactory");
        SqlSession sqlSession = ssf.openSession(true);
        bookMapper mapper = sqlSession.getMapper(bookMapper.class);
        for (book book : mapper.selectAll()) {
            System.out.println(book.toString());
        }

    }
}

 

可以看到,我们确实通过IoC容器获取到了SqlSessionFactory对象,并且通过Mapper对象操作数据库获取到了所有的数据集合,接下来我们需要将Service层整合进去,也就是我们需要创建一个类,标注@Service注解,然后在这个类中调用dao层的接口方法获取数据,我们来看看我们具体要如何操作 首先,我们要创建一个新的软件包,取名叫做com.spring.service,然后在里面编写service层的接口和实现类:

package com.spring.service;

import com.spring.pojo.book;

import java.util.List;

public interface bookService {
    public book selectBookById(int id);
    public List<book> selectAll();
}
package com.spring.service.impl;

import Mapper.bookMapper;
import com.spring.pojo.book;
import com.spring.service.bookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
@Service
public class bookServiceImpl implements bookService {
    @Autowired
    private bookMapper bookMapper;
    @Override
    public book selectBookById(int id) {
        return bookMapper.selectBookById(id);
    }

    @Override
    public List<book> selectAll() {
        return bookMapper.selectAll();
    }
}

然后就是创建对应的配置文件。首先,为了区分dao层和Service层,我们重新创建一个新的spring配置文件,起名叫做application-service.xml然后在里面写入我们的Service的配置:

<?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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context  http://www.springframework.org/schema/context/spring-context.xsd">
<!--    配置包扫描器,扫描Service包下面的控制器类,并将其加载进IoC容器-->
    <context:component-scan base-package="com.spring.service"/>
</beans>

将所有的配置都完成之后,我们就可以进行单元测试了,测试我们通过IoC容器获取Service层的应用之后能否顺利调用接口:

package com.spring.service;

import com.spring.pojo.book;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:application-dao.xml","classpath:application-service.xml"})
public class bookServiceTest {
    @Autowired
    private bookService bookService;
    @Test
    public void selectBookById() {
        book book = bookService.selectBookById(1);
        System.out.println(book.toString());
    }

    @Test
    public void selectAll() {
        for (book book : bookService.selectAll()) {
            System.out.println(book.toString());
        }

    }
}

 可以看到,根据我们编写的测试,我们已经顺利将MyBatis和Spring整合到了一起,通过自动注入的方式获取到了Service层的应用,而Service层调用了dao层的接口,实现了对数据库的交互。 在这个过程中,Spring负责管理dao层的SqlSessionFactory以及Mapper,MyBatis负责与数据库交互。

Spring整合SpringMVC

对于Spring和SpringMVC的整合就非常的简单了,因为SpringMVC是Spring的子容器,所以只需要在SpringMVC的web.xml配置文件中引入Spring的配置文件,然后各自启动各自的配置文件即可

首先,我们需要添加web框架

在项目中添加web框架是是我们之前做过的内容,也是开始SpringMVC的第一步。

操作步骤

然后我们要明确接下来要做的步骤,首先创建一个软件包叫做com.spring.controller,在这个软件包中创建控制器类并添加控制器方法:

package com.spring.controller;

import com.spring.pojo.book;
import com.spring.service.bookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import java.util.List;

@Controller
public class bookController {
    @Autowired
    private bookService bookService;
    @RequestMapping("/selectBookById")
    public ModelAndView selectBookById(int id){
        ModelAndView mav = new ModelAndView();
        mav.setViewName("book");
        book book = bookService.selectBookById(id);
        mav.addObject("book",book);
        return mav;
    }
    @RequestMapping("/selectAll")
    private ModelAndView selectAll(){
        ModelAndView mav = new ModelAndView();
        mav.setViewName("book");
        List<book> books = bookService.selectAll();
        mav.addObject("books",books);
        return mav;
    }
}

接下来我们需要进入web.xml配置文件,首先我们要配置Spring的容器和和监听容器加载的监听器类,这个动作就是将Spring框架和SpringMVC进行整合的过程

<!--    加载Spring容器和配置文件-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:application-*.xml</param-value>
    </context-param>
<!--    加载容器监听器-->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

然后我们继续在wen.xml文件中添加前端控制器,并配置拦截路径,这样我们的整个的web.xml文件就配置完成了,完整的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>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
<!--    配置拦截路径-->
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
<!--    加载Spring容器和配置文件-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:application-*.xml</param-value>
    </context-param>
<!--    加载容器监听器-->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
</web-app>

然后我们需要创建我们的SpringMVC的配置文件,我们在resources文件夹下面创建spring-mvc.xml,在这个文件中我们主要做两件事

  • 配置包扫描器,扫描controller包下面的controller类,并将其注册到IoC容器中
  • 配置注解驱动,让我们的控制器方法发挥作用

然后我们的SpringMVC的配置就做完了,完整的spring-mvc.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/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--    配置页面解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="suffix" value=".jsp"/>
        <property name="prefix" value="/SpringMVC/pages/"/>
    </bean>
<!--    配置注解扫描-->
    <context:component-scan base-package="com.spring.controller"/>
<!--    配置注解驱动-->
    <mvc:annotation-driven/>
</beans>

我们启动Maven的tomcat插件,在浏览器中打开我们的网址,并输入控制方法的映射地址,查看我们的浏览器返回结果。 如果确实出现了我们想要的结果,那么就说明我们的配置正确,而至此,我们的SSM的基于XML文件的整合也就完成了!

注意点

在这个过程中,我遇到了两个比较难办的问题:

  • 在自动注入的时候出现空指针异常。这个问题是比较困扰我的,在我查(shi)阅(li)了(tao)大(jin)量(C)的(S)资(D)料(N)之后,发现导致这个问题的原因简直蠢爆了,主要体现在我做Service的测试时,我在test文件夹下做单元测试的时候,应该导入import org.junit.Test;这个依赖,但是IDEA非要导入另一个叫做import org.junit.jupiter.api.Test;的依赖,就导致无法识别到我之前导入的配置文件,导致无法加载Spring容器,才导致了这个无法自动依赖的问题发生。
  • 在启动Maven插件的时候,在自动注入bookService的时候显示没有适配的bend。这个问题也非常的简单,就是在我编写web.xml文件的时候,把监听器类的类名写错了,注意一定是org.springframework.web.context.ContextLoaderListener,有四个跟他名字很像的Bean,如果不仔细看直接自动补全的话就非常容易出错

其他的问题倒是没有什么特备需要注意的,按照步骤一步一步的来就可以。

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

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

相关文章

代码随想录算法训练营第五十九天| 503. 下一个更大元素 II、42. 接雨水。

503. 下一个更大元素 II 题目链接&#xff1a;力扣 题目要求&#xff1a; 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个元素的 下一个更大元素 。数字 x 的 下一个更大的元素 是按数组遍历顺…

( “树” 之 DFS) 110. 平衡二叉树 ——【Leetcode每日一题】

110. 平衡二叉树 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a; 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] …

智慧钢铁厂人员定位系统解决方案,助力钢铁企业提升安全生产管理水平

作为国民经济的基础原材料产业&#xff0c;钢铁工业在经济发展中具有重要地位。中国钢铁工业不仅为我国国民经济的快速发展做出了重大贡献&#xff0c;也为世界经济的繁荣和世界钢铁工业的发展起到了积极的促进作用&#xff0c;但钢铁行业在快速发展的同时也存在一些安全管理问…

React应用(基于React脚手架)

目录前言&#xff1a;一、使用create-react-app创建react应用1、什么是 react 脚手架&#xff1f;2. 创建 cli 脚手架方式13. 创建 cli 脚手架方式24. npx:5. react脚手架项目结构6. 功能界面的组件化编码流程&#xff08;通用&#xff09;7. 如何更改脚手架版本二、React 组件…

【SpringMVC】7—文件上传

⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记链接&#x1f449;https://github.com/A-BigTree/Code_Learning ⭐⭐⭐⭐⭐⭐ 如果可以&#xff0c;麻烦各位看官顺手点个star~&#x1f60a; 如果文章对你有所帮助&#xff0c;可以点赞&#x1f44d;…

【深入理解SSD 实践】对NVMe SSD热插拔时,正确做法是怎样的?

声明 主页&#xff1a;元存储的博客_CSDN博客 依公开知识及经验整理&#xff0c;如有误请留言。 个人辛苦整理&#xff0c;付费内容&#xff0c;禁止转载。 内容摘要 前言 概念 SAS/SATA 和NVMe 区别 热插拔分类 热插拔基本原理 如何确认是否支持热插拔&#xff1f; 热插…

Python批量导出阿里云ECS和Redis实例的监控数据到Excel

背景 某公司使用阿里云的 ECS 和 Redis 服务作为其业务支撑&#xff0c;为了及时了解机器的使用情况&#xff0c;领导要求业务部门对所有阿里云机器的平均资源使用率进行统计&#xff0c;并汇总在一个 Excel 表格中&#xff0c;以便领导查看和分析。 需求 为了满足领导的需求…

C++ const的作用

1.const在C中是只读变量&#xff0c;在C中表示常量 以下代码&#xff0c;在C中是错误的&#xff0c;但是在C中是正确的。 void main() {const int n 10;int arr [n]; }2.const不仅可以定义一个常量&#xff0c;也可以定义函数参数 例如&#xff1a; char *strcpy(char *dest…

一次弄懂gzip模块启用和配置指令

接下来所学习的指令都来自ngx_http_gzip_module模块&#xff0c;该模块会在nginx安装的时候内置到nginx的安装环境中&#xff0c;也就是说我们可以直接使用这些指令。 1. gzip指令&#xff1a;该指令用于开启或者关闭gzip功能 注意只有该指令为打开状态&#xff0c;下面的指令才…

联想凌拓 ThinkSystem DE 系列全闪存阵列

ThinkSystem DE 系列全闪存阵列 超高的性能&#xff0c;极具竞争力的价格 通过消除过量配置最大限度地提高效率&#xff0c;同时通过降低空间、电源和冷却要求来降低成本。 利用高级数据保护&#xff0c;在本地或从远距离上防止数据丢失和停机事件。 在模块化 2U 构建模块中…

ModStartBlog v7.1.0 ChatGPT支持,界面全新优化

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用&#xff0c;支持后台一键快速安装&#xff0c;让开发者能快的实现业务功能开发。 系统完全开源&#xff0c;基于 Apache 2.0 开源协议。 功能特性 丰富的模块市场&#xff0c;后台一键快速安装 …

【ChatGPT】ChatGPT-5 强到什么地步?

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 ChatGPT-5 强到什么地步&#xff1f; 技术 深度学习模型的升级 更好的预测能力 自适应学习能力 特点 语言理解能力更强 自我修正和优化 更广泛的应用领域 应用 对话系统 智能写作…

2.含电热联合系统的微电网运行优化(文章复现)

说明书 相关代码资源&#xff1a;基于多目标粒子群算法冷热电联供综合能源系统运行优化 基于拉丁超立方法的风光场景生成与削减 粒子群综合能源系统优化的matlab实现 智能微电网PSO优化算法 MATLAB代码&#xff1a;含电热联合系统的微电网运行优化 关键词&#xff1a;微网…

基于PINN的极少监督数据二维非定常圆柱绕流模拟

2022年10月16日-19日&#xff0c;亚洲计算流体力学会议在韩国九州举办。会议涌现了不少结合人工智能技术进行流体力学模拟的论文成果&#xff0c;这说明人工智能技术逐渐渗透流体力学模拟领域。百度与西安交通大学的研究人员一起&#xff0c;利用飞桨框架和科学计算工具组件Pad…

生成式人工智能所面临的问题有哪些?

在生成式人工智能中工作需要混合技术、创造性和协作技能。通过发展这些技能&#xff0c;您将能够在这个令人兴奋且快速发展的领域应对具有挑战性的问题。 生成式人工智能是指一类机器学习技术&#xff0c;旨在生成与训练数据相似但不完全相同的新数据。 换句话说&#xff0c;…

WPS C++ 二次开发 Demo运行

1.官网二次开发地址&#xff1a;https://open.wps.cn/docs/client/wpsLoad 2.Demo源码下载&#xff1a; 经过测试上述链接找不到demo源码&#xff0c;可通过git命令下载&#xff1a; git clone https://code.aliyun.com/zouyingfeng/wps.git -b dev 图中cpp文件夹即为cdemo源码…

<Linux>进程概念

文章目录一、什么是进程1.进程概念2.进程描述 – PCB3.task_struct内容分类二、进程的基本操作1.查看进程2.结束进程3.通过系统调用获取进程标示符4.通过系统调用创建子进程(fork)三、进程状态1.普遍的操作系统状态2.Linux操作系统状态四、两种特殊的进程1.僵尸进程2.孤儿进程五…

sql语法:事务的”那些事“

Mysql版本&#xff1a;8.0.26 可视化客户端&#xff1a;sql yog 目录前言一、事务是什么&#xff1f;二、事务的特点三、如何提交事务和回滚事务?3.1 手动提交3.2 自动提交模式下开启事务3.3 注意事项四、事务的隔离级别4.1 模拟事务安全问题4.1.1 脏读问题模拟如下&#xff1…

11.Java面向对象----多态

Java面向对象—多态 面向对象简称 OO&#xff08;Object Oriented&#xff09;&#xff0c;20 世纪 80 年代以后&#xff0c;有了面向对象分析&#xff08;OOA&#xff09;、 面向对象设计&#xff08;OOD&#xff09;、面向对象程序设计&#xff08;OOP&#xff09;等新的系统…

Nacos介绍与安装

文章目录一、什么是Nacos(摘抄自官网介绍)二、Nacos安装2.1 下载安装包2.2 解压2.3 配置端口2.4.启动2.5.访问一、什么是Nacos(摘抄自官网介绍) Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称&#xff0c;一个更易于构建云原生应用的动态服务发…