偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Spring核心原理分析之MVC九大組件

開(kāi)發(fā) 前端
Spring MVC九大組件在DispatcherServlet的init()方法中初始化,下面我詳細(xì)介紹一下Spring MVC九大組件的名稱和作用。

1 什么是Spring MVC

Spring MVC 是 Spring 提供的一個(gè)基于 MVC 設(shè)計(jì)模式的輕量級(jí) Web 開(kāi)發(fā)框架,本質(zhì)上相當(dāng)于 Servlet。Spring MVC 角色劃分清晰,分工明細(xì)。由于 Spring MVC 本身就是 Spring 框架的一部分,可以說(shuō)和 Spring 框架是無(wú)縫集成。性能方面具有先天的優(yōu)越性,是當(dāng)今業(yè)界最主流的 Web 開(kāi)發(fā)框架,最熱門的開(kāi)發(fā)技能。首先從一個(gè)由Spring提供的DispatcherServlet開(kāi)始,重寫了Serlvet的init()方法、service()方法和destroy()方法,SpringMVC九大組件在DispatcherServlet的init()方法中初始化,在service()方法中執(zhí)行。下面,我們先來(lái)看Spring MVC九大組件的初始化。

2 SpringMVC九大組件名稱解釋

Spring MVC九大組件在DispatcherServlet的init()方法中初始化,下面我詳細(xì)介紹一下Spring MVC九大組件的名稱和作用。

具體詳細(xì)介紹如下:

2.1 MultipartResolver

MultipartResolver是一個(gè)大家很熟悉的組件,用于處理上傳請(qǐng)求,通過(guò)將普通的請(qǐng)求包裝成MultipartHttpServletRequest來(lái)實(shí)現(xiàn)。MultipartHttpServletRequest可以通過(guò)getFile()方法直接獲得文件。如果上傳多個(gè)文件,還可以調(diào)用getFileMap()方法得到 Map< FileName, File> 這樣的結(jié)構(gòu)。MultipartResolver的作用就是封裝普通的請(qǐng)求,使其擁有文件上傳的功能。

2.2 LocaleResolver

ViewResolver組件的resolveViewName()方法需要兩個(gè)參數(shù),一個(gè)是視圖名,另一個(gè)就是Locale。參數(shù)Locale是從哪來(lái)的呢?這就是LocaleResolver組件要做的事。LocaleResolver用于從請(qǐng)求中解析出 Locale,比如在中國(guó)Locale當(dāng)然就是zh-CN,用來(lái)表示一個(gè)區(qū)域。這個(gè)組件也是i18n的基礎(chǔ)。

2.3 ThemeResolver

從名字便可看出,ThemeResolver組件是用來(lái)解析主題的。主題就是樣式、圖片及它們所形成的顯示效果的集合。Spring MVC中一套主題對(duì)應(yīng)一個(gè)properties文件,里面存放著與當(dāng)前主題相關(guān)的所有資源,如圖片、CSS樣式等。創(chuàng)建主題非常簡(jiǎn)單,只需準(zhǔn)備好資源,然后新建一個(gè)“主題名.properties”并將資源設(shè)置進(jìn)去,放在classpath下,之后便可以在頁(yè)面中使用了。Spring MVC中與主題有關(guān)的類有ThemeResolver、ThemeSource和Theme。ThemeResolver負(fù)責(zé)從請(qǐng)求中解析出主題名,ThemeSource則根據(jù)主題名找到具體的主題,其抽象也就是Theme,可以通過(guò)Theme來(lái)獲取主題和具體的資源。

2.4 HandlerMapping

HandlerMapping是用來(lái)查找Handler的,也就是處理器,具體的表現(xiàn)形式可以是類,也可以是方法。比如,標(biāo)注了@RequestMapping的每個(gè)方法都可以看成一個(gè)Handler。Handler負(fù)責(zé)實(shí)際的請(qǐng)求處理,在請(qǐng)求到達(dá)后,HandlerMapping的作用便是找到請(qǐng)求相應(yīng)的處理器Handler和Interceptor。

2.5 HandlerAdapter

