Spring MVC 基本概念

1. Sping MVC簡介

1.1 MVC體系結(jié)構(gòu)

三層架構(gòu)
在JavaEE開發(fā)中睛藻,幾乎全都是基于B/S架構(gòu)的開發(fā)蓄诽。在B/S架構(gòu)中功偿,系統(tǒng)標(biāo)準(zhǔn)的三層架構(gòu)包括:表現(xiàn)層筑舅、業(yè)務(wù)層座慰、持久層。
三層架構(gòu)中豁翎,每一層各司其職:

  • 表現(xiàn)層:
    表現(xiàn)層是我們常說的web層角骤。它負(fù)責(zé)接收客戶端請求隅忿,向客戶端響應(yīng)結(jié)果心剥,通常客戶端使用http協(xié)議請求web層背桐,web需要接收http請求优烧,完成http響應(yīng)。
    表現(xiàn)層包括展示層和控制層:控制層負(fù)責(zé)接收請求链峭,展示層負(fù)責(zé)結(jié)果的展示畦娄。
    表現(xiàn)層依賴業(yè)務(wù)層,接收到客戶端請求一般會調(diào)用業(yè)務(wù)層進(jìn)行業(yè)務(wù)處理,并將處理結(jié)果響應(yīng)給客戶端熙卡。
    表現(xiàn)層設(shè)計(jì)一般都使用MVC模型杖刷。(MVC是表現(xiàn)層的設(shè)計(jì)模型,和其他層沒有關(guān)系)
  • 業(yè)務(wù)層:
    業(yè)務(wù)層是我們常說的service層驳癌。它負(fù)責(zé)業(yè)務(wù)邏輯處理滑燃,和開發(fā)項(xiàng)目的需求息息相關(guān)。web層依賴業(yè)務(wù)層颓鲜,但是業(yè)務(wù)層不依賴web層表窘。
    業(yè)務(wù)層在處理業(yè)務(wù)時(shí)可能會依賴持久層,如果要對數(shù)據(jù)持久化需要保證事物一致性甜滨。(也就是我們說的乐严,事物應(yīng)該放到業(yè)務(wù)層來控制)
  • 持久層:
    也就是我們常說的dao層。負(fù)責(zé)數(shù)據(jù)持久化衣摩,包括數(shù)據(jù)層即數(shù)據(jù)庫和數(shù)據(jù)訪問昂验,數(shù)據(jù)庫是對數(shù)據(jù)進(jìn)行持久化的載體,數(shù)據(jù)訪問層是業(yè)務(wù)層和持久層交互的接口昭娩,業(yè)務(wù)層需要通過數(shù)據(jù)訪問層將數(shù)據(jù)持久化到數(shù)據(jù)庫中凛篙,通俗的講栏渺,持久層就是和數(shù)據(jù)庫交互呛梆,對數(shù)據(jù)庫表進(jìn)行增刪改查的。
    MVC設(shè)計(jì)模式
    MVC全名是Model View Controller磕诊,是模型(model)--視圖(view)--控制器(controller)的縮寫莱褒,是一種利用設(shè)計(jì)創(chuàng)建Web應(yīng)用程序表現(xiàn)層的模式击困。MVC中每個(gè)部分各司其職:
  • Model(模型):模型包含業(yè)務(wù)模型和數(shù)據(jù)模型,數(shù)據(jù)模型用于封裝數(shù)據(jù)广凸,業(yè)務(wù)模型用于處理業(yè)務(wù)阅茶。
  • View(視圖):通常指的就是我們的jsp或者h(yuǎn)tml。作用一般就是展示數(shù)據(jù)的谅海。通常視圖3是依據(jù)模型數(shù)據(jù)創(chuàng)建的脸哀。
  • Controller(控制器):是應(yīng)用程序處理用戶交互的部分。作用一般就是處理程序邏輯的扭吁。
    MVC提倡:每一層只編寫自己的東西撞蜂,不編寫任何其他代碼盲镶;分層是為了解耦,解耦是為了維護(hù)方便和分工協(xié)作蝌诡。

1.2 Spring MVC是什么

SpringMVC全名叫做Spring Web MVC溉贿,是一種基于Java的實(shí)現(xiàn)MVC設(shè)計(jì)模式的請求驅(qū)動(dòng)類型的輕量級Web框架,屬于SpringFrameWork的后續(xù)產(chǎn)品浦旱。


Spring架構(gòu)

SpringMVC已經(jīng)成為目前最主流的MVC框架之一顽照,并且隨著Spring3.0的發(fā)布,全面超越Struts2闽寡,成為最優(yōu)秀的MVC框架代兵。
Spring MVC本質(zhì)可以認(rèn)為是對servlet的封裝,簡化了我們serlvet的開發(fā)爷狈。SpringMVC中要讓一個(gè)Java類能夠處理請求只需要添加注解就ok植影,它通過一套注解,讓一個(gè)簡單的Java類成為處理請求的控制器涎永,而無需實(shí)現(xiàn)任何接口思币。同時(shí)它還支持RESTful編程風(fēng)格的請求。


