SpringMVC

一脑蠕、MVC是一種設(shè)計模式

MVC原理圖

分析:

  1. M~Model 模型(完成業(yè)務(wù)邏輯:由javaBean構(gòu)成玖翅,service+dao+entity)
  2. V~View 視圖(做界面的展示 jsp艘刚,html……)
  3. C~Controller 控制器(接收請求—>調(diào)用模型—>根據(jù)結(jié)果派發(fā)頁面)

二横漏、SpringMVC是什么

SpringMVC是一個MVC的開源框架穴吹。SpringMVC和spring有什么樣的關(guān)系呢氢惋?百度百科上有一個很好的解釋:SpringMVC是spring的一個后續(xù)產(chǎn)品桶良,其實就是spring在原有基礎(chǔ)上座舍,又提供了web應(yīng)用的MVC模塊,可以簡單的把SpringMVC理解為是spring的一個模塊(類似AOP陨帆,IOC這樣的模塊)曲秉,常說SpringMVC與spring無縫集成,其實SpringMVC就是spring的一個子模塊疲牵,所以根本不需要同spring進(jìn)行整合承二。

SpringMVC的解析圖:

SpringMVC的原理圖

這里主要理解springMVC中的幾個組件:

前端控制器(DispatcherServlet):整個流程控制的中心,控制其它組件執(zhí)行纲爸,統(tǒng)一調(diào)度亥鸠,降低組件之間的耦合性,提高每個組件的擴(kuò)展性识啦。相當(dāng)于電腦的CPU负蚊。

處理器映射器(HandlerMapping):根據(jù)URL去查找處理器。通過擴(kuò)展處理器映射器實現(xiàn)不同的映射方式颓哮,例如:配置文件方式家妆,實現(xiàn)接口方式冕茅,注解方式等伤极。

處理器(Handler):即后端控制器蛹找,用controller表示。(需要程序員去寫代碼處理邏輯的)

處理器適配器(HandlerAdapter):會把處理器包裝成適配器哨坪,這樣就可以支持多種類型的處理器庸疾,類比筆記本的適配器(適配器模式的應(yīng)用)

視圖解析器(ViewResovler):進(jìn)行視圖解析,多返回字符串齿税,進(jìn)行處理彼硫,可以解析成對應(yīng)的頁面炊豪,展示給用戶凌箕。視圖中通常需要標(biāo)簽語言展示模型數(shù)據(jù)。支持更多類型的視圖解析词渤,例如:jsp牵舱、freemarker、pdf缺虐、excel等芜壁。(需要程序員去寫代碼處理邏輯的)

三、SpringMVC工作原理

SpringMVC工作原理圖

SpringMVC工作原理

SpringMVC流程

  1. 用戶發(fā)送請求至前端控制器DispatcherServlet高氮。

  2. DispatcherServlet收到請求調(diào)用HandlerMapping處理器映射器慧妄。

  3. 處理器映射器找到具體的處理器(可以根據(jù)xml配置、注解進(jìn)行查找)剪芍,生成處理器對象及處理器攔截器(如果有則生成)一并返回給DispatcherServlet塞淹。

  4. DispatcherServlet調(diào)用HandlerAdapter處理器適配器。

  5. HandlerAdapter經(jīng)過適配調(diào)用具體的處理器(Controller罪裹,也叫后端控制器)饱普。

  6. Controller執(zhí)行完成返回ModelAndView。

  7. HandlerAdapter將Controller執(zhí)行結(jié)果ModelAndView返回給DispatcherServlet状共。

  8. DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器套耕。

  9. ViewReslover解析后返回具體View。

  10. DispatcherServlet根據(jù)View進(jìn)行渲染視圖(即將模型數(shù)據(jù)填充至視圖中)峡继。

  11. DispatcherServlet響應(yīng)用戶冯袍。

