创建和配置Spring MVC框架构建Web应用

1 认识Spring MVC

Spring Web MVC是构建在Servlet API之上的Web框架,自诞生之时就被纳入了Spring框架中。其正式/官方名称为“Spring  Web MVC”,源自其所属的模块(spring-webmvc),但通常被称为“Spring MVC”。

1.1 MVC设计模式(模型(model)-视图(view)-控制器(controller))

是一种软件设计典范,用一种将业务逻辑、数据、界面显示分离的方法组织代码

  • Model(模型):是应用程序中用于处理应用程序数据逻辑的部分,通常模型对象负责在数据库中存取数据。表示数据
  • View(视图):是应用程序中处理数据显示的部分,表示应用程序的用户界面。向控制器提交数据,并显示模型中的数据。显示数据。
  • Controller(控制器):负责接受请求并将其传递给模型以进行适当的操作,并将结果显示在适当的视图中。处理请求

1.2 Spring MVC处理请求使用的组件

  • DispatcherServet(前端控制器):负责接受请求,并根据处理程序映射将请求委托给对应的处理器,也就是控制器。
  • HandlerMapping(处理程序映射):实现将请求和处理器映射,使DispatcherServlet 能将传入的请求转发到适当的控制器。
  • Controller(控制器):作为请求的处理器,提供请求处理逻辑来处理传入的用户请求并生成适当的响应。该响应包含需要在视图上显示的数据。此外,如果需要跳转页面显示相应内容,该响应还会还包含要显示的视图的逻辑名称。
  • ViewResolver(视图解析器): 用于将控制器返回的逻辑视图名称解析为实际的视图。视图解析器负责选择和解析向用户显示的实际视图。
  • View(视图): 用于在浏览器屏幕上向用户显示所需的响应。

1.3 Spring MVC处理请求的过程

2 创建和配置Spring MVC Web应用

配置Spring MVC Web应用的方式有两种:xml配置与Java代码配置。

配置Spring MVC Web应用的过程如下:

  • 创建 Web 应用程序
  • 添加需要的 Spring 框架jar 包和 Spring Mvc框架 jar 包
  • 在web.xml文件中配置 DispatcherServlet
  • 创建控制器
  • 创建视图
  • 创建和配置 Spring MVC 配置文件
  • 部署和运行程序

2.1 xml配置

在src/main/webapp/WEB-INF下创建三个配置文件:web.xml、applicationContext.xml、dispatcher-servlet.xml

2.1.1 web.xml文件配置DispatcherServlet

首先要在web.xml中配置DispatcherServlet,它负责接受请求,并根据处理程序映射将请求委托给对应的处理器,也就是控制器。

<servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>1</load-on-startup>
</servlet>

除了DispatcherServlet外,我们还应在web.xml中配置servlet-mapping。它指定servlet映射,即指定什么请求会被什么servlet处理。

如我们前面所说的,DispatcherServlet,不是真正的用于处理请求的组件,它拦截要处理的请求,根据处理程序映射(HandlerMapping)将请求委托给对应的处理器,也就是控制器。

<servlet-mapping><servlet-name>dispatcher</servlet-name><!-- 这里的/表示所有请求,但是.jsp的请求除外 --><url-pattern>/</url-pattern>
</servlet-mapping>

 在web.xml文件中我们也可以注册监听器,使用的标签是<listener>

<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

ContextLoaderListener监听器的作用是监听程序的启动和关闭,监听到程序启动的时候,会加载spring的配置文件applicationContext.xml,并创建spring根容器。

2.1.1.1 web.xml文件配置spring配置文件位置

使用<context-param>配置spring配置文件的位置,参数名是固定的,叫做contextConfigLocation
spring配置文件可以对应多个,多个可以使用逗号、空格、换行隔开,另外还可以使用*通配符
如果配置文件放到了src下,则需要添加classpath:前缀

<context-param><param-name>contextConfigLocation</param-name><param-value>classpath:config/spring-*.xml</param-value>
</context-param>
2.1.1.2 web.xml文件配置spring mvc配置文件位置

spring mvc配置文件的默认名称是"servlet的名称-servlet.xml。当然,也可随意命名该文件,spring mvc配置文件中配置的组件主要给DispatcherServlet使用,所以需要通过DispatcherServlet的初始化参数contextConfigLocation来配置spring mvc配置文件的位置。

<servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:config/spring_mvc.xml</param-value></init-param><load-on-startup>1</load-on-startup>
</servlet>

web.xml文件的完整内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://xmlns.jcp.org/xml/ns/javaee"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"version="3.1"><!-- spring配置文件默认名称是applicationContext.xml --><!-- 当然,也可以随意命名,如果自己指定了该文件的名称,需要通过上下文参数来配置其位置 --><!-- spring配置文件中的组件是给整个程序用的 --><!-- 参数名是固定的,叫做contextConfigLocation --><!-- spring配置文件可以对应多个,多个可以使用逗号、空格、换行隔开 --><!-- 另外还可以使用*通配符 --><!-- 如果配置文件放到了src下,则需要添加classpath:前缀 --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:config/spring-*.xml</param-value></context-param><!-- listener用于注册监听器 --><!-- ContextLoaderListener监听器的作用是监听程序的启动和关闭 --><!-- 监听到程序启动的时候,会加载spring的配置文件applicationContext.xml,并创建spring根容器 --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!-- spring mvc配置文件的默认名称是"servlet的名称-servlet.xml" --><!-- 当然,也可随意命名该文件,spring mvc配置文件中配置的组件主要给DispatcherServlet使用 --><!-- 所以需要通过DispatcherServlet的初始化参数contextConfigLocation来配置spring mvc配置文件的位置 -->	<servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:config/spring_mvc.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><!-- servlet-mapping指定servlet的映射 也就是指定什么样的请求会被该servlet处理DispatcherServlet不是真正用于处理请求的组件,用于拦截要处理的请求做一些事情后,再将请求分发/派发给真正处理请求的控制器DispatcherServlet,我们叫做前端控制器--><servlet-mapping><servlet-name>dispatcher</servlet-name><!-- 这里的/表示所有请求,但是.jsp的请求除外 --><url-pattern>/</url-pattern></servlet-mapping></web-app>

2.1.2 Spring配置文件applicationContext.xml

在这个配置文件中配置Spring,配置全局性的bean,如Service、Dao等组件

<context:component-scan base-package="com.qdu.service" />
 2.1.2.1 Spring配置文件spring-config.xml

applicationContext.xml是spring配置文件的默认名称,一般会将applicationContext,xml的名称改成spring-config.xml。

spring-config.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:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><!-- 该配置文件是spring配置文件,用于配置全局性的bean,如Service、Dao等组件 --><context:component-scan base-package="com.qdu.service" /></beans>

注意:如果自己指定了该文件的名称,需要在web.xml中通过上下文参数来配置其位置 

2.1.3 Spring MVC配置文件dispatcher-servlet.xml

在这个文件中配置Spring MVC处理请求时使用的各个组件(1.2)。

1. 配置Controller(控制器):开启对控制器包的扫描,使用@Controller修饰对应的控制器类

<context:component-scan base-package="com.qdu.controller" />

2. 配置ViewResolver(视图解析器):让DispatcherServlet可以将视图名称解析为视图的实际逻辑名称。

<beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp/" /><property name="suffix" value=".jsp" />
</bean>

3. 启用注解驱动的编程模型,这样@RequestMapping等的配置会生效

 mvc:annotation-driven的标记使用会自动注册多个必须的bean,包括RequestMappingHandlerMapping

<mvc:annotation-driven />

4. 配置静态资源

我们配置servlet-mapping时,<url-pattern>写的是/,即拦截所有除了.jsp的请求,所以静态资源也会被拦截,需要针对静态资源单独处理。

可以用default-servlet-handler标记,其表示将静态资源交给web容器的默认servlet来处理

<mvc:default-servlet-handler />

可以使用mvc:resources标记使用单独的处理器处理静态资源

<!-- location:指定静态资源的位置,mapping用于指定访问静态资源的请求url模式 -->
<mvc:resources location="/" mapping="/index.html" />
<mvc:resources location="/css/" mapping="/css/**" />
<mvc:resources location="/js/" mapping="/js/**" />
<mvc:resources location="/img/" mapping="/img/**" />

如果只是希望能够跳转到WEB-INF/jsp目录下的某个jsp页面,并不做其他处理,可直接使用<mvc:view-controller>标记指定请求url和要跳转的视图的名称 

<mvc:view-controller path="/" view-name="index" />
<mvc:view-controller path="/aaa" view-name="index" />
<mvc:view-controller path="/toIndex" view-name="index" />
2.1.3.2 Srping MVC配置文件spring_mvc.xml

