成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

1 什么是Spring MVC

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

2 SpringMVC九大組件名稱解釋

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

具體詳細介紹如下:

2.1 MultipartResolver

MultipartResolver是一個大家很熟悉的組件,用于處理上傳請求,通過將普通的請求包裝成MultipartHttpServletRequest來實現。MultipartHttpServletRequest可以通過getFile()方法直接獲得文件。如果上傳多個文件,還可以調用getFileMap()方法得到 Map< FileName, File> 這樣的結構。MultipartResolver的作用就是封裝普通的請求,使其擁有文件上傳的功能。

2.2 LocaleResolver

ViewResolver組件的resolveViewName()方法需要兩個參數,一個是視圖名,另一個就是Locale。參數Locale是從哪來的呢?這就是LocaleResolver組件要做的事。LocaleResolver用于從請求中解析出 Locale,比如在中國Locale當然就是zh-CN,用來表示一個區域。這個組件也是i18n的基礎。

2.3 ThemeResolver

從名字便可看出,ThemeResolver組件是用來解析主題的。主題就是樣式、圖片及它們所形成的顯示效果的集合。Spring MVC中一套主題對應一個properties文件,里面存放著與當前主題相關的所有資源,如圖片、CSS樣式等。創建主題非常簡單,只需準備好資源,然后新建一個“主題名.properties”并將資源設置進去,放在classpath下,之后便可以在頁面中使用了。Spring MVC中與主題有關的類有ThemeResolver、ThemeSource和Theme。ThemeResolver負責從請求中解析出主題名,ThemeSource則根據主題名找到具體的主題,其抽象也就是Theme,可以通過Theme來獲取主題和具體的資源。

2.4 HandlerMapping

HandlerMapping是用來查找Handler的,也就是處理器,具體的表現形式可以是類,也可以是方法。比如,標注了@RequestMapping的每個方法都可以看成一個Handler。Handler負責實際的請求處理,在請求到達后,HandlerMapping的作用便是找到請求相應的處理器Handler和Interceptor。

2.5 HandlerAdapter

從名字上看,HandlerAdapter是一個適配器。因為Spring MVC中Handler可以是任意形式的,只要能夠處理請求便可。但是把請求交給Servlet的時候,由于Servlet的方法結構都是doService(HttpServletRequest req, HttpServletResponse resp)形式的,要讓固定的Servlet處理方法調用Handler來進行處理,這一步工作便是HandlerAdapter要做的事。

2.6 HandlerExceptionResolver

從組件的名字上看,HandlerExceptionResolver是用來處理Handler產生的異常情況的組件。具體來說,此組件的作用是根據異常設置ModelAndView,之后交給渲染方法進行渲染,渲染方法會將ModelAndView渲染成頁面。不過要注意,HandlerExceptionResolver只用于解析對請求做處理階段產生的異常,渲染階段的異常不歸它管,這也是Spring MVC 組件設計的一大原則—分工明確、互不干涉。

2.7 RequestToViewNameTranslator

RequestToViewNameTranslator組件的作用是從請求中獲取ViewName。因為ViewResolver根據ViewName查找View,但有的Handler處理完成之后,沒有設置View,也沒有設置ViewName,便要通過這個組件來從請求中查找ViewName。

2.8 ViewResolver

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

2.9 FlashMapManager

說到FlashMapManager組件,得先說一下FlashMap。FlashMap用于重定向時的參數傳遞,比如在處理用戶訂單時,為了避免重復提交,可以處理完post請求后重定向到一個get請求,這個get請求可以用來顯示訂單詳情之類的信息。這樣做雖然可以規避用戶重新提交訂單的問題,但是在這個頁面上要顯示訂單的信息,這些數據從哪里獲取呢?因為重定向是沒有傳遞參數這一功能的,如果不想把參數寫進URL(其實也不推薦這么做,除了URL有長度限制,把參數都直接暴露也不安全),那么就可以通過FlashMap來傳遞。只需要在重定向之前將要傳遞的數據寫入請求(可以通過ServletRequestAttributes.getRequest()方法獲得)的屬性OUTPUT_FLASH_MAP_ATTRIBUTE中,這樣在重定向之后的Handler中Spring就會自動將其設置到Model中,在顯示訂單信息的頁面上就可以直接從Model中獲得數據。FlashMapManager就是用來管理FlashMap的。