組件說明:

  1. 前端控制器DispatcherServlet(不需要工程師開發(fā)),由框架提供
    作用:接收請求,響應(yīng)結(jié)果碾牌,相當(dāng)于轉(zhuǎn)發(fā)器康愤,中央處理器。有了dispatcherServlet減少了其它組件之間的耦合度小染。
    用戶請求到達(dá)前端控制器翘瓮,它就相當(dāng)于mvc模式中的c,dispatcherServlet是整個流程控制的中心裤翩,由它調(diào)用其它組件處理用戶的請求资盅,dispatcherServlet的存在降低了組件之間的耦合性调榄。

  2. 處理器映射器HandlerMapping(不需要工程師開發(fā)),由框架提供
    作用:根據(jù)請求的url查找Handler
    HandlerMapping負(fù)責(zé)根據(jù)用戶請求找到Handler即處理器呵扛,SpringMVC提供了不同的映射器實現(xiàn)不同的映射方式每庆,例如:配置文件方式,實現(xiàn)接口方式今穿,注解方式等缤灵。

  3. 處理器適配器HandlerAdapter
    作用:按照特定規(guī)則(HandlerAdapter要求的規(guī)則)去執(zhí)行Handler
    通過HandlerAdapter對處理器進(jìn)行執(zhí)行,這是適配器模式的應(yīng)用蓝晒,通過擴(kuò)展適配器可以對更多類型的處理器進(jìn)行執(zhí)行腮出。

  4. 處理器Handler(需要工程師開發(fā))
    注意:編寫Handler時按照HandlerAdapter的要求去做,這樣適配器才可以去正確執(zhí)行Handler
    Handler 是繼DispatcherServlet前端控制器的后端控制器芝薇,在DispatcherServlet的控制下Handler對具體的用戶請求進(jìn)行處理胚嘲。
    由于Handler涉及到具體的用戶業(yè)務(wù)請求,所以一般情況需要工程師根據(jù)業(yè)務(wù)需求開發(fā)Handler洛二。

  5. 視圖解析器View resolver(不需要工程師開發(fā))馋劈,由框架提供
    作用:進(jìn)行視圖解析,根據(jù)邏輯視圖名解析成真正的視圖(view)
    View Resolver負(fù)責(zé)將處理結(jié)果生成View視圖晾嘶,View Resolver首先根據(jù)邏輯視圖名解析成物理視圖名即具體的頁面地址妓雾,再生成View視圖對象,最后對View進(jìn)行渲染將處理結(jié)果通過頁面展示給用戶垒迂。SpringMVC框架提供了很多的View視圖類型械姻,包括:jstlView、freemarkerView娇斑、pdfView等策添。
    一般情況下需要通過頁面標(biāo)簽或頁面模版技術(shù)將模型數(shù)據(jù)通過頁面展示給用戶,需要由工程師根據(jù)業(yè)務(wù)需求開發(fā)具體的頁面毫缆。

  6. 視圖View(需要工程師開發(fā)jsp…)
    View是一個接口唯竹,實現(xiàn)類支持不同的View類型(jsp、freemarker苦丁、pdf…)

