日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

springmvc DispatchServlet初始化九大加载策略(一)

發(fā)布時(shí)間:2025/4/16 c/c++ 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 springmvc DispatchServlet初始化九大加载策略(一) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

由于篇幅較長(zhǎng),因此分三篇進(jìn)行講解:

springmvc DispatchServlet初始化九大加載策略(一)

springmvc DispatchServlet初始化九大加載策略(二)

springmvc DispatchServlet初始化九大加載策略(三)

?

正文

SpringMVC 容器初始化時(shí),

protected void onRefresh(ApplicationContext context) {this.initStrategies(context); }protected void initStrategies(ApplicationContext context) {this.initMultipartResolver(context);this.initLocaleResolver(context);this.initThemeResolver(context);this.initHandlerMappings(context);this.initHandlerAdapters(context);this.initHandlerExceptionResolvers(context);this.initRequestToViewNameTranslator(context);this.initViewResolvers(context);this.initFlashMapManager(context); }

 

?

1. initMultipartResolver 文件上傳

源碼:

this.multipartResolver = (MultipartResolver)context.getBean("multipartResolver", MultipartResolver.class);

MultipartResolver接口定義如下:

public interface MultipartResolver {// 檢查請(qǐng)求頭是否包含文件流上傳boolean isMultipart(HttpServletRequest var1);// 文件流上傳請(qǐng)求解析方法,解析后封裝在 MultipartHttpServletRequest 對(duì)象中MultipartHttpServletRequest resolveMultipart(HttpServletRequest var1) throws MultipartException;//void cleanupMultipart(MultipartHttpServletRequest var1); }

我們知道,相應(yīng)的請(qǐng)求會(huì)被DispatchServlet的doDispatch方法攔截,doDispatch方法中共首先就會(huì)調(diào)用checkMultipart方法檢查請(qǐng)求是否是包含文件流:

protected HttpServletRequest checkMultipart(HttpServletRequest request) throws MultipartException {if (this.multipartResolver != null && this.multipartResolver.isMultipart(request)) {if (WebUtils.getNativeRequest(request, MultipartHttpServletRequest.class) != null) {this.logger.debug("...");} else if (this.hasMultipartException(request)) {this.logger.debug("...");} else {try {// 具體的文件流解析方法return this.multipartResolver.resolveMultipart(request);...
}  

配置例子

CommonsFileUploadSupport實(shí)現(xiàn)了 MultipartResolver 接口

//上傳文件配置 @Bean(name = "multipartResolver") public CommonsFileUploadSupport commonsFileUploadSupport(){CommonsFileUploadSupport resolver = new CommonsMultipartResolver();resolver.setMaxInMemorySize(40960);resolver.setMaxUploadSize(10485760000L);return resolver; }

  

?

2. initLocaleResolver 國(guó)際化

DispatcherServlet.properties文件:

org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolverorg.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolverorg.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMappingorg.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapterorg.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver,\org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolverorg.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslatororg.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolverorg.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager

DispatchServlet中定義一個(gè)靜態(tài)的容器初始化默認(rèn)defaultStrategies方法塊,如果用戶沒(méi)有自定義的話,就使用默認(rèn)的,

static {// Load default strategy implementations from properties file.// This is currently strictly internal and not meant to be customized// by application developers.try {ClassPathResource resource = new ClassPathResource(DEFAULT_STRATEGIES_PATH, DispatcherServlet.class);defaultStrategies = PropertiesLoaderUtils.loadProperties(resource);}catch (IOException ex) {throw new IllegalStateException("Could not load '" + DEFAULT_STRATEGIES_PATH + "': " + ex.getMessage());} }

流程:

1. this.localeResolver = getDefaultStrategy(context, LocaleResolver.class);2. List<T> strategies = getDefaultStrategies(context, strategyInterface)3. String key = strategyInterface.getName();String value = defaultStrategies.getProperty(key);// 如果value不為空, 將value轉(zhuǎn)換為class類(lèi)名稱(chēng),然后在容器了創(chuàng)建對(duì)象Object strategy = this.createDefaultStrategy(context, clazz);

pringMVC國(guó)際化提供了四個(gè)國(guó)際化的實(shí)現(xiàn)的類(lèi)AcceptHeaderLocaleResolver(默認(rèn)),FixedLocaleResolver、CookieLocaleResolver和SessionLocaleResolver。

?

?

3. initThemeResolver 主題

主題的實(shí)現(xiàn)原理:大概就是把網(wǎng)站版面的css樣式表和圖片之類(lèi)的文件和網(wǎng)站的程序進(jìn)行解耦,程序讀取theme的持久化配置,然后找到相應(yīng)的css樣式表和圖片,配置網(wǎng)站版面。

要在程序中使用主題,必須設(shè)置一個(gè)org.springframework.ui.context.ThemeSource的實(shí)現(xiàn)類(lèi)。SpringMVC IOC容器本身實(shí)現(xiàn)了ThemeSource,這個(gè)類(lèi)只是簡(jiǎn)單的把責(zé)任代理給了一個(gè)特定的實(shí)現(xiàn)類(lèi),默認(rèn)情況下這個(gè)代理類(lèi)是:org.springframework.ui.context.support.ResourceBundleThemeSource,這個(gè)實(shí)現(xiàn)類(lèi)可以從classpath目錄下載入一個(gè)properties文件。如設(shè)置setBasenamePrefix、setDefaultEncoding等。

原理(實(shí)踐)

如:SpringMVC中一套主題對(duì)應(yīng)一個(gè)cool.properties文件,該文件在classpath根目錄下, 這個(gè)文件列出了主題組成的資源:

styleSheet=/themes/cool/style.css background=/themes/cool/img/coolBg.jpg

properties文件中的key是指視圖文件中元素的名稱(chēng),value值主題存放的位置。jsp中可以通過(guò)jsp文件可以通過(guò)spring:theme來(lái)訪問(wèn)這個(gè)key,然后找到value(對(duì)應(yīng)的主題)。

ResourceBundleThemeSourceuses(默認(rèn)的ThemeSource)的作用是根據(jù)主題名找到具體的主題,這個(gè)例子中就是找到配置文件themedemo.properties中的,默認(rèn)情況下ResourceBundleThemeSource使用空的前綴名稱(chēng),所以,classpath根目錄下的properties文件會(huì)被載入。如果想制定位置,則可以使用basenamePrefix。

找到主題文件后,如何去解析?此時(shí)就出現(xiàn)了ThemeResolver。

SpringMVC中有實(shí)現(xiàn)主題類(lèi)有3個(gè):

  • FixedThemeResolver(默認(rèn)):固定格式的theme,不能在系統(tǒng)運(yùn)行時(shí)動(dòng)態(tài)更改theme。

  • SessionThemeResolver:可在運(yùn)行中通過(guò)更改cookie中的相應(yīng)的key值來(lái)動(dòng)態(tài)調(diào)整theme的值。

  • CookieThemeResolver:可在運(yùn)行中通過(guò)更改session中的相應(yīng)的key值來(lái)動(dòng)態(tài)調(diào)整theme的值

  • 主題加載策略和initLocaleResolver類(lèi)似,也是如果用戶沒(méi)有自定義就采用默認(rèn)的方式。默認(rèn)的方式為FixedThemeResolver。

    一個(gè)例子:

    application context .xml配置文件:

    <bean class="org.springframework.ui.context.support.ResourceBundleThemeSource" id="themeSource"> <property name="basenamePrefix" value="themes/"></property> </bean> <bean id="themeResolver" class="org.springframework.web.servlet.theme.SessionThemeResolver"> <property name="defaultThemeName" value="red" /> </bean>

    簡(jiǎn)單敘述為:ThemeResolver找到themes/目錄下的所有properties中,然后SessionThemeResolver在發(fā)生改變主題請(qǐng)求后來(lái)解析主題。

    附:如果需要根據(jù)用戶請(qǐng)求來(lái)改變主題,則需要使用ThemeChangeInterceptor攔截器來(lái)改變主題。(攔截器有關(guān)的知識(shí)可以看本文下面的handlerMapping)

    參考:

    https://www.xuebuyuan.com/zh-tw/1578077.html

    https://blog.csdn.net/u012410733/article/details/52915063

    ?

    轉(zhuǎn)載于:https://www.cnblogs.com/chenjunjie12321/p/9357668.html

    總結(jié)

    以上是生活随笔為你收集整理的springmvc DispatchServlet初始化九大加载策略(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。