從名字上看,HandlerAdapter是一個(gè)適配器。因?yàn)镾pring MVC中Handler可以是任意形式的,只要能夠處理請(qǐng)求便可。但是把請(qǐng)求交給Servlet的時(shí)候,由于Servlet的方法結(jié)構(gòu)都是doService(HttpServletRequest req, HttpServletResponse resp)形式的,要讓固定的Servlet處理方法調(diào)用Handler來(lái)進(jìn)行處理,這一步工作便是HandlerAdapter要做的事。

2.6 HandlerExceptionResolver

從組件的名字上看,HandlerExceptionResolver是用來(lái)處理Handler產(chǎn)生的異常情況的組件。具體來(lái)說(shuō),此組件的作用是根據(jù)異常設(shè)置ModelAndView,之后交給渲染方法進(jìn)行渲染,渲染方法會(huì)將ModelAndView渲染成頁(yè)面。不過(guò)要注意,HandlerExceptionResolver只用于解析對(duì)請(qǐng)求做處理階段產(chǎn)生的異常,渲染階段的異常不歸它管,這也是Spring MVC 組件設(shè)計(jì)的一大原則—分工明確、互不干涉。

2.7 RequestToViewNameTranslator

RequestToViewNameTranslator組件的作用是從請(qǐng)求中獲取ViewName。因?yàn)閂iewResolver根據(jù)ViewName查找View,但有的Handler處理完成之后,沒(méi)有設(shè)置View,也沒(méi)有設(shè)置ViewName,便要通過(guò)這個(gè)組件來(lái)從請(qǐng)求中查找ViewName。

2.8 ViewResolver

ViewResolver即視圖解析器,相信大家對(duì)這個(gè)組件應(yīng)該很熟悉了。通常在Spring MVC的配置文件中,都會(huì)配上一個(gè)實(shí)現(xiàn)類來(lái)進(jìn)行視圖解析。這個(gè)組件的主要作用是將String類型的視圖名和Locale解析為View類型的視圖,只有一個(gè)resolveViewName()方法。從方法的定義可以看出,Controller層返回的String類型的視圖名viewName最終會(huì)在這里被解析成為View。View是用來(lái)渲染頁(yè)面的,也就是說(shuō),它會(huì)將程序返回的參數(shù)和數(shù)據(jù)填入模板中,生成HTML文件。ViewResolver在這個(gè)過(guò)程中主要做兩件大事:ViewResolver會(huì)找到渲染所用的模板(第一件大事)和所用的技術(shù)(第二件大事,其實(shí)也就是找到視圖的類型,如JSP)并填入?yún)?shù)。默認(rèn)情況下,Spring MVC會(huì)為我們自動(dòng)配置一個(gè)InternalResourceViewResolver,是針對(duì)JSP類型視圖的。

2.9 FlashMapManager

說(shuō)到FlashMapManager組件,得先說(shuō)一下FlashMap。FlashMap用于重定向時(shí)的參數(shù)傳遞,比如在處理用戶訂單時(shí),為了避免重復(fù)提交,可以處理完post請(qǐng)求后重定向到一個(gè)get請(qǐng)求,這個(gè)get請(qǐng)求可以用來(lái)顯示訂單詳情之類的信息。這樣做雖然可以規(guī)避用戶重新提交訂單的問(wèn)題,但是在這個(gè)頁(yè)面上要顯示訂單的信息,這些數(shù)據(jù)從哪里獲取呢?因?yàn)橹囟ㄏ蚴菦](méi)有傳遞參數(shù)這一功能的,如果不想把參數(shù)寫進(jìn)URL(其實(shí)也不推薦這么做,除了URL有長(zhǎng)度限制,把參數(shù)都直接暴露也不安全),那么就可以通過(guò)FlashMap來(lái)傳遞。只需要在重定向之前將要傳遞的數(shù)據(jù)寫入請(qǐng)求(可以通過(guò)ServletRequestAttributes.getRequest()方法獲得)的屬性O(shè)UTPUT_FLASH_MAP_ATTRIBUTE中,這樣在重定向之后的Handler中Spring就會(huì)自動(dòng)將其設(shè)置到Model中,在顯示訂單信息的頁(yè)面上就可以直接從Model中獲得數(shù)據(jù)。FlashMapManager就是用來(lái)管理FlashMap的。

3 Spring MVC關(guān)鍵組件的執(zhí)行流程