一般会将spring mvc配置文件的名称改成spring_mvc.xml。

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:p="http://www.springframework.org/schema/p"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><!-- 开启对控制器包的扫描,这样@Controller修饰的类会注册为spring管理的bean --><context:component-scan base-package="com.qdu.controller" /><!-- 启用注解驱动的编程模型,这样@RequestMapping等的配置会生效 --><!-- mvc:annotation-driven的标记使用会自动注册多个必须的bean,包括RequestMappingHandlerMapping --><mvc:annotation-driven /><!-- 配置视图解析器,让DispatcherServlet可以将视图名称解析为视图的实际逻辑名称 --><beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp/" /><property name="suffix" value=".jsp" /></bean><!-- /拦截的是所有请求,包括静态资源,会导致静态资源的访问报404 --><!-- 需要针对静态资源单独处理 --><!-- 1. default-servlet-handler标记表示将静态资源交给web容器的默认servlet来处理 --><!-- <mvc:default-servlet-handler /> --><!-- 2. mvc:resources标记表示使用单独的处理器处理静态资源 --><!-- location:指定静态资源的位置,mapping用于指定访问静态资源的请求url模式 --><mvc:resources location="/" mapping="/index.html" /><mvc:resources location="/css/" mapping="/css/**" /><mvc:resources location="/js/" mapping="/js/**" /><mvc:resources location="/img/" mapping="/img/**" /><!-- 如果只是希望能够跳转到WEB-INF/jsp目录下的某个jsp页面 --><!-- 并不做其他处理,可直接使用<mvc:view-controller>标记指定请求url和要跳转的视图的名称 --><mvc:view-controller path="/" view-name="index" /><mvc:view-controller path="/aaa" view-name="index" /><mvc:view-controller path="/toIndex" view-name="index" /></beans>

2.1.4 总结

基于xml配置的项目结构图如下:

 可以发现,关于spring、spring mvc的配置文件统一放到src/main/resources/config下,web.xml放到src/main/webapp/WEB-INF下。

src/main/java/com/qdu主要放controller包和service包。

src/main/webapp下放网络的静态资源(src/main/webapp/static),src/main/webapp/WEB-INF放的除了web.xml还有jsp页面。

2.2 Java代码配置

在src/main/java/com/qdu/config下创建三个配置类MyWebApplicationInitializer.class、SpringConfig.class、SpringMvcConfig.class

2.2.1 MyWebApplicationInitializer类替换web.xml

该类用于替换web.xml文件,用于初始化程序,在程序启动的时候被加载和使用。

如果spring+springmvc程序用的都是java类配置,那么可以直接让该类继承自
AbstractAnnotationConfigDispatcherServletInitializer类,以便简化写法 

让我们回忆一下我们在web.xml中都做了哪些事:

  1. 配置spring配置文件的位置
  2. 配置spring mvc配置文件的位置
  3. 配置DispatcherServlet

那么在该类中我们就应实现这三个功能:

1. 配置spring配置文件的位置:getRootConfigClasses()方法中指定spring配置类有哪些,可以有多个。加载spring配置类形成的是根容器

@Override
protected Class<?>[] getRootConfigClasses() {return new Class<?>[] {SpringConfig.class,SpringTx.class};
}

2. 配置spring mvc配置文件的位置:getServletConfigClasses()方法用于指定spring mvc配置类有哪些,可以有多个。加载spring mvc配置类形成的是Servlet上下文容器

@Override
protected Class<?>[] getServletConfigClasses() {return new Class<?>[] {SpringMvcConfig.class};
}

3. 配置DispatcherServlet:getServletMappings()方法用于指定DispatcherServlet的url映射,也就是DispatcherServlet能拦截的请求的url模式,可以是多个,用一个String[]表示

@Override
protected String[] getServletMappings() {return new String[] { "/" };
}

MyWebApplicationInitializer类完整内容如下:

package com.qdu.config;import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;//该类用于替换web.xml文件,用于初始化程序,在程序启动的时候被加载和使用
//如果spring+springmvc程序用的都是java类配置,那么可以直接让该类继承自
//AbstractAnnotationConfigDispatcherServletInitializer类,以便简化写法
public class MyWebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {//getRootConfigClasses()方法中指定spring配置类有哪些,可以有多个//加载spring配置类形成的是根容器@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class<?>[] {SpringConfig.class,SpringTx.class};}//getServletConfigClasses()方法用于指定spring mvc配置类有哪些,可以有多个//加载spring mvc配置类形成的是Servlet上下文容器@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class<?>[] {SpringMvcConfig.class};}// getServletMappings()方法用于指定DispatcherServlet的url映射// 也就是DispatcherServlet能拦截的请求的url模式,可以是多个,用一个String[]表示@Overrideprotected String[] getServletMappings() {return new String[] { "/" };}
}

2.2.2 SpringConfig类替换spring-config.xml

该类用于替换spring-config.xml文件

同spring-config.xml中所作的事情一样,开启对com.qdu.service(还可以有dao)的包扫描

package com.qdu.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;@Configuration //说明该类是个配置类
@ComponentScan(basePackages= {"com.qdu.service"})
public class SpringConfig {}

2.2.3 SpringMVCConfig类替换spring_mvc.xml

该类用于替换spring mvc的配置xml文件,Spring MVC的配置类需要实现WebMvcConfigurer接口,来实现各种mvc配置。

我们在spring_mvc.xml中共做了如下几件事:

  1. 配置控制器Controller
  2. 配置视图解析器ViewResolver
  3. 启用注解驱动的编程模型,这样@RequestMapping等的配置会生效
  4. 配置静态资源访问

1. 对于Controller,使用@ComponentScan开启对Controller包的扫描

@ComponentScan(basePackages = { "com.qdu.controller" })

2. 使用configureViewResolvers()方法中注册视图解析器组件

@Override
public void configureViewResolvers(ViewResolverRegistry registry) {//调用jsp()方法指定前缀和后缀registry.jsp("/WEB-INF/jsp/", ".jsp");
}

3. @EnableWebMvc和在xml配置文件中使用<mvc:annotation-driven />等效

@EnableWebMvc

4. 使用addResourceHandlers()中添加对静态资源的处理,为指定的静态资源添加资源处理器,让静态资源能够正常显示。
 /static/**是访问静态资源的url模式,/static/是静态资源所在的位置

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {// /static/**是访问静态资源的url模式,/static/是静态资源所在的位置registry.addResourceHandler("/static/**").addResourceLocations("/static/");
}

addViewControllers()方法用于为一些请求添加简单的视图控制器,这样可以不用添加控制器方法实现简单的页面跳转

@Override
public void addViewControllers(ViewControllerRegistry registry) {registry.addViewController("/").setViewName("index");registry.addViewController("/aaa").setViewName("index");registry.addViewController("/toIndex").setViewName("index");registry.addViewController("/toSecond").setViewName("second");
}

在这里详细解释一下这里的“添加控制器方法实现简单的页面跳转”:

WEB-INF/jsp目录下的页面是不能直接访问,需要经过控制器跳转,比如我们现在有一个index.jsp,我们要跳转到这个页面需要在com.qdu.controller包中写一个IndexController

package com.qdu.controller;import org.springframework.stereotype.Controller;@Controller
public class IndexController {@RequestMapping({"/","/aaa","/toIndex"})public String toIndex() {return "index"; //返回的index是要跳转的页面的名称}}

这里的"/"这个url表示程序的上下文路径,意思是如果请求url是上下文路径,就跳转到index页面/视图,可以对应多个url。

如果需要添加方法处理请求,比如需要从数据库读取一些数据,再跳转到页面显示,可以在控制类中添加方法处理请求。
但是如果只是单纯希望跳转到一个jsp页面,不做其他处理,直接在springmvc配置文件中配置即可

 SpringMVCConfig类的内容如下:

package com.qdu.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
@ComponentScan(basePackages = { "com.qdu.controller" })
//Spring MVC的配置类需要实现WebMvcConfigurer接口,来实现各种mvc配置
//@EnableWebMvc和在xml配置文件中使用<mvc:annotation-driven />等效
@EnableWebMvc 
public class SpringMvcConfig implements WebMvcConfigurer {//addResourceHandlers()中添加对静态资源的处理@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {//  为指定的静态资源添加资源处理器,让静态资源能够正常显示// /static/**是访问静态资源的url模式,/static/是静态资源所在的位置registry.addResourceHandler("/static/**").addResourceLocations("/static/");}//addViewControllers()方法用于为一些请求添加简单的视图控制器//这样可以不用添加控制器方法实现简单的页面跳转@Overridepublic void addViewControllers(ViewControllerRegistry registry) {registry.addViewController("/").setViewName("index");registry.addViewController("/aaa").setViewName("index");registry.addViewController("/toIndex").setViewName("index");registry.addViewController("/toSecond").setViewName("second");}//configureViewResolvers()方法中注册试图解析器组件@Overridepublic void configureViewResolvers(ViewResolverRegistry registry) {//调用jsp()方法指定前缀和后缀registry.jsp("/WEB-INF/jsp/", ".jsp");}
}

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

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

相关文章

最短路径(数据结构实训)(难度系数100)

最短路径 描述&#xff1a; 已知一个城市的交通路线&#xff0c;经常要求从某一点出发到各地方的最短路径。例如有如下交通图&#xff1a; 则从A出发到各点的最短路径分别为&#xff1a; B&#xff1a;0 C&#xff1a;10 D&#xff1a;50 E&#xff1a;30 F&#xff1a;60 输…

go 源码解读 - sync.Mutex

sync.Mutex mutex简介mutex 方法源码标志位获取锁LocklockSlowUnlock怎么 调度 goroutineruntime 方法 mutex简介 mutex 是 一种实现互斥的同步原语。&#xff08;go-version 1.21&#xff09; &#xff08;还涉及到Go运行时的内部机制&#xff09;mutex 方法 Lock() 方法用于…

网盘项目话术(0.5w字精选)

功能结构图 数据库设计总结 该项目主要就是对文件的操作&#xff0c;file表&#xff0c;file_share表。 file表主要字段&#xff1a;id&#xff0c;用户id&#xff0c;父级目录id&#xff0c;文件的地址&#xff0c;文件的封面图片地址&#xff0c;创建和修改时间。 file_sha…

国际物流公司科普_集装箱种类区分和介绍_箱讯科技

集装箱运输的不断发展&#xff0c;为适应装载不同种类货物的需要&#xff0c;因而出现了不同种类的集装箱。今天和大家一起来总结一下。 按使用材料分类 根据箱子主体部件&#xff08;侧壁、端壁、箱顶等&#xff09;采用什么材料&#xff0c;就叫做什么材料制造的集装箱&…

TPRI-DMP平台介绍

TPRI-DMP平台介绍 TPRI-DMP平台概述 TPRI-DMP为华能集团西安热工院自主产权的工业云PaaS平台&#xff0c;已经过13年的发展和迭代&#xff0c;其具备大规模能源电力行业生产应用软件开发和运行能力。提供TPRI-DMP平台主数据管理、业务系统开发与运行、应用资源管理与运维监控…

【数据结构】C语言实现单链表的基本操作

单链表基本操作的实现 导言一、查找操作1.1 按位查找1.1.1 按位查找的C语言实现1.1.2 按位查找的时间复杂度 1.2 按值查找1.2.1 按值查找的C语言实现1.2.2 按值查找的时间复杂度 二、插入操作2.1 后插操作2.2 前插操作 三、删除操作结语 导言 大家好&#xff0c;很高兴又和大家…

C++ 之LeetCode刷题记录(三)

&#x1f604;&#x1f60a;&#x1f606;&#x1f603;&#x1f604;&#x1f60a;&#x1f606;&#x1f603; 开始cpp刷题之旅&#xff0c;多学多练&#xff0c;尽力而为。 先易后难&#xff0c;先刷简单的。 13、罗马数字转整数 罗马数字包含以下七种字符: I&#xff0c…

ClickHouse基础知识(二):ClickHouse 安装教程

1. 准备工作 1.1 确定防火墙处于关闭状态 1.2 CentOS 取消打开文件数限制 &#xff08;1&#xff09;在 hadoop101 的 /etc/security/limits.conf 文件的末尾加入以下内容 sudo vim /etc/security/limits.conf&#xff08;2&#xff09;在 hadoop101 的/etc/security/limits.…

Rocky9 1.28安装kubernetes

1.环境准备 二进制安装比较复杂&#xff0c;但是也比较稳定&#xff0c;适用于线上环境使用。   本笔记参考自&#xff1a;https://github.com/cby-chen/Kubernetes &#xff0c;针对文中内容&#xff0c;有部分镜像无法拉取等&#xff0c;还有一部分有点小问题&#xff0c;…

SQL小技巧5:数据去重的N种方法,总有一种你想不到!

在平时工作中&#xff0c;使用SQL语句进行数据去重的场景非常多。 今天主要分享几种数据去重的SQL写法。 假如有一张student表&#xff0c;结构如下&#xff1a; create table student( id int, name varchar(50), age int, address varchar(100)); 表中的数据…

【解决方案】智能语音模块,东胜物联远场语音解决方案让控制更简单,应用于智能家居等场景

现在的天气真是冷得不想多动一下&#xff0c;又想打开取暖器&#xff1f;有了它&#xff0c;用声音就能遥控&#xff0c;今天我们就来聊聊智能语音模块。 技术概述 远场语音技术&#xff0c;采用了麦克风阵列、信号处理技术以及先进的语音识别引擎&#xff0c;使得设备能够在距…

C++ DAY2作业

1.课堂struct练习&#xff0c;用class&#xff1b; #include <iostream>using namespace std;class Stu { private:int age;char sex;int high; public:double score;void set_values(int a,char b,int c,double d);int get_age();char get_sex();int get_high(); }; vo…

Java开发框架和中间件面试题(8)

目录 82.Mybatis一级缓存&#xff0c;二级缓存&#xff1f; 83.Mybatis如何防止SQL注入&#xff1f; 84.mybatis中resultType和resultMap有什么区别&#xff1f; 85.如何在SpringBoot中禁用Actuator断点安全性&#xff1f; 86.什么是SpringBoot&#xff1f;SpringBoot有哪些…

go 使用 - sync.Metux

[TOC]&#xff08;sync.metux 使用&#xff09; 简介 简述使用metux使用的方法&#xff0c; 使用的注意点&#xff0c; 以及使用情况使用方法 提供的方法 Lock() 方法用于获取锁 Unlock() 方法用于释放锁 TryLock()方法尝试获取锁 对共享资源进行加锁&#xff0c; 例 &#…

数据库(Database)基础知识

什么是数据库 数据库是按照数据结构来组织、存储和管理数据的仓库&#xff0c;用户可以通过数据库管理系统对存储的数据进行增删改查操作。 数据库实际上是一个文件集合&#xff0c;本质就是一个文件系统&#xff0c;以文件的方式&#xff0c;将数据保存在电脑上。 什么是数据…

阿里云 ACK 云上大规模 Kubernetes 集群高可靠性保障实战

作者&#xff1a;贤维 马建波 古九 五花 刘佳旭 引言 2023 年 7 月&#xff0c;阿里云容器服务 ACK 成为首批通过中国信通院“云服务稳定运行能力-容器集群稳定性”评估的产品&#xff0c; 并荣获“先进级”认证。随着 ACK 在生产环境中的采用率越来越高&#xff0c;稳定性保…

leaflet学习笔记-地图图层控制(二)

图层介绍 Leaflet的地图图层控件可控制两类图层&#xff1a;一类是底图图层&#xff08;Base Layers&#xff09;&#xff0c;一次只能选择一个图层作为地图的背景图层&#xff0c;即底图图层&#xff0c;在地图图层控件中用单选按钮控制&#xff1b;另一类是覆盖图层&#xff…

大数据与人工智能|信息技术产业架构、行业发展与前沿技术(第2节)

内容链接&#xff1a;信息技术产业架构、行业发展与前沿技术&#xff08;大数据与人工智能系列课程 第2节&#xff09; 声明&#xff1a;学习使用&#xff0c;侵权必删&#xff01; 主要内容&#xff1a;1. 从算盘到量子计算机&#xff0c;介绍了半导体行业的发展历程和技术原…

吓一跳!哈佛大学最受欢迎的课程,我不敢相信我的眼睛!

文件销毁、硬盘销毁、数据销毁以及物料销毁是四个相互关联且在企业或组织运营中至关重要的环节。这四个方面都涉及信息安全和保密管理的核心内容&#xff0c;关乎企业的商业秘密、客户的个人信息以及各种敏感数据的保护。随着信息化和数字化的快速发展&#xff0c;如何安全、有…

thinkcmf 文件包含 x1.6.0-x2.2.3 已亲自复现

thinkcmf 文件包含 x1.6.0-x2.2.3 CVE-2019-16278 已亲自复现 漏洞名称漏洞描述影响版本 漏洞复现环境搭建漏洞利用 修复建议总结 漏洞名称 漏洞描述 ThinkCMF是一款基于PHPMYSQL开发的中文内容管理框架&#xff0c;底层采用ThinkPHP3.2.3构建。ThinkCMF提出灵活的应用机制&a…