SpringMVC

2. Spring Web MVC 工作流程

2.1. Spring MVC 請求處理流程

請求處理流程

流程處理說明

  1. 用戶發(fā)送請求至前端控制器DispatcherServlet羡微;
  2. DispatcherServlet收到請求調(diào)用HandlerMapping處理器映射器谷饿;
  3. 處理器映射器根據(jù)請求的url找到具體的Handler(后端控制器),生成處理器對象以及處理器攔截器(如果有則生成)一并返回DispatcherServlet妈倔;
  4. DispatcherServlet調(diào)用HandlerAdapter處理器適配器去調(diào)用Handler博投;
  5. 處理器適配器執(zhí)行Handler;
  6. Handler執(zhí)行完成給處理器適配器返回ModelAndView盯蝴;
  7. 處理器適配器向前端控制器返回ModelAndView毅哗,ModelAndView是SpringMVC框架的一個(gè)底層對象,包括Model和View捧挺;
  8. 前端控制器請求視圖解析器3去進(jìn)行視圖解析虑绵,根據(jù)邏輯視圖名來解析真正的視圖;
  9. 視圖解析器向前端控制器返回View闽烙;
  10. 前端控制器進(jìn)行視圖渲染翅睛,將模型數(shù)據(jù)(在ModelAndView對象中)填充到request域;
  11. 前端控制器向用戶響應(yīng)3結(jié)果黑竞。