Spring MVC九大組件的執(zhí)行在DispatcherServlet的service()方法中完成。在這里,我重點(diǎn)介紹幾個(gè)關(guān)鍵組件HandlerMapping、HandlerAdapter、ViewResolver在service()方法中的執(zhí)行流程,具體調(diào)用分為以下幾個(gè)步驟:

1、HandlerMapping回到調(diào)用HandlerAdapter

2、HandlerAdapter會(huì)返回ModelAndView

3、ModelAndView根據(jù)用戶傳入?yún)?shù)得到ViewResolvers

4、ViewResolvers會(huì)將用戶傳入的參數(shù)封裝為View,交給引擎進(jìn)行渲染。

下面給大家分享一張Spring MVC關(guān)鍵組件的執(zhí)行流程圖,以幫助大家更好地理解:

 

注意:上圖中有大家最熟悉的兩個(gè)類:ModelAndView和View類并不屬于Spring MVC九大組件之列。

4 Spring MVC優(yōu)化建議

前面我們已經(jīng)對(duì)Spring MVC的工作原理和源碼進(jìn)行了分析,在這個(gè)過(guò)程中有幾個(gè)優(yōu)化點(diǎn)。

1. Controller如果能保持單例模式,盡量使用單例模式

這樣可以減小創(chuàng)建對(duì)象和回收對(duì)象的開(kāi)銷。也就是說(shuō),如果Controller的類變量和實(shí)例變量可以以方法形參聲明就盡量以方法形參聲明,不要以類變量和實(shí)例變量聲明,這樣可以避免線程安全問(wèn)題。

2. 處理請(qǐng)求的方法中的形參務(wù)必加上@RequestParam注解

這樣可以避免Spring MVC使用asm框架讀取.class文件獲取方法參數(shù)名。即便Spring MVC對(duì)讀取出的方法參數(shù)名進(jìn)行了緩存,如果能不讀取.class文件當(dāng)然更好。

3. 緩存URL

在閱讀源碼的過(guò)程中,我們發(fā)現(xiàn)Spring MVC并沒(méi)有對(duì)處理URL的方法進(jìn)行緩存,也就是說(shuō),每次都要根據(jù)請(qǐng)求URL去匹配Controller中的方法的URL,如果把URL和方法的關(guān)系緩存起來(lái),會(huì)不會(huì)帶來(lái)性能上的提升呢?不幸的是,負(fù)責(zé)解析URL和方法對(duì)應(yīng)關(guān)系的ServletHandlerMethodResolver是一個(gè)私有的內(nèi)部類,不能直接通過(guò)繼承該類增強(qiáng)代碼,必須在代碼后重新編譯。當(dāng)然,如果將URL緩存起來(lái),必須考慮緩存的線程安全問(wèn)題。

 

責(zé)任編輯:姜華 來(lái)源: Tom彈架構(gòu)
相關(guān)推薦

2021-03-26 11:00:50

SpringMVC組件接口

2021-12-27 08:27:17

SpringMVC面試

2022-09-28 16:37:59

SpringMVC框架

2012-05-16 11:24:29

System Cent

2020-05-21 13:25:43

Spring組件架構(gòu)

2012-02-03 08:59:37

微軟云計(jì)算System Cent

2023-08-01 23:04:40

Spring編程AOP

2024-04-23 00:00:00

SpringBoot監(jiān)聽(tīng)器

2023-02-23 08:15:33

Spring異常處理機(jī)制

2021-09-05 07:35:58

lifecycleAndroid組件原理

2021-09-10 15:16:19

Kubernetes核心組件運(yùn)維

2024-09-13 10:11:38

2021-10-19 17:52:56

數(shù)據(jù)分析標(biāo)簽

2021-12-14 07:43:52

Spring核心原理環(huán)境準(zhǔn)備

2023-02-09 08:01:12

核心組件非阻塞

2021-12-15 09:17:12

Spring依賴注入面試題

2009-06-22 11:54:28

Spring MVCSpringframe

2021-09-07 11:14:36

數(shù)據(jù)分析互聯(lián)網(wǎng)

2022-11-04 08:39:46

SpringWebFlux

2021-10-31 19:39:11

注解Spring 核心類
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)