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 {@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>

配置解釋

  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 {@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 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,以滿足特定應用程序的需求。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/44372.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/44372.shtml
英文地址,請注明出處:http://en.pswp.cn/web/44372.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

創建I/O文件fopen

#include〈stdio.h〉 int mian(int argc,char *argv[]){ FILE *fp;//結構體fp fpfopen&#xff08;“1.txt”&#xff0c;“r”&#xff09;; }

程序的控制結構——if-else語句(雙分支結構)【互三互三】

目錄 &#x1f341; 引言 &#x1f341;if-else語句&#xff08;雙分支結構&#xff09; &#x1f449;格式1&#xff1a; &#x1f449;功能&#xff1a; &#x1f449;程序設計風格提示&#xff1a; &#x1f449;例題 &#x1f449;格式2&#xff1a; &#x1f449;…

Monaco 使用 ColorProvider

Manco 中可以使用調色板對色值進行修改&#xff0c;首先看一下調色版效果。 調色板是 Monaco-Editor 中一個特別的組件&#xff0c;通過兩個方法實現呼出調色板&#xff0c;provideColorPresentations 顯示調色窗口&#xff0c;provideDocumentColors 監聽頁面的變更&#xff0…

如何將libwebsockets庫編譯為x86架構

在之前的文章中&#xff0c;我們已經詳細介紹了如何交叉編譯libwebsockets并將其部署到ELF 1開發板上。然而在調試階段&#xff0c;發現將libwebsockets在Ubuntu環境下編譯為x86架構可能更為方便和高效。 通過在主機環境中編譯運用x86架構下的libwebsockets庫&#xff0c;可以…

阿里ChatSDK使用,開箱即用聊天框

介紹&#xff1a; 效果&#xff1a;智能助理 ChatSDK&#xff0c;是在ChatUI的基礎上&#xff0c;結合阿里云智能客服的最佳實踐&#xff0c;沉淀和總結出來的一個開箱即用的&#xff0c;可快速搭建智能對話機器人的框架。它簡單易上手&#xff0c;通過簡單的配置就能搭建出對…

Flowable工作流引擎核心事件詳細解釋說明

Flowable工作流引擎核心事件詳細解釋說明 流程執行事件 需要了解全部詳細事件的請看這個鏈接Flowable&#xff08;一個開源的工作流和業務流程管理引擎&#xff09;中與事件相關的一些核心概念 流程開始和結束事件 PROCESS_STARTED&#xff1a;標記流程實例的開始。PROCESS…

公益快報 | 中科億海微以企業獎學金為紐帶,深化校企合作

近日&#xff0c;為回報母校、激勵湖南大學機器人視覺感知與控制技術國家工程研究中心廣大學生&#xff0c;中科億海微電子科技&#xff08;蘇州&#xff09;有限公司&#xff08;簡稱“中科億海微”&#xff09;捐贈設立企業獎學金。此項獎學金的設立標志著校企合作邁向全方位…

【C++】C++中struct結構體和class類的區別

在C中&#xff0c; struct 和 class 在很多方面都非常相似&#xff0c;它們都可以包含數據成員&#xff08;變量&#xff09;和成員函數&#xff08;方法&#xff09;。然而&#xff0c;它們之間還是存在一些關鍵的區別&#xff1a; 1. 默認訪問權限 struct 的成員默認是 pub…

實現組件存儲 WinSxS 文件夾解析

目錄 背景 目錄名的組成 解析目錄結構 更新&總結 文章出處鏈接&#xff1a;[https://blog.csdn.net/qq_59075481/article/details/140385969]. 背景 WinSxS 文件夾位于 Windows 文件夾中&#xff0c;例如 C: \Windows\WinSxS。它是 Windows 組件存儲文件的位置。 Wind…

深入理解Spring Boot中的日志框架選擇

深入理解Spring Boot中的日志框架選擇 大家好&#xff0c;我是微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 1. 背景與需求 在開發和運維中&#xff0c;日志是不可或缺的重要組成部分。Spring Boot作為一個流行的Java開…

idea啟動vue項目一直卡死在51%,問題分析及其如何解決

如果你的項目也一直卡在百分之幾十&#xff0c;你可以參考下面的方法&#xff0c;試一試能否解決 問題描述&#xff1a; 通過在idea終端中輸入命令 npm run serve 啟動vue項目&#xff0c;啟動進程一直卡在51% 如何解決&#xff1a; 檢查 < template > 標簽中的html內容…

深度學習中的超參管理方法:argparse模塊

在深度學習方法中我們不可避免地會遇到大量超參數如&#xff08;batch_size、learning_rate等&#xff09;。不同的超參數組合可以得到不同的訓練/測試結果。所以在訓練和測試過程中我們需要不斷調整超參數獲得理想的結果&#xff08;煉丹&#xff09;&#xff0c;如果每一次去…

破解世紀難題:顛覆性方案解鎖世界十大未解之謎

前言 在科學的浩瀚宇宙中&#xff0c;始終存在一些引人入勝的謎題&#xff0c;它們挑戰著人類智慧的極限。這些謎題不僅涵蓋了數學、物理、天文學和生物學等領域&#xff0c;還觸及到意識和宇宙的本質。破解這些世紀難題&#xff0c;不僅意味著人類知識的巨大飛躍&#xff0c;…

【Windows】硬鏈接和軟鏈接(OneDrive同步指定目錄?)

文章目錄 一、場景帶入二、Windows下的硬鏈接和軟鏈接2.1 硬鏈接&#xff08;Hard Link&#xff09;2.2 軟鏈接&#xff08;符號鏈接&#xff0c;Symbolic Link&#xff09;2.3 軟鏈接和快捷方式2.4 應用場景 三、OneDrive中的應用3.1 錯誤姿勢3.2 好像可行的嘗試3.3 合理的解決…

智能貓砂盆兩種類型怎么選?深度剖析熱門前三的品牌!

應該也有很多鏟屎官像我一樣&#xff0c;第一個入手的通常都是封閉式的智能貓砂盆&#xff0c;自動清潔是很好用&#xff0c;但問題也隨之而來。有時候滾筒式的智能貓砂盆會在清潔過程中將砂團摔碎&#xff0c;導致糞便暴露出來產生臭味&#xff0c;這樣我們回來不得不又再次進…

LangChain —— Prompt Templates

文章目錄 一、什么是 Prompt Templates1、String PromptTemplates2、ChatPromptTemplates3、MessagesPlaceholder 留言占位符 二、如何使用 Prompt Templates 一、什么是 Prompt Templates 提示模板有助于將用戶輸入和參數轉換為語言模型的指令。這可用于指導模型的響應&#x…

LangChain框架詳解

LangChain框架詳解 LangChain是一個基于語言模型開發應用程序的強大框架&#xff0c;旨在幫助開發人員簡化與大模型交互、數據檢索以及將不同功能模塊串聯起來以完成復雜任務的過程。它提供了一套豐富的工具、組件和接口&#xff0c;使開發人員能夠輕松構建上下文感知和具備邏…

基于stm32+小程序開發智能家居門禁系統-硬件-軟件實現

視頻演示&#xff1a; 基于stm32智能家居門禁系統小程序開發項目 視頻還有添加刪除卡號&#xff0c;添加刪除指紋&#xff0c;關閉繼電器電源等沒有演示。 代碼Git&#xff1a; https://github.com/Abear6666/stm32lock 總體功能&#xff1a; 本門禁系統主要解鎖功能分別為卡…

沖積圖(alluvial plot)展示競爭性內源RNA(ceRNA)網絡

導讀&#xff1a; 用沖積圖展示ceRNA網絡可以更好地查看競爭和吸附關系&#xff0c;讓靜態的圖&#xff0c;“流動”起來。 沖積圖簡介 Alluvial plot&#xff08;沖積圖&#xff09;是一種流程圖&#xff0c;最初設計用于展示網絡結構隨時間的變化。這種圖表特別適用于展示…

sed的替換可用:斜杠/,豎或|,井號# 等符號, 但是查找只能用斜杠/ , sed的查找和替換可以一起用 筆記240711

sed的替換可用:斜杠/,豎或|,井號# 等符號, 但是… … 查找只能用斜杠/ 替換必須用s開頭, 如:s/ , s| , s# 例如: s/正則/替換內容/s/正則/替換內容/gs|正則|替換內容|s|正則|替換內容|gs#正則#替換內容#s#正則#替換內容#g 當內容包含斜杠/時, (例如路徑) , 使用 豎或|,井號…