2.The DispatcherServlet
The DispatcherServlet
Spring的Web MVC框架与许多其他Web MVC框架一样,是请求驱动的,围绕一个中央Servlet(即DispatcherServlet)设计,该Servlet将请求分派给控制器,并提供其他功能以促进Web应用程序的开发。然而,Spring的DispatcherServlet不仅仅是请求分派器,它与Spring的IoC容器完全集成,因此可以使用Spring的所有其他特性。
请求处理工作流
Spring Web MVC的DispatcherServlet的请求处理工作流如下图所示:
- 客户端发送请求:用户通过浏览器发送一个HTTP请求。
- DispatcherServlet接收请求:请求到达中央的DispatcherServlet,它是整个请求处理的核心。
- HandlerMapping:DispatcherServlet使用HandlerMapping确定请求应该发送到哪个处理器(Controller)。
- HandlerAdapter:找到合适的Handler后,DispatcherServlet使用HandlerAdapter来执行处理器。
- 处理请求:处理器(Controller)处理请求,执行相应的业务逻辑,并返回一个ModelAndView对象,包含模型数据和视图名称。
- 视图解析:DispatcherServlet使用ViewResolver将逻辑视图名解析为实际的视图对象(例如JSP页面)。
- 生成响应:视图对象负责渲染页面,将模型数据填充到视图中,并生成最终的HTTP响应返回给客户端。
The request processing workflow in Spring Web MVC (high level)
DispatcherServlet的设计模式
熟悉设计模式的读者会认识到,DispatcherServlet是"前端控制器"(Front Controller)设计模式的一种表达方式。这个模式在许多领先的Web框架中都很常见。
前端控制器(Front Controller)设计模式
前端控制器设计模式的核心思想是使用一个中央控制器来处理所有的请求,然后根据请求的不同,将其分派给适当的处理器。这种模式的优势在于:
- 集中控制:所有请求通过一个入口点进行处理,方便进行统一的安全检查、日志记录和异常处理。
- 模块化设计:请求处理逻辑被分散到不同的控制器中,使得代码更加模块化和可维护。
- 灵活性:可以根据不同的请求类型或URL模式灵活地选择合适的处理器进行处理。
配置DispatcherServlet
在Java EE Servlet 3.0+环境中配置Spring的DispatcherServlet,可以通过标准的Java EE Servlet配置来实现。DispatcherServlet是一个实际的Servlet(它继承自HttpServlet基类),因此需要在Web应用程序中声明,并通过URL映射来处理特定的请求。
1. 使用代码配置DispatcherServlet
首先,实现WebApplicationInitializer
接口,以便在Servlet容器启动时进行配置。
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;
import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.servlet.DispatcherServlet;public class MyWebApplicationInitializer implements WebApplicationInitializer {@Overridepublic void onStartup(ServletContext container) throws ServletException {// 创建并注册DispatcherServletServletRegistration.Dynamic registration = container.addServlet("example", new DispatcherServlet());registration.setLoadOnStartup(1);registration.addMapping("/example/*");}
}
在上述代码中,所有以/example
开头的请求将由名为example
的DispatcherServlet实例处理。
2. 使用AbstractAnnotationConfigDispatcherServletInitializer
配置DispatcherServlet
这是Spring MVC推荐的设置方式,简化了DispatcherServlet的注册过程,只需指定其Servlet映射和配置类。
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class[] { RootConfig.class };}@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class[] { WebConfig.class };}@Overrideprotected String[] getServletMappings() {return new String[] { "/example/*" };}
}
3. 使用web.xml
配置DispatcherServlet
如果更喜欢使用传统的web.xml
文件,可以如下配置DispatcherServlet:
<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/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_3_0.xsd"version="3.0"><servlet><servlet-name>example</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>example</servlet-name><url-pattern>/example/*</url-pattern></servlet-mapping>
</web-app>
ApplicationContext和WebApplicationContext
在Spring Web MVC框架中,每个DispatcherServlet都有其自己的WebApplicationContext
,它继承了根WebApplicationContext
中已经定义的所有bean。
- 根WebApplicationContext:包含所有需要在整个应用程序中共享的基础设施bean,如数据源、事务管理器等。
- WebApplicationContext:特定于每个DispatcherServlet,可以在此范围内覆盖根上下文中的bean,并定义新的特定于Servlet实例的bean。
例如:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RootConfig {@Beanpublic DataSource dataSource() {// 配置数据源}
}@Configuration
@EnableWebMvc
@ComponentScan("com.example.myapp")
public class WebConfig {@Beanpublic ViewResolver viewResolver() {// 配置视图解析器}
}
在上述配置中,RootConfig
类中的bean将在根WebApplicationContext
中共享,而WebConfig
类中的bean仅在特定的WebApplicationContext
中可用。
总结
通过以上方法,可以在Servlet 3.0+环境中配置Spring的DispatcherServlet。推荐使用代码配置方式,尤其是通过AbstractAnnotationConfigDispatcherServletInitializer
,因为它更加简洁和灵活。同时,理解根WebApplicationContext
与每个DispatcherServlet的WebApplicationContext
之间的关系,有助于更好地组织和管理Spring应用程序中的bean。
Typical context hierarchy in Spring Web MVC(Spring Web MVC的典型上下文层次结构)
在初始化 DispatcherServlet 时,Spring MVC 会在您的 Web 应用程序的 WEB-INF 目录中寻找一个名为 [servlet-name]-servlet.xml 的文件,并创建其中定义的 bean。如果某个 bean 在全局范围内已经定义过了,那么在这个 servlet 特定的上下文中的定义会覆盖全局范围内的定义。这种机制允许每个 DispatcherServlet 都可以拥有自己独立的配置和 bean 定义,以满足特定于 DispatcherServlet 的需求。
请考虑以下 Servlet 配置(在文件中):DispatcherServlet``web.xml
<web-app><servlet><servlet-name>golfing</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>golfing</servlet-name><url-pattern>/golfing/*</url-pattern></servlet-mapping>
</web-app>
根据上述Servlet配置,需要在应用程序中拥有一个名为 /WEB-INF/golfing-servlet.xml
的文件。这个文件将包含所有Spring Web MVC特定的组件(bean),例如控制器、视图解析器等等。
对于单个DispatcherServlet场景,也可以只有一个根上下文。根上下文中的bean可以被多个DispatcherServlet实例共享使用,这在应用程序需要多个DispatcherServlet处理不同URL模式时很有用。
Single root context in Spring Web MVC
这可以通过设置一个空的 contextConfigLocation servlet init 参数来配置, 如下所示:
<web-app><context-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/root-context.xml</param-value></context-param><servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value></param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>dispatcher</servlet-name><url-pattern>/*</url-pattern></servlet-mapping><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>
</web-app>
配置解释
- 全局上下文 (Root Context):
<context-param>
元素配置了全局上下文的配置文件路径:/WEB-INF/root-context.xml
。这是通过ContextLoaderListener
加载的,它创建了一个全局的 Spring 应用上下文(根上下文),这个上下文在整个 Web 应用程序中共享。
- DispatcherServlet 专用上下文 (Dispatcher Context):
<servlet>
元素配置了DispatcherServlet
,它通常会有自己的专用 Spring 应用上下文,通常被称为子上下文。<init-param>
中的contextConfigLocation
参数为空(即:<param-value></param-value>
),这表示DispatcherServlet
将不使用单独的配置文件,而是继承全局上下文(根上下文)的配置。
具体作用
- 当
contextConfigLocation
参数为空时,DispatcherServlet
会默认查找名为[servlet-name]-servlet.xml
的配置文件。对于此配置,它会查找dispatcher-servlet.xml
。 - 如果该文件不存在,
DispatcherServlet
将不使用任何特定于它的配置文件,而是仅依赖于全局上下文(根上下文)。
这种配置的好处
- 简化配置
- 可以避免为
DispatcherServlet
创建额外的配置文件,简化配置管理。
- 可以避免为
- 共享全局配置
DispatcherServlet
直接使用根上下文的配置,使得全局 bean 定义可以被DispatcherServlet
使用,减少重复配置。
WebApplicationContext 是 ApplicationContext 的扩展,专门为 Web 应用程序提供额外的功能。它与普通的 ApplicationContext 不同之处在于:
-
主题解析: WebApplicationContext 能够解析和管理主题(themes),主题是定义 Web 应用程序外观和感觉的静态资源集合,如 CSS 和图片等。
-
与 Servlet 的关联: WebApplicationContext 能够知道它所关联的 Servlet。这通过与 ServletContext 的链接实现,ServletContext 提供了对 Web 应用程序资源和配置的访问。
-
绑定在 ServletContext 中: WebApplicationContext 被绑定在 ServletContext 中,因此可以在整个 Web 应用程序的生命周期中访问它。
通过 RequestContextUtils 类的静态方法,你可以随时查找 WebApplicationContext,以便在需要时访问它。
请注意,我们可以通过基于 Java 的配置实现相同的目的:
public class GolfingWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {@Overrideprotected Class<?>[] getRootConfigClasses() {// GolfingAppConfig defines beans that would be in root-context.xmlreturn new Class<?>[] { GolfingAppConfig.class };}@Overrideprotected Class<?>[] getServletConfigClasses() {// GolfingWebConfig defines beans that would be in golfing-servlet.xmlreturn new Class<?>[] { GolfingWebConfig.class };}@Overrideprotected String[] getServletMappings() {return new String[] { "/golfing/*" };}
}
Special Bean Types In the WebApplicationContext
在Spring MVC中,DispatcherServlet 使用特殊的 bean 来处理请求并渲染适当的视图。这些特殊的 bean 是 Spring MVC 的一部分。你可以通过在 WebApplicationContext 中配置其中一个或多个来选择使用哪些特殊的 bean。但是,最初你不需要这样做,因为如果没有配置任何特殊的 bean,Spring MVC 会使用默认的一组 bean。下面是列出的一些特殊 bean 类型及其功能:
Special bean types in the WebApplicationContext
Bean type | Explanation |
---|---|
HandlerMapping | Maps incoming requests to handlers and a list of pre- and post-processors (handler interceptors) based on some criteria the details of which vary by HandlerMapping implementation. The most popular implementation supports annotated controllers but other implementations exists as well. |
HandlerAdapter | Helps the DispatcherServlet to invoke a handler mapped to a request regardless of the handler is actually invoked. For example, invoking an annotated controller requires resolving various annotations. Thus the main purpose of a HandlerAdapter is to shield the DispatcherServlet from such details. |
HandlerExceptionResolver | Maps exceptions to views also allowing for more complex exception handling code. |
ViewResolver | Resolves logical String-based view names to actual View types. |
LocaleResolver & LocaleContextResolver | Resolves the locale a client is using and possibly their time zone, in order to be able to offer internationalized views |
ThemeResolver | Resolves themes your web application can use, for example, to offer personalized layouts |
MultipartResolver | Parses multi-part requests for example to support processing file uploads from HTML forms. |
FlashMapManager | Stores and retrieves the “input” and the “output” FlashMap that can be used to pass attributes from one request to another, usually across a redirect. |
这里是中文形式的表格:
Bean 类型 | 描述 |
---|---|
HandlerMapping | 确定请求如何映射到具体的处理器(控制器)。 |
HandlerAdapter | 调用选定的处理器来处理请求。 |
HandlerExceptionResolver | 解析处理器(控制器)抛出的异常,并提供适当的处理方式(例如错误页面或 JSON 响应)。 |
ViewResolver | 将逻辑视图名称解析为实际的视图对象(如 JSP、Thymeleaf、Freemarker 等),并处理视图的渲染。 |
LocaleResolver | 解析客户端请求的区域信息,使应用程序能够提供语言和文化特定的内容。 |
ThemeResolver | 解析客户端请求的主题信息,允许动态切换和管理不同的视觉主题。 |
Bean 类型 | 默认实现类 |
------------------------ | ------------------------------------------------------------ |
HandlerMapping | BeanNameUrlHandlerMapping 和 RequestMappingHandlerMapping |
HandlerAdapter | HttpRequestHandlerAdapter 和 RequestMappingHandlerAdapter |
HandlerExceptionResolver | DefaultHandlerExceptionResolver |
ViewResolver | InternalResourceViewResolver |
LocaleResolver | AcceptHeaderLocaleResolver |
ThemeResolver | FixedThemeResolver |
详细说明
-
HandlerMapping(处理器映射):
BeanNameUrlHandlerMapping
:将 URL 请求映射到具有特定名称的 bean。RequestMappingHandlerMapping
:基于注解的请求映射,处理使用@RequestMapping
注解的控制器方法。
-
HandlerAdapter(处理器适配器):
HttpRequestHandlerAdapter
:处理实现了HttpRequestHandler
接口的处理器。RequestMappingHandlerAdapter
:处理基于注解的控制器,适配@RequestMapping
注解的方法。
-
HandlerExceptionResolver(处理器异常解析器):
DefaultHandlerExceptionResolver
:默认的异常解析器,处理常见的异常类型,如NoSuchRequestHandlingMethodException
、HttpRequestMethodNotSupportedException
等。
-
ViewResolver(视图解析器):
InternalResourceViewResolver
:将逻辑视图名称解析为内部资源视图(如 JSP 文件),通过转发请求来渲染视图。- 示例:
-
LocaleResolver(区域解析器):
AcceptHeaderLocaleResolver
:根据请求头中的Accept-Language
信息解析区域设置。
-
ThemeResolver(主题解析器):
FixedThemeResolver
:使用固定的主题,不支持动态切换主题。
这些默认实现类提供了基础的功能,可以满足大多数 Web 应用程序的需求。如果有特定的需求,可以通过在配置文件中定义自定义的 bean 来覆盖这些默认实现。
Default DispatcherServlet Configuration
-
默认配置文件 DispatcherServlet.properties:
- DispatcherServlet 在
org.springframework.web.servlet
包下的DispatcherServlet.properties
文件中维护了特殊 bean 的默认实现列表。每种特殊 bean 都有其默认的实现。
- DispatcherServlet 在
-
定制特殊 bean:
- 虽然每种特殊 bean 都有合理的默认设置,但迟早你会需要定制其中一个或多个 bean 的属性。例如,常见的做法是配置
InternalResourceViewResolver
的prefix
属性,指定视图文件的父路径。
- 虽然每种特殊 bean 都有合理的默认设置,但迟早你会需要定制其中一个或多个 bean 的属性。例如,常见的做法是配置
-
覆盖默认实现:
- 当你在 WebApplicationContext 中配置特殊 bean(例如
InternalResourceViewResolver
)时,实际上是覆盖了原本会被用作该特殊 bean 类型的默认实现列表。例如,如果配置了InternalResourceViewResolver
,那么默认的ViewResolver
实现列表就会被忽略。
- 当你在 WebApplicationContext 中配置特殊 bean(例如
-
其他配置选项:
- 在第 22.16 节 “Configuring Spring MVC” 中,你将了解到配置 Spring MVC 的其他选项,包括 MVC Java 配置和 MVC XML 命名空间。这些选项为配置 Spring MVC 提供了简单的起点,假设你对 Spring MVC 的工作原理了解不多。不论你如何选择配置你的应用程序,本节中解释的概念都是基础且有益的。
总结来说,这段话强调了在配置 Spring MVC 应用程序时,理解和定制 DispatcherServlet 的特殊 bean 是至关重要的。通过配置特殊 bean,你可以根据应用程序的需求修改默认的行为,并控制请求处理和视图解析的细节。
DispatcherServlet Processing Sequence
当设置好 DispatcherServlet 并且接收到该 DispatcherServlet 的请求时,DispatcherServlet 开始按照以下步骤处理请求:
-
绑定 WebApplicationContext:
- DispatcherServlet 首先在请求中查找并绑定 WebApplicationContext。这个 WebApplicationContext 默认以
DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE
作为键名绑定在请求中,控制器和其他处理流程中的元素可以使用它。WebApplicationContext 包含了整个应用程序的配置和 bean 定义。
- DispatcherServlet 首先在请求中查找并绑定 WebApplicationContext。这个 WebApplicationContext 默认以
-
绑定 LocaleResolver:
- LocaleResolver 负责解析请求的区域设置信息,以便在处理请求时确定要使用的语言和文化。如果应用程序不需要国际化支持,可以忽略这一步骤。
-
绑定 ThemeResolver:
- ThemeResolver 负责解析请求的主题信息,允许视图根据请求动态切换和管理不同的视觉主题。如果应用程序不使用主题功能,可以忽略这一步骤。
-
处理文件上传(如果需要):
- 如果配置了 multipart 文件解析器,DispatcherServlet 将检查请求是否包含多部分内容(文件上传)。如果有多部分内容,请求将被包装在 MultipartHttpServletRequest 中,以便其他处理流程进一步处理。关于多部分处理的更多信息,请参见第 22.10 节 “Spring 的多部分(文件上传)支持”。
-
查找适当的处理器(Handler):
- DispatcherServlet 查找与请求匹配的处理器。如果找到处理器,将按照处理器关联的执行链(预处理器、后处理器和控制器)的顺序执行,以准备模型数据或进行渲染。
-
渲染视图或处理异常:
- 如果处理器返回了模型数据,则进行视图渲染。如果处理过程中抛出了异常,那么声明在 WebApplicationContext 中的处理器异常解析器将捕获这些异常,并根据配置的方式处理异常情况,例如返回特定的错误页面或 JSON 响应。
-
支持最后修改日期(Last-Modified):
- DispatcherServlet 还支持根据 Servlet API 指定的最后修改日期返回给客户端。它通过查找适当的处理器映射,并检查找到的处理器是否实现了 LastModified 接口来确定特定请求的最后修改日期。
-
自定义 DispatcherServlet:
- 你可以通过向 web.xml 文件中的 Servlet 声明添加 Servlet 初始化参数(init-param 元素)来定制单个 DispatcherServlet 实例。下表列出了支持的参数列表。
这些步骤和功能说明了 DispatcherServlet 在处理请求时的详细流程,以及如何通过配置和定制来适应应用程序的特定需求。
DispatcherServlet initialization parameters
Parameter | Explanation |
---|---|
contextClass | Class that implements ConfigurableWebApplicationContext , to be instantiated and locally configured by this Servlet. By default, XmlWebApplicationContext is used. |
contextConfigLocation | String that is passed to the context instance (specified by contextClass ) to indicate where context(s) can be found. The string consists potentially of multiple strings (using a comma as a delimiter) to support multiple contexts. In case of multiple context locations with beans that are defined twice, the latest location takes precedence. |
namespace | Namespace of the WebApplicationContext . Defaults to [servlet-name]-servlet . |
关于 DispatcherServlet 可配置参数的表格及其解释:
参数 | 解释 |
---|---|
contextClass | 实现了 ConfigurableWebApplicationContext 接口的类,将由此 Servlet 实例化并进行本地配置。默认情况下,使用 XmlWebApplicationContext 。这个参数允许你指定用于创建 WebApplicationContext 的具体类。 |
contextConfigLocation | 传递给上述 contextClass 实例的字符串,指示可以找到上下文(或多个上下文)的位置。这个字符串可以是多个位置,使用逗号作为分隔符。在多个上下文位置的情况下,如果有重复定义的 bean,则以最后一个位置为准。这个参数允许你指定上下文配置文件的位置。 |
namespace | WebApplicationContext 的命名空间。默认为 [servlet-name]-servlet 。这个参数影响 Servlet 创建的 ApplicationContext 的命名空间,用于在 Servlet 容器中唯一标识 ApplicationContext。 |
这些参数允许你在 web.xml
文件中通过 init-param
元素为单个 DispatcherServlet 实例进行定制配置。通过配置这些参数,你可以控制 DispatcherServlet 如何实例化和配置其关联的 WebApplicationContext,以满足特定应用程序的需求。
相关文章:

2.The DispatcherServlet
The DispatcherServlet Spring的Web MVC框架与许多其他Web MVC框架一样,是请求驱动的,围绕一个中央Servlet(即DispatcherServlet)设计,该Servlet将请求分派给控制器,并提供其他功能以促进Web应用程序的开发…...

bug定位策略
前提--用户环境层面 hosts异常:hosts文件主要是加快某个域名或者网站的解析速度,从而达到快速访问的作用,也可以屏蔽网站。hosts异常可能会导致部分网页无法访问,能够加载,但是网页无法正常显示;测试环境脏…...

基于R语言的水文、水环境模型优化技术及快速率定方法与多模型案例
在水利、环境、生态、机械以及航天等领域中,数学模型已经成为一种常用的技术手段。同时,为了提高模型的性能,减小模型误用带来的风险;模型的优化技术也被广泛用于模型的使用过程。模型参数的快速优化技术不但涉及到优化本身而且涉…...

内存函数(C语言)
内存函数 以下函数的头文件:string.h 针对内存块进行处理的函数 memcpy 函数原型: void* memcpy(void* destination, const void* source, size_t num);目标空间地址 源空间地址num,被拷贝的字节个数 返回目标空间的起始地…...

力扣 哈希表刷题回顾
哈希表理论总结 什么时候用哈希表,快速判断一个元素是否出现在集合中时,用哈希这种空间换时间的方法。 哈希函数与哈希碰撞 哈希函数是指将key映射到对应的哈希表上 哈希碰撞是指映射的过程中容易出现多对一的情况,用什么方法解决拉链法和…...

Qt 统计图编程
学习目标:Qt 折线图,柱形图和扇形统计图编程 学习基础 Qt QChart 曲线图表操作-CSDN博客 学习内容 Qt中绘制三种常见的图表非常方便, 主要步骤如下: 1. 折线图: - 使用QLineSeries定义折线数据,添加多个坐标点 - 使用QValueAxis创建X轴和Y轴 - 将…...

SQL中的谓词与谓词下推
在 SQL 查询中,谓词(Predicate)是用来对数据进行过滤的条件。它们决定了数据从数据库表中被选择的条件。理解和正确使用 SQL 谓词对于编写高效查询至关重要。 目录 什么是谓词?一个真实的故事SQL 谓词的代码示例比较谓词逻辑谓词…...

浅聊授权-spring security和oauth2
文章目录 前言自定义授权spring security授权oauth2授权概述 前言 通常说到授权,就会想到登录授权、token令牌、JWT等概念,授权。顾名思义就是服务器授予了客户端访问资源的权益,那么要实现授权有几种方案呢,三种授权方式在公司项…...

时间复杂度计算
目录 时间复杂性 ⼤O的渐进表⽰法 时间复杂性 定义:在计算机科学中,算法的时间复杂度是⼀个函数式T(N),它定量描述了该算法的运⾏时间。 时间复杂度是衡量程序的时间效率,那么为什么不去计算程序的运⾏时间呢? 1.…...

React 18 + Babel 7 + Webpack 5 开发环境搭建
文章目录 一、基础开发环境搭建1. 新建项目目录2. 项目目录结构及内容3. 安装 React 18 Babel 7 Webpack 54. 配置 Babel 和 Webpack5. 调试/构建项目 二、扩展项目支持的能力(待补充)1. JS 扩展(待补充)2. CSS 扩展(…...

MongoDB Shard 集群 Docker 部署
MongoDB Shard Docker 部署 部署环境 主机地址主机配置主机系统Mongodb1/192.168.31.1352CPU 4GBDebian12Mongodb2/192.168.31.1092CPU 4GBDebian12Mongodb3/192.168.31.1652CPU 4GBDebian12 镜像版本 mongodb/mongodb-community-server:5.0.27-ubuntu2004 部署集群 部署…...

MacOS 开发 — Packages 程序 macOS新版本 演示选项卡无法显示
MacOS 开发 — Packages 程序 macOS新版本 演示选项卡无法显示 问题描述 : 之前写过 Packages 的使用以及如何打包macOS程序。最近更新了新的macOS系统,发现Packages的演示选项卡无法显示,我尝试从新安转了Packages 也是没作用,…...

Hive的分区表分桶表
1.分区表: 是Hive中的一种表类型,通过将表中的数据划分为多个子集(分区),每个分区对应表中的某个特定的列值,可以提高查询性能和管理数据的效率。分区表的每个分区存储在单独的目录中,分区的定义…...

PostgreSQL17索引优化之支持并行创建BRIN索引
PostgreSQL17索引优化之支持并行创建BRIN索引 最近连续写了几篇关于PostgreSQL17优化器改进的文章,其实感觉还是挺有压力的。对于原理性的知识点,一方面是对这些新功能也不熟悉,为了尽可能对于知识点表述或总结做到准确,因此需要…...

在Vue中,子组件向父组件传递数据
在Vue中,子组件向父组件传递数据通常通过两种方式实现:事件和回调函数。这两种方式允许子组件与其父组件进行通信,传递数据或触发特定的行为。 1. 通过事件传递数据 子组件可以通过触发自定义事件,并将数据作为事件的参数来向父组…...

数据结构(顺序表)
谈起顺序表,那我们就不得不先来了解一下它的上级概念---线性表 线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是⼀种在实际中⼴泛使⽤的数据结构,常⻅的线性表:顺序表、链表、栈、队列…...

MySQL之基本查询(上)-表的增删查改
目录 Create(创建) 案例建表 插入 单行数据 指定列插入 单行数据 全列插入 多行数据 全列插入 插入是否更新 插入时更新 替换 Retrieve(读取) 建表插入 select列 全列查询 指定列查询 查询字段为表达式 为查询结果指定别名 结果去重 where条件 比较运算符 逻辑运…...

RocketMQ源码学习笔记:Producer发送消息流程
这是本人学习的总结,主要学习资料如下 马士兵教育rocketMq官方文档 目录 1、Overview2、验证消息3、查找路由4、选择消息发送队列4.1、选择队列的策略4.2、源码阅读4.2.1、轮询规避4.2.2、故障延迟规避4.2.2.1、计算规避时间4.2.2.2、选择队列 4.2.3、ThreadLocal的…...

kotlin flow collect collectLatest 区别
在 Kotlin 协程库中,collect 和 collectLatest 都是用于收集 Flow 中发射的数据的方法,但它们在处理数据和响应新数据的方式上有所不同。 collect collect 是一个挂起函数,用于收集 Flow 中发射的所有数据。它会按顺序处理每一个发射的数据…...

ELK集群搭建
ELK集群搭建 文章目录 ELK集群搭建1.环境准备2.Elasticsearch环境搭建1.创建es账户并设置密码2.选择对应版本进行下载3.编辑配置文件4.设置JVM堆大小 #7.0默认为4G5.创建es数据及日志存储目录6.修改安装目录和存储目录权限 3.系统优化1.增加最大文件打开数2.增加最大进程数3.增…...

zookeeper+kafka消息队列集群部署
一.消息队列 1、什么是消息队列 消息(Message)是指在应用间传送的数据。消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象。 消息队列(MessageQueue)是一种在软件系统中用…...

LLM_入门指南(零基础搭建大模型)
本文主要介绍大模型的prompt,并且给出实战教程。即使零基础也可以实现大模型的搭建。 内容:初级阶段的修炼心法,帮助凝聚和提升内力,为后续修炼打下基础。 1、prompt 1.1含义和作用 prompt就是提示工程的意思。在大型语言模型中…...

Element Plus 与 Vue 3:构建现代化 Web 应用的完美搭档
引言 Element Plus是基于Vue 3的组件库,它继承了Element UI的优秀基因,为Vue 3应用提供了丰富的界面组件。Element Plus不仅拥有与Element UI相同的高质量组件,还针对Vue 3进行了优化和更新,确保了与Vue 3的无缝集成。 环境准备…...

线程间通信与变量修改感知:几种常用方法
线程间通信与变量修改感知:几种常用方法 1. 使用volatile关键字2. 使用synchronized关键字3. 使用wait/notify/notifyAll机制4. 使用轮询(Polling) 💖The Begin💖点点关注,收藏不迷路💖 在Java…...

前后端通信 —— HTTP/HTTPS
目录 一、HTTP/HTTPS 简介 1、HTTP 2、HTTPS 二、HTTP 工作过程 三、HTTP 消息 1、HTTP消息结构 2、HTTP消息示例 四、HTTP 方法(常用) 1、GET 2、POST 3、PUT 4、DELETE 5、GET与POST对比 五、HTTP 状态码(常用) …...

人工智能 (AI) 应用:一个高精度ASD 诊断和照护支持系统
自闭症谱系障碍(ASD)是一种多方面的神经发育状况,影响全球大约1/100的儿童,而在中国,这一比例高达1.8%(引用自《中国0~6岁儿童孤独症谱系障碍筛查患病现状》),男童为2.6%…...

C# 1.方法
方法组成: 1.修饰符:public一般定义共有的 2.方法返回值:void 无返回值; 非void,可以写成其他类型例如int,float,string,string[]等 3.方法名:Add 大驼峰命名法,每一个首字符大写。…...

【C++进阶学习】第七弹——AVL树——树形结构存储数据的经典模块
二叉搜索树:【C进阶学习】第五弹——二叉搜索树——二叉树进阶及set和map的铺垫-CSDN博客 目录 一、AVL树的概念 二、AVL树的原理与实现 AVL树的节点 AVL树的插入 AVL树的旋转 AVL树的打印 AVL树的检查 三、实现AVL树的完整代码 四、总结 前言:…...

px,em,rem之间的关系换算
px,em,rem之间的换算 px:普通大小 em:相对单位,相对于父元素的字体大小 rem:相对单位,相对于根元素(html)的字体大小 <!DOCTYPE html> <html lang"en"> <head>…...

HTTP——POST请求详情
POST请求 【传输实体文本】向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在POST请求体中。POST 请求可能会导致新的资源的建立或已有资源的修改。 场景: 1. 提交用户注册信息。 2. 提交修改的用户信息。 常见的…...