核心架構(gòu)的具體流程步驟如下:

  1. 首先用戶發(fā)送請求——>DispatcherServlet浸颓,前端控制器收到請求后自己不進(jìn)行處理,而是委托給其他的解析器進(jìn)行處理旺拉,作為統(tǒng)一訪問點(diǎn)产上,進(jìn)行全局的流程控制;
  2. DispatcherServlet——>HandlerMapping蛾狗, HandlerMapping 將會把請求映射為HandlerExecutionChain 對象【包含一個Handler 處理器(頁面控制器)對象晋涣、多個HandlerInterceptor 攔截器對象】。通過這種策略模式沉桌,很容易添加新的映射策略谢鹊;
  3. DispatcherServlet——>HandlerAdapter算吩,HandlerAdapter 將會把處理器包裝為適配器,從而支持多種類型的處理器佃扼,即適配器設(shè)計模式的應(yīng)用偎巢,從而很容易支持很多類型的處理器;
  4. HandlerAdapter——>處理器功能處理方法的調(diào)用兼耀,HandlerAdapter 將會根據(jù)適配的結(jié)果調(diào)用真正的處理器的功能處理方法压昼,完成功能處理;并返回一個ModelAndView 對象(包含模型數(shù)據(jù)瘤运、邏輯視圖名)窍霞;
  5. ModelAndView的邏輯視圖名——> ViewResolver, ViewResolver 將把邏輯視圖名解析為具體的View尽超,通過這種策略模式官撼,很容易更換其他視圖技術(shù);
  6. View——>渲染似谁,View會根據(jù)傳進(jìn)來的Model模型數(shù)據(jù)進(jìn)行渲染,此處的Model實際是一個Map數(shù)據(jù)結(jié)構(gòu)掠哥,因此很容易支持其他視圖技術(shù)巩踏;
  7. 返回控制權(quán)給DispatcherServlet,由DispatcherServlet返回響應(yīng)給用戶续搀,到此一個流程結(jié)束塞琼。

四、Spring MVC 的優(yōu)點(diǎn)

  1. 它是基于組件技術(shù)的禁舷。全部的應(yīng)用對象彪杉,無論控制器和視圖,還是業(yè)務(wù)對象之類的都是組件牵咙,并且和 Spring 提供的其他基礎(chǔ)結(jié)構(gòu)緊密集成派近。
  2. 不依賴于 Servlet API(目標(biāo)雖是如此,但是在實現(xiàn)的時候確實是依賴于 Servlet 的)洁桌。
  3. 可以任意使用各種視圖技術(shù)渴丸,而不僅僅局限于 JSP。
  4. 支持各種請求資源的映射策略另凌。
  5. 它應(yīng)是易于擴(kuò)展的谱轨。

五、SpringMVC 的控制器是不是單例模式吠谢?如果是有什么問題土童,怎么解決?

答:是單例模式工坊,所以在多線程訪問的時候有線程安全問題献汗,不要用同步错沃,會影響性能的。解決方案是在控制器里面不能寫字段雀瓢。

六枢析、SpingMVC 中的控制器的注解一般用哪個,有沒有別的注解可以替代刃麸?

答:一般用@Conntroller 注解醒叁,表示是控制層,該注解表明該類扮演控制器的角色泊业。不能用別的注解代替把沼。

七、 @RequestMapping 注解用在類上面有什么作用吁伺?

答:是一個用來處理請求地址映射的注解饮睬,可用于類或方法上。用于類上篮奄,表示類中響應(yīng)請求的方法都是以該地址作為父路徑捆愁。

八、怎么樣把某個請求映射到特定的方法上面窟却?

答:直接在方法上面加上注解@RequestMapping昼丑,并且在這個注解里面寫上要攔截的路徑。

九夸赫、怎么配置菩帝,才能在攔截請求中攔截 get 方式提交的方法?

答:可以在@RequestMapping 注解里面加上 method=RequestMethod.GET

十茬腿、怎么樣在方法里面得到 Request或者 Session呼奢?

答:直接在方法的形參中聲明 request,SpringMVC 就自動把 request 對象傳入了切平。

十一握础、怎么在攔截的方法里面得到從前臺傳入的參數(shù)?

答:直接在形參里面聲明這個參數(shù)就可以揭绑,但必須名字和傳過來的參數(shù)一樣弓候。

十二、如果前臺有很多個參數(shù)傳入他匪,并且這些參數(shù)都是一個對象的菇存,那么怎么樣快速得到這象?

答:直接在方法中聲明這個對象邦蜜,SpringMVC 就自動會把屬性賦值到這個對象里面鹏秋。

十三碱鳞、SpringMVC 中函數(shù)的返回值是什么苔埋?

答:返回值可以有很多類型,有 String姐扮、ModelAndView。一般用 String 比較好衣吠。