2.2. Spring MVC 九大組件

  • HandlerMapping(處理器映射器)
    HandlerMapping 是用來查找Hander的捕发,也就是處理器,具體的表現(xiàn)形式可以是類摊溶,也可以是方法爬骤,比如充石,標(biāo)注了@RequestMapping的每個(gè)方法都可以看成是一個(gè)Hander莫换。Hander負(fù)責(zé)具體實(shí)際的處理請求霞玄,在請求到達(dá)后,HanderMapping的作用便是找到請求相應(yīng)的處理器Hander和Interceptor拉岁。
  • HanderAdapter(處理器適配器)
    HanderAdapter是一個(gè)適配器坷剧。因?yàn)镾pring MVC中Hander可以是任意形式的,只要能處理請求即可喊暖。但是把請求交給Servlet的時(shí)候惫企,由于Servlet的方法結(jié)構(gòu)都是doService(HttpServletRequest req,HttpServletResponse resp)形式的,要讓固定的Servlet處理方法調(diào)用Hander來進(jìn)行處理陵叽,便是HandlerAdapter的職責(zé)狞尔。
  • HandlerExecptionResoler
    HandlerExectionResoler用于處理Handler產(chǎn)生的異常情況。它的作用是根據(jù)異常設(shè)置ModelAndView巩掺,之后交給渲染方法進(jìn)行渲染偏序,渲染方法會將ModelAndView渲染成頁面。
  • ViewResoler
    ViewResoler即視圖解析器胖替,用于將Spring類型的視圖名和Locale解析為View類型的視圖研儒,只有一個(gè)resolveViewName()方法。從方法的定義可以看出独令,Controller層返回的String類型視圖名viewName最終會在這里被解析成View端朵。View是用來渲染頁面的,也就是說燃箭,它會將程序返回的參數(shù)和數(shù)據(jù)填入模版中冲呢,生成html文件。ViewResolver在這個(gè)過程主要完成兩件事情:ViewResolver找到渲染所用的模版(第一件大事)和所用的技術(shù)(第二件大事招狸,其實(shí)也就是找到視圖類型碗硬,如JSP)并填入?yún)?shù)。默認(rèn)情況下瓢颅,SpringMVC會自動(dòng)為我們配置一個(gè)InternalResourceViewResolver恩尾,是針對jsp類型視圖的。
  • RequestToViewNameTranslator
    RequestToViewNameTranslator組件的作用是從請求中獲取ViewName挽懦。因?yàn)閂iewResolver根據(jù)ViewName查找View翰意,但有的Handler處理完成之后,沒有設(shè)置View信柿,也沒有設(shè)置ViewName冀偶,便要通過這個(gè)組件從請求中查找ViewName。
  • LocaleResolver
    ViewResolver組件的resolverViewName方法需要兩個(gè)參數(shù)渔嚷,一個(gè)是視圖3名进鸠,一個(gè)是Locale。LocaleResolver用于從請求中解析出Locale形病,比如中國Locale是zh-CN客年,用來表示一個(gè)區(qū)域霞幅。這個(gè)組件也是i18n的基礎(chǔ)。
  • ThemeResolver
    ThemeResolver組件是用來解析主題的量瓜。主題是樣式3司恳、圖片及他們所形成的顯示效果的集合。
  • MultipartResolver
    MultipartResolver用于上傳請求绍傲,通過將普通的請求包裝成MultipartHttpServletRequest來實(shí)現(xiàn)扔傅。MultipartHttpServletRequest可以通過getFile()方法直接獲得文件。如果上傳多個(gè)文件烫饼,還可以調(diào)用getFileMap()方法獲得到Map<FileName,File>這樣的結(jié)構(gòu)猎塞,MultipartResolver的作用就是封裝普通的請求,使其擁有文件上傳的功能杠纵。
  • FlashMapManager
    FlashMap用于重定向時(shí)的參數(shù)傳遞邢享,比如在處理用戶訂單時(shí)候,為了避免重復(fù)提交淡诗,可以處理完post請求之后重定向到一個(gè)get請求骇塘,這個(gè)get請求可以用來顯示訂單詳情之類的信息。這樣做雖然可以規(guī)避用戶重新提交訂單的問題韩容,但是在這個(gè)頁面上要顯示訂單的信息款违,這些數(shù)據(jù)從哪里來獲得呢?因?yàn)橹囟ㄏ驎r(shí)沒有傳遞參數(shù)這一功能的群凶,如果不想把參數(shù)寫進(jìn)URL(不推薦)插爹,那么就可以通過FlashMap來傳遞。只需要在重定向之前將要傳遞的數(shù)據(jù)寫入請求(可以通過ServletRequestAttributes.getRequest()方法獲得)的屬性PUTPUT_FLASH_MAP_ATTRIBUTE中请梢,這樣在重定向之后的Handler中Spring就會自動(dòng)將其設(shè)置到Model中赠尾,在顯示訂單信息的頁面上就可以直接從Model中獲取數(shù)據(jù)。FlashMapManager就是用來管理FalshMap的毅弧。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末气嫁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子够坐,更是在濱河造成了極大的恐慌寸宵,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件元咙,死亡現(xiàn)場離奇詭異梯影,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)庶香,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門甲棍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人赶掖,你說我怎么就攤上這事感猛∑呷牛” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵唱遭,是天一觀的道長。 經(jīng)常有香客問我呈驶,道長拷泽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任袖瞻,我火速辦了婚禮司致,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘聋迎。我一直安慰自己脂矫,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布霉晕。 她就那樣靜靜地躺著庭再,像睡著了一般。 火紅的嫁衣襯著肌膚如雪牺堰。 梳的紋絲不亂的頭發(fā)上拄轻,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機(jī)與錄音伟葫,去河邊找鬼恨搓。 笑死,一個(gè)胖子當(dāng)著我的面吹牛筏养,可吹牛的內(nèi)容都是我干的斧抱。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼渐溶,長吁一口氣:“原來是場噩夢啊……” “哼辉浦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起茎辐,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤盏浙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后荔茬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體废膘,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年慕蔚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了丐黄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡孔飒,死狀恐怖灌闺,靈堂內(nèi)的尸體忽然破棺而出艰争,到底是詐尸還是另有隱情,我是刑警寧澤桂对,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布甩卓,位于F島的核電站,受9級特大地震影響蕉斜,放射性物質(zhì)發(fā)生泄漏逾柿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一宅此、第九天 我趴在偏房一處隱蔽的房頂上張望机错。 院中可真熱鬧,春花似錦父腕、人聲如沸弱匪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽萧诫。三九已至,卻和暖如春枝嘶,著一層夾襖步出監(jiān)牢的瞬間财搁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工躬络, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留尖奔,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓穷当,卻偏偏與公主長得像提茁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子馁菜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容

  • springMVC基本概念 一茴扁、三層架構(gòu)簡單介紹 JavaEE的開發(fā)幾乎都是B/S架構(gòu):在B/S架構(gòu)中,系統(tǒng)標(biāo)準(zhǔn)的...
    哈哈大圣閱讀 505評論 0 1
  • 三層架構(gòu)和MVC的基本概念 三層架構(gòu):我們的開發(fā)架構(gòu)一般都是基于兩種形式:一種是C/S架構(gòu),就是客戶端/服務(wù)器端,...
    我真的是自愿的閱讀 463評論 0 1
  • 此文已經(jīng)同步至個(gè)人站點(diǎn)博客汪疮,點(diǎn)擊下方鏈接可以體驗(yàn)更加閱讀模式:《java題庫》 基本概念 1.操作系統(tǒng)中 heap...
    千淘萬漉閱讀 9,756評論 8 19
  • SpringMVC簡介 SpringMVC是目前最好的實(shí)現(xiàn)MVC設(shè)計(jì)模式的框架峭火,是Spring框架的一個(gè)分支產(chǎn)品,...
    若兮緣閱讀 2,188評論 0 11
  • 在開始springmvc之旅之前智嚷,我們先學(xué)習(xí)下MVC架構(gòu)模式卖丸。 什么是MVC架構(gòu)模式? MVC是MODEL-VIE...
    iamlyly閱讀 666評論 0 1