2.The DispatcherServlet

The DispatcherServlet

Spring的Web MVC框架与许多其他Web MVC框架一样,是请求驱动的,围绕一个中央Servlet(即DispatcherServlet)设计,该Servlet将请求分派给控制器,并提供其他功能以促进Web应用程序的开发。然而,Spring的DispatcherServlet不仅仅是请求分派器,它与Spring的IoC容器完全集成,因此可以使用Spring的所有其他特性。

请求处理工作流

Spring Web MVC的DispatcherServlet的请求处理工作流如下图所示:

  1. 客户端发送请求:用户通过浏览器发送一个HTTP请求。
  2. DispatcherServlet接收请求:请求到达中央的DispatcherServlet,它是整个请求处理的核心。
  3. HandlerMapping:DispatcherServlet使用HandlerMapping确定请求应该发送到哪个处理器(Controller)。
  4. HandlerAdapter:找到合适的Handler后,DispatcherServlet使用HandlerAdapter来执行处理器。
  5. 处理请求:处理器(Controller)处理请求,执行相应的业务逻辑,并返回一个ModelAndView对象,包含模型数据和视图名称。
  6. 视图解析:DispatcherServlet使用ViewResolver将逻辑视图名解析为实际的视图对象(例如JSP页面)。
  7. 生成响应:视图对象负责渲染页面,将模型数据填充到视图中,并生成最终的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 {

    @Override
    public void onStartup(ServletContext container) throws ServletException {
        // 创建并注册DispatcherServlet
        ServletRegistration.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 {

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

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

    @Override
    protected 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/javaee
                             http://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 {
    @Bean
    public DataSource dataSource() {
        // 配置数据源
    }
}

@Configuration
@EnableWebMvc
@ComponentScan("com.example.myapp")
public class WebConfig {
    @Bean
    public 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>

配置解释

  1. 全局上下文 (Root Context)
    • <context-param> 元素配置了全局上下文的配置文件路径:/WEB-INF/root-context.xml。这是通过 ContextLoaderListener 加载的,它创建了一个全局的 Spring 应用上下文(根上下文),这个上下文在整个 Web 应用程序中共享。
  2. DispatcherServlet 专用上下文 (Dispatcher Context)
    • <servlet> 元素配置了 DispatcherServlet,它通常会有自己的专用 Spring 应用上下文,通常被称为子上下文。
    • <init-param> 中的 contextConfigLocation 参数为空(即:<param-value></param-value>),这表示 DispatcherServlet 将不使用单独的配置文件,而是继承全局上下文(根上下文)的配置。

具体作用

  • contextConfigLocation 参数为空时,DispatcherServlet 会默认查找名为 [servlet-name]-servlet.xml 的配置文件。对于此配置,它会查找 dispatcher-servlet.xml
  • 如果该文件不存在,DispatcherServlet 将不使用任何特定于它的配置文件,而是仅依赖于全局上下文(根上下文)。

这种配置的好处

  1. 简化配置
    • 可以避免为 DispatcherServlet 创建额外的配置文件,简化配置管理。
  2. 共享全局配置
    • DispatcherServlet 直接使用根上下文的配置,使得全局 bean 定义可以被 DispatcherServlet 使用,减少重复配置。

WebApplicationContext 是 ApplicationContext 的扩展,专门为 Web 应用程序提供额外的功能。它与普通的 ApplicationContext 不同之处在于:

  1. 主题解析: WebApplicationContext 能够解析和管理主题(themes),主题是定义 Web 应用程序外观和感觉的静态资源集合,如 CSS 和图片等。

  2. 与 Servlet 的关联: WebApplicationContext 能够知道它所关联的 Servlet。这通过与 ServletContext 的链接实现,ServletContext 提供了对 Web 应用程序资源和配置的访问。

  3. 绑定在 ServletContext 中: WebApplicationContext 被绑定在 ServletContext 中,因此可以在整个 Web 应用程序的生命周期中访问它。

通过 RequestContextUtils 类的静态方法,你可以随时查找 WebApplicationContext,以便在需要时访问它。

请注意,我们可以通过基于 Java 的配置实现相同的目的:

public class GolfingWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        // GolfingAppConfig defines beans that would be in root-context.xml
        return new Class<?>[] { GolfingAppConfig.class };
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        // GolfingWebConfig defines beans that would be in golfing-servlet.xml
        return new Class<?>[] { GolfingWebConfig.class };
    }

    @Override
    protected 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 typeExplanation
HandlerMappingMaps 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.
HandlerAdapterHelps 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.
HandlerExceptionResolverMaps exceptions to views also allowing for more complex exception handling code.
ViewResolverResolves logical String-based view names to actual View types.
LocaleResolver & LocaleContextResolverResolves the locale a client is using and possibly their time zone, in order to be able to offer internationalized views
ThemeResolverResolves themes your web application can use, for example, to offer personalized layouts
MultipartResolverParses multi-part requests for example to support processing file uploads from HTML forms.
FlashMapManagerStores 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 类型默认实现类
------------------------------------------------------------------------------------
HandlerMappingBeanNameUrlHandlerMappingRequestMappingHandlerMapping
HandlerAdapterHttpRequestHandlerAdapterRequestMappingHandlerAdapter
HandlerExceptionResolverDefaultHandlerExceptionResolver
ViewResolverInternalResourceViewResolver
LocaleResolverAcceptHeaderLocaleResolver
ThemeResolverFixedThemeResolver

详细说明

  1. HandlerMapping(处理器映射)

    • BeanNameUrlHandlerMapping:将 URL 请求映射到具有特定名称的 bean。
    • RequestMappingHandlerMapping:基于注解的请求映射,处理使用 @RequestMapping 注解的控制器方法。
  2. HandlerAdapter(处理器适配器)

    • HttpRequestHandlerAdapter:处理实现了 HttpRequestHandler 接口的处理器。
    • RequestMappingHandlerAdapter:处理基于注解的控制器,适配 @RequestMapping 注解的方法。
  3. HandlerExceptionResolver(处理器异常解析器)

    • DefaultHandlerExceptionResolver:默认的异常解析器,处理常见的异常类型,如 NoSuchRequestHandlingMethodExceptionHttpRequestMethodNotSupportedException 等。
  4. ViewResolver(视图解析器)

    • InternalResourceViewResolver:将逻辑视图名称解析为内部资源视图(如 JSP 文件),通过转发请求来渲染视图。
    • 示例:在这里插入图片描述
  5. LocaleResolver(区域解析器)

    • AcceptHeaderLocaleResolver:根据请求头中的 Accept-Language 信息解析区域设置。
  6. ThemeResolver(主题解析器)

    • FixedThemeResolver:使用固定的主题,不支持动态切换主题。

这些默认实现类提供了基础的功能,可以满足大多数 Web 应用程序的需求。如果有特定的需求,可以通过在配置文件中定义自定义的 bean 来覆盖这些默认实现。

Default DispatcherServlet Configuration

  1. 默认配置文件 DispatcherServlet.properties:

    • DispatcherServlet 在 org.springframework.web.servlet 包下的 DispatcherServlet.properties 文件中维护了特殊 bean 的默认实现列表。每种特殊 bean 都有其默认的实现。
  2. 定制特殊 bean:

    • 虽然每种特殊 bean 都有合理的默认设置,但迟早你会需要定制其中一个或多个 bean 的属性。例如,常见的做法是配置 InternalResourceViewResolverprefix 属性,指定视图文件的父路径。
  3. 覆盖默认实现:

    • 当你在 WebApplicationContext 中配置特殊 bean(例如 InternalResourceViewResolver)时,实际上是覆盖了原本会被用作该特殊 bean 类型的默认实现列表。例如,如果配置了 InternalResourceViewResolver,那么默认的 ViewResolver 实现列表就会被忽略。
  4. 其他配置选项:

    • 在第 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 开始按照以下步骤处理请求:

  1. 绑定 WebApplicationContext:

    • DispatcherServlet 首先在请求中查找并绑定 WebApplicationContext。这个 WebApplicationContext 默认以 DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE 作为键名绑定在请求中,控制器和其他处理流程中的元素可以使用它。WebApplicationContext 包含了整个应用程序的配置和 bean 定义。
  2. 绑定 LocaleResolver:

    • LocaleResolver 负责解析请求的区域设置信息,以便在处理请求时确定要使用的语言和文化。如果应用程序不需要国际化支持,可以忽略这一步骤。
  3. 绑定 ThemeResolver:

    • ThemeResolver 负责解析请求的主题信息,允许视图根据请求动态切换和管理不同的视觉主题。如果应用程序不使用主题功能,可以忽略这一步骤。
  4. 处理文件上传(如果需要):

    • 如果配置了 multipart 文件解析器,DispatcherServlet 将检查请求是否包含多部分内容(文件上传)。如果有多部分内容,请求将被包装在 MultipartHttpServletRequest 中,以便其他处理流程进一步处理。关于多部分处理的更多信息,请参见第 22.10 节 “Spring 的多部分(文件上传)支持”。
  5. 查找适当的处理器(Handler):

    • DispatcherServlet 查找与请求匹配的处理器。如果找到处理器,将按照处理器关联的执行链(预处理器、后处理器和控制器)的顺序执行,以准备模型数据或进行渲染。
  6. 渲染视图或处理异常:

    • 如果处理器返回了模型数据,则进行视图渲染。如果处理过程中抛出了异常,那么声明在 WebApplicationContext 中的处理器异常解析器将捕获这些异常,并根据配置的方式处理异常情况,例如返回特定的错误页面或 JSON 响应。
  7. 支持最后修改日期(Last-Modified):

    • DispatcherServlet 还支持根据 Servlet API 指定的最后修改日期返回给客户端。它通过查找适当的处理器映射,并检查找到的处理器是否实现了 LastModified 接口来确定特定请求的最后修改日期。
  8. 自定义 DispatcherServlet:

    • 你可以通过向 web.xml 文件中的 Servlet 声明添加 Servlet 初始化参数(init-param 元素)来定制单个 DispatcherServlet 实例。下表列出了支持的参数列表。

这些步骤和功能说明了 DispatcherServlet 在处理请求时的详细流程,以及如何通过配置和定制来适应应用程序的特定需求。

DispatcherServlet initialization parameters

ParameterExplanation
contextClassClass that implements ConfigurableWebApplicationContext, to be instantiated and locally configured by this Servlet. By default, XmlWebApplicationContext is used.
contextConfigLocationString 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.
namespaceNamespace of the WebApplicationContext. Defaults to [servlet-name]-servlet.

关于 DispatcherServlet 可配置参数的表格及其解释:

参数解释
contextClass实现了 ConfigurableWebApplicationContext 接口的类,将由此 Servlet 实例化并进行本地配置。默认情况下,使用 XmlWebApplicationContext。这个参数允许你指定用于创建 WebApplicationContext 的具体类。
contextConfigLocation传递给上述 contextClass 实例的字符串,指示可以找到上下文(或多个上下文)的位置。这个字符串可以是多个位置,使用逗号作为分隔符。在多个上下文位置的情况下,如果有重复定义的 bean,则以最后一个位置为准。这个参数允许你指定上下文配置文件的位置。
namespaceWebApplicationContext 的命名空间。默认为 [servlet-name]-servlet。这个参数影响 Servlet 创建的 ApplicationContext 的命名空间,用于在 Servlet 容器中唯一标识 ApplicationContext。

这些参数允许你在 web.xml 文件中通过 init-param 元素为单个 DispatcherServlet 实例进行定制配置。通过配置这些参数,你可以控制 DispatcherServlet 如何实例化和配置其关联的 WebApplicationContext,以满足特定应用程序的需求。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实现keepalive+Haproxyde 的高可用

需要准备五台实验机 一台客户机&#xff1a;test1 两台&#xff1a;一主一备的实验机&#xff1a;test2 test3 两台真实服务器&#xff1a;nginx1 nginx2 实验 首先在两台实验机上安装Haproxy 安装依赖环境&#xff0c;并将Haproxy的包进行解压处理 yum install -y pcre…

redis redisson(仅供自己参考)

redis 通过setnx实现的分布式锁有问题 如图&#xff1a; 解决的新的工具为&#xff08;闪亮登场&#xff09;&#xff1a;redisson redisson可重入锁的原理 实现语言lua&#xff1a; 加锁实现脚本语言&#xff1a; 释放锁的脚本语言&#xff1a; 加锁的lua -- 首先判断这个锁…

【算法专题】归并排序

1. 排序数组 912. 排序数组 - 力扣&#xff08;LeetCode&#xff09; 今天我们使用归并排序来对数组进行排序&#xff0c;实际上&#xff0c;归并排序和快速排序是有一定相似之处的&#xff0c;都运用了分而治之的思想提升了排序效率。快速排序的实现思路是每次排序把区间划分…

【Linux】进程间通信——命名管道和共享内存

目录 命名管道&#xff08;named pipe&#xff09; 命令行中使用 代码中使用 共享内存&#xff08;shared memory&#xff09; shmget ipcs命令 shmctl shmat/shmdt 简单通信 命名管道&#xff08;named pipe&#xff09; 之前我们说了匿名管道&#xff0c;但是匿名管道…

Spring-Spring、IoC、DI、注解开发

1、Spring是什么 Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器(框架)。 Spring整体架构 Spring优点&#xff1a; Spring属于低侵入设计。IOC将对象之间的依赖关系交给Spring,降低组件之间的耦合&#xff0c;实现各个层之间的解耦&#xff0c;让我们更专注于业务…

【python】基于随机森林和决策树的鸢尾花分类

目录 引言 决策树&#xff08;Decision Tree&#xff09; 随机森林&#xff08;Random Forest&#xff09; 数据集 结果 代码实现 引言 随机森林&#xff08;Random Forest&#xff09;和决策树&#xff08;Decision Tree&#xff09;是两种在机器学习中广泛使用的分类和…

红色文化3D虚拟数字展馆搭建意义深远

在房地产与土地市场的浪潮中&#xff0c;无论是新城规划、乡村振兴&#xff0c;还是商圈建设&#xff0c;借助VR全景制作、虚拟现实和web3d开发技术打造的全链条无缝VR看房新体验。不仅极大提升了带看与成交的转化率&#xff0c;更让购房者足不出户&#xff0c;即可享受身临其境…

【填坑指南】PHP8报:Unable to load dynamic library ‘zip.so’ 错误

1.原因分析 这种情况多数发生在PHP安装时因为各种原因失败后&#xff0c;残余的库与最后安装的PHP版本不兼容导致的。 2.我的路径 一开始我按照以前摸索出来的安装PHP7.3的成功经验来编译方法安装PHP8.3&#xff0c;发现以前的套路已经失效了。反复重装PHP8.3失败后&#xf…

Sentinel 学习笔记

Sentinel 学习笔记 作者&#xff1a;王珂 邮箱&#xff1a;49186456qq.com 文章目录 Sentinel 学习笔记[TOC] 前言一、基础概念二、Sentinel控制台2.1 安装控制台2.2 簇点链路2.3 请求限流2.4 线程隔离2.5 服务降级2.6 服务熔断 三、Sentinel客户端3.1 原始Jar包客户端3.2 Sp…

python条件

条件语句 if语句 if...else语句 if...elif...else语句 嵌套 is is 是一个身份运算符&#xff0c;用于比较两个对象的身份&#xff0c;即它们在内存中的地址是否相同。这与比较两个对象是否相等的 运算符不同。 运算符比较的是两个对象的值是否相等。 比较对象 比较基本数据…

2024-07-12 Unity AI状态机1 —— 框架介绍

文章目录 1 有限状态机2 状态机实现框架2.1 StateMachine2.2 BaseState2.3 ...State2.4 IAIObject 3 框架类图 本文章参考 B 站唐老狮 2023 年直播内容。点击前往唐老狮 B 站主页。 1 有限状态机 ​ 有限状态机&#xff08;Finite - State Machine&#xff0c;FSM&#xff09…

linux的学习(四):磁盘,进程,定时,软件包的相关命令

简介 关于磁盘管理&#xff0c;进程管理&#xff0c;定时任务&#xff0c;软件包管理的命令的使用 磁盘管理类命令 du du 目录名&#xff1a; 查看文件和目录占用的磁盘空间 参数&#xff1a; -h&#xff1a;可以看到大小的单位&#xff0c;g,mb-a&#xff1a;还可以看到文…

日前光伏功率曲线预测

《利用 2DG&#xff32;A&#xff0d;BiLSTM 模型的日前光伏功率曲线预测方法》 利用2DGRA实现最佳历史相似日数据的获取&#xff0c;根据日功率曲线的波动性将总数据分为3类&#xff08;晴空条件、轻度非晴空条件和重度非晴空条件&#xff09;&#xff0c;根据3种分类&#x…

SpringCloud架构师面试

一、微服务是什么 1、基本概念 微服务是一种架构风格&#xff08;区别于单体架构、垂直架构、分布式架构、SOA架构&#xff09;&#xff0c;应用程序被划分为更小的、流程驱动的服务。 2、微服务的特征 轻量化&#xff1a;将复杂的系统或者服务进行纵向拆分&#xff0c;每个…

【自然语言处理】面向新冠肺炎的社会计算应用

面向新冠肺炎的社会计算应用 1 任务目标 1.1 案例简介 新冠肺炎疫情牵动着我们每一个人的心&#xff0c;在这个案例中&#xff0c;我们将尝试用社会计算的方法对疫情相关的新闻和谣言进行分析&#xff0c;助力疫情信息研究。本次作业为开放性作业&#xff0c;我们提供了疫情…

计算机网络之广域网

广域网特点: 主要提供面向通信的服务&#xff0c;支持用户使用计算机进行远距离的信息交换。 覆盖范围广,通信的距离远&#xff0c;需要考虑的因素增多&#xff0c; 线路的冗余、媒体带宽的利用和差错处理问题。 由电信部门或公司负责组建、管理和维护&#xff0c;并向全社会…

Access denied for user ‘root‘@‘localhost‘ (using password: YES)解决办法

在Spring配置数据源时&#xff0c;当使用Spring容器加载druid.properties数据库连接池配置文件时&#xff0c;容易碰到create connection SQLException, url: jdbc:mysql://127.0.0.1:3306/mydbs, errorCode 1045, state 28000 java.sql.SQLException: Access denied for user …

在JavaScript中,什么是解构赋值(destructuring assignment)?

聚沙成塔每天进步一点点 本文回顾 ⭐ 专栏简介在JavaScript中&#xff0c;什么是解构赋值&#xff08;destructuring assignment&#xff09;&#xff1f;1. 引言2. 解构赋值的概念3. 数组解构赋值3.1 基本语法3.2 跳过元素3.3 默认值3.4 交换变量值 4. 对象解构赋值4.1 基本语…

springboot系列教程(一):简介与入门案例(含源码)

一、SpringBoot简介 SpringBoot继承了Spring优秀的基因&#xff0c;上手难度小简化配置&#xff0c;提供各种默认配置来简化项目配置内嵌式容器简化Web项目&#xff0c;简化编码 Spring Boot 则会帮助开发着快速启动一个 web 容器&#xff0c;在 Spring Boot 中&#xff0c;只…

React学习笔记03-----手动创建和运行

一、项目创建与运行【手动】 react-scripts集成了webpack、bable、提供测试服务器 1.目录结构 public是静态目录&#xff0c;提供可以供外部直接访问的文件&#xff0c;存放不需要webpack打包的文件&#xff0c;比如静态图片、CSS、JS src存放源码 &#xff08;1&#xff09…