十四茶敏、SpringMVC 怎么樣設(shè)定轉(zhuǎn)發(fā)和重定向的?

  • 在返回值前面加"forward:"就可以讓結(jié)果轉(zhuǎn)發(fā)缚俏,比如"forward:user.do?name=method4"
  • 在返回值前面加"redirect:"就可以讓返回值重定向惊搏,比如"redirect:百度一下,你就知道"

十五忧换、SpringMVC 用什么對象從后臺向前臺傳遞數(shù)據(jù)的恬惯?

答:通過 ModelMap 對象,可以在這個對象里面用 put 方法亚茬,把對象加到里面酪耳,前臺就可以過 el 表達(dá)式拿到。

十六刹缝、SpringMVC 中有個類把視圖和數(shù)據(jù)都合并的一起的碗暗,叫什么?

答:叫 ModelAndView赞草。

十七讹堤、怎么樣把 ModelMap 里面的數(shù)據(jù)放入Session 里面?

答:可以在類上面加上@SessionAttributes 注解厨疙,里面包含的字符串就是要放入 session 的 key。

十八疑务、SpringMVC 怎么和 AJAX 相互調(diào)用的沾凄?

答:通過 Jackson 框架就可以把 Java 里面的對象直接轉(zhuǎn)化成 Js 可以識別的 Json 對象。具體步驟如下 :

  1. 加入 Jackson.jar
  2. 在配置文件中配置 json 的映射
  3. 在接受 Ajax 方法里面可以直接返回 Object知允、List 等撒蟀,但方法前面要加上@ResponseBody注解

十九、當(dāng)一個方法向 AJAX 返回特殊對象温鸽,比如 Object保屯、List 等,需要做什么處理涤垫?

答:要加上@ResponseBody 注解

二十姑尺、SpringMVC 攔截器是怎么寫的?

  • 一種是實現(xiàn)接口蝠猬。
  • 另外一種是繼承適配器類切蟋,然后在 SpringMVC 的配置文配置攔截器即可:
<mvc:interceptors>
<mvc:mapping path="/modelMap.do" />
</mvc:interceptor></mvc:interceptors>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市榆芦,隨后出現(xiàn)的幾起案子柄粹,更是在濱河造成了極大的恐慌喘鸟,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驻右,死亡現(xiàn)場離奇詭異什黑,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)堪夭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門愕把,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人茵瘾,你說我怎么就攤上這事礼华。” “怎么了拗秘?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵圣絮,是天一觀的道長。 經(jīng)常有香客問我雕旨,道長扮匠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任凡涩,我火速辦了婚禮棒搜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘活箕。我一直安慰自己力麸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布育韩。 她就那樣靜靜地躺著克蚂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪筋讨。 梳的紋絲不亂的頭發(fā)上埃叭,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機(jī)與錄音悉罕,去河邊找鬼赤屋。 笑死,一個胖子當(dāng)著我的面吹牛壁袄,可吹牛的內(nèi)容都是我干的类早。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼然想,長吁一口氣:“原來是場噩夢啊……” “哼莺奔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤令哟,失蹤者是張志新(化名)和其女友劉穎恼琼,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體屏富,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡晴竞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了狠半。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片噩死。...
    茶點(diǎn)故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖神年,靈堂內(nèi)的尸體忽然破棺而出已维,到底是詐尸還是另有隱情,我是刑警寧澤已日,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布垛耳,位于F島的核電站,受9級特大地震影響飘千,放射性物質(zhì)發(fā)生泄漏堂鲜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一护奈、第九天 我趴在偏房一處隱蔽的房頂上張望缔莲。 院中可真熱鬧,春花似錦霉旗、人聲如沸痴奏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抛虫。三九已至,卻和暖如春简僧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背雕欺。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工岛马, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人屠列。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓啦逆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親笛洛。 傳聞我的和親對象是個殘疾皇子夏志,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評論 2 353

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