3 Spring MVC關鍵組件的執行流程

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

1、HandlerMapping回到調用HandlerAdapter

2、HandlerAdapter會返回ModelAndView

3、ModelAndView根據用戶傳入參數得到ViewResolvers

4、ViewResolvers會將用戶傳入的參數封裝為View,交給引擎進行渲染。

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

 

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

4 Spring MVC優化建議

前面我們已經對Spring MVC的工作原理和源碼進行了分析,在這個過程中有幾個優化點。

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

這樣可以減小創建對象和回收對象的開銷。也就是說,如果Controller的類變量和實例變量可以以方法形參聲明就盡量以方法形參聲明,不要以類變量和實例變量聲明,這樣可以避免線程安全問題。

2. 處理請求的方法中的形參務必加上@RequestParam注解

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

3. 緩存URL

在閱讀源碼的過程中,我們發現Spring MVC并沒有對處理URL的方法進行緩存,也就是說,每次都要根據請求URL去匹配Controller中的方法的URL,如果把URL和方法的關系緩存起來,會不會帶來性能上的提升呢?不幸的是,負責解析URL和方法對應關系的ServletHandlerMethodResolver是一個私有的內部類,不能直接通過繼承該類增強代碼,必須在代碼后重新編譯。當然,如果將URL緩存起來,必須考慮緩存的線程安全問題。

 

責任編輯:姜華 來源: Tom彈架構
相關推薦

2021-03-26 11:00:50

SpringMVC組件接口

2022-09-28 16:37:59

SpringMVC框架

2021-12-27 08:27:17

SpringMVC面試

2012-05-16 11:24:29

System Cent

2020-05-21 13:25:43

Spring組件架構

2012-02-03 08:59:37

微軟云計算System Cent

2023-08-01 23:04:40

Spring編程AOP

2024-04-23 00:00:00

SpringBoot監聽器

2023-02-23 08:15:33

Spring異常處理機制

2021-09-05 07:35:58

lifecycleAndroid組件原理

2021-09-10 15:16:19

Kubernetes核心組件運維

2024-09-13 10:11:38

2021-10-19 17:52:56

數據分析標簽

2021-12-14 07:43:52

Spring核心原理環境準備

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

數據分析互聯網

2022-11-04 08:39:46

SpringWebFlux

2024-02-01 08:28:28

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 美女一区| 成年人在线观看 | 亚洲欧美中文日韩在线v日本 | 精品毛片 | 欧美日韩亚洲三区 | 亚洲精品乱码久久久久久久久 | 久久激情五月丁香伊人 | 免费高潮视频95在线观看网站 | 日韩av成人| 久久精品成人热国产成 | 99这里只有精品视频 | 中文字幕亚洲视频 | 欧一区二区| 精品国产伦一区二区三区观看体验 | 中文字幕成人av | 免费能直接在线观看黄的视频 | 亚洲情综合五月天 | 亚洲一卡二卡 | 日韩一区精品 | 国产精品久久久久久福利一牛影视 | 91精品在线播放 | 视频一区在线 | 亚洲美女一区二区三区 | 青青草视频网站 | 精品国产乱码久久久久久图片 | 请别相信他免费喜剧电影在线观看 | 在线观看免费国产 | 91社区在线观看高清 | 男人天堂av网站 | 亚洲国产成人精品久久久国产成人一区 | 韩日在线 | 午夜小电影 | 欧美不卡在线 | 亚洲精品一区二区三区蜜桃久 | 天天操夜夜骑 | 黄色片免费 | www国产成人免费观看视频,深夜成人网 | 久久毛片| 国产欧美日韩一区 | 男女在线网站 | 中文字幕中文字幕 |