Spring MVC 原理總結(jié)

MVC設(shè)計思想:

基于java的web 應(yīng)用系統(tǒng)采用的mvc架構(gòu)模式,即model(模型),view(視圖),controller(控制器)分離設(shè)計
Model 即處理業(yè)務(wù)邏輯的模塊, 每一種處理一個模塊
View負(fù)責(zé)頁面顯示,顯示Model處理結(jié)果給用戶,主要實現(xiàn)數(shù)據(jù)到頁面轉(zhuǎn)換過程
Controller負(fù)責(zé)每個請求的分發(fā),把Form數(shù)據(jù)傳遞給Model處理,把處理結(jié)果的數(shù)據(jù)傳遞給View

1. 什么是MVC?

MVC是一種架構(gòu)模式 --- 程序分層,分工合作,既相互獨立,又協(xié)同工作
MVC核心思想:業(yè)務(wù)數(shù)據(jù)抽取同業(yè)務(wù)數(shù)據(jù)實現(xiàn)相分離
總結(jié):
模型層(M) :業(yè)務(wù)數(shù)據(jù)的信息表示,關(guān)注支撐業(yè)務(wù)的信息構(gòu)成,通常是多個業(yè)務(wù)實體的組合;
視圖層(V): 為用戶提供UI,重點關(guān)注數(shù)據(jù)的呈現(xiàn);
控制器(C) : 相當(dāng)于一個總調(diào)配中心,接受用戶請求,并調(diào)用相應(yīng)的模型處理最后通過視圖給用戶進(jìn)行展示);

MVC(Model-View-Controller)設(shè)計思想

即把一個應(yīng)用的輸入、處理、輸出流程按照Model、View、Controller的方式進(jìn)行分離,這樣一個應(yīng)用被分成三個層——模型層、視圖層、控制層。

視圖(View)代表用戶交互界面;

模型(Model):就是業(yè)務(wù)流程/狀態(tài)的處理以及業(yè)務(wù)規(guī)則的制定。
  業(yè)務(wù)模型還有一個很重要的模型那就是數(shù)據(jù)模型。數(shù)據(jù)模型主要指實體對象的數(shù)據(jù) 保存(持續(xù)化)。

控制(Controller)可以理解為從用戶接收請求, 將模型與視圖匹配在一起,共同完成用戶的請求.

MVC的優(yōu)點

大部分用過程語言比如ASP、PHP開發(fā)出來的Web應(yīng)用,初始的開發(fā)模板就是混合層的數(shù)據(jù)編程。例如,直接向數(shù)據(jù)庫發(fā)送請求并用HTML顯示,開發(fā)速度往往比較快,但由于數(shù)據(jù)頁面的分離不是很直接,因而很難體現(xiàn)出業(yè)務(wù)模型的樣子或者模型的重用性。產(chǎn)品設(shè)計彈性力度很小,很難滿足用戶的變化性需求。MVC要求對應(yīng)用分層,雖然要花費額外的工作,但產(chǎn)品的結(jié)構(gòu)清晰,產(chǎn)品的應(yīng)用通過模型可以得到更好地體現(xiàn)。


2 什么是springMVC?

springMVC是一種web層mvc框架,用于替代servlet(處理|響應(yīng)請求,獲取表單參數(shù),表單校驗等)。

為什么要用springMVC?

基本上,框架的作用就是用來簡化編程的,相對于servlet來說,獲取表單參數(shù),響應(yīng)請求等變得更簡單了。

SpringMVC 工作流出圖:

springmvc的工作機制

在容器初始化時會建立所有url和controller的對應(yīng)關(guān)系,保存到Map<url,controller>中.tomcat啟動時會通知spring初始化容器(加載bean的定義信息和初始化所有單例bean),然后springmvc會遍歷容器中的bean,獲取每一個controller中的所有方法訪問的url,然后將url和controller保存到一個Map中;

這樣就可以根據(jù)request快速定位到controller,因為最終處理request的是controller中的方法,Map中只保留了url和controller中的對應(yīng)關(guān)系,所以要根據(jù)request的url進(jìn)一步確認(rèn)controller中的method,這一步工作的原理就是拼接controller的url(controller上@RequestMapping的值)和方法的url(method上@RequestMapping的值),與request的url進(jìn)行匹配,找到匹配的那個方法;

確定處理請求的method后,接下來的任務(wù)就是參數(shù)綁定,把request中參數(shù)綁定到方法的形式參數(shù)上,這一步是整個請求處理過程中最復(fù)雜的一個步驟。springmvc提供了兩種request參數(shù)與方法形參的綁定方法:

① 通過注解進(jìn)行綁定,@RequestParam

② 通過參數(shù)名稱進(jìn)行綁定.使用注解進(jìn)行綁定,我們只要在方法參數(shù)前面聲明@RequestParam("a"),就可以將request中參數(shù)a的值綁定到方法的該參數(shù)上.使用參數(shù)名稱進(jìn)行綁定的前提是必須要獲取方法中參數(shù)的名稱,Java反射只提供了獲取方法的參數(shù)的類型,并沒有提供獲取參數(shù)名稱的方法.springmvc解決這個問題的方法是用asm框架讀取字節(jié)碼文件,來獲取方法的參數(shù)名稱.asm框架是一個字節(jié)碼操作框架,關(guān)于asm更多介紹可以參考它的官網(wǎng).個人建議,使用注解來完成參數(shù)綁定,這樣就可以省去asm框架的讀取字節(jié)碼的操作.

springMVC流程

  1. 用戶發(fā)送請求至前端控制器DispatcherServle
    注:DispatcherServlet作為springMVC的前端控制器,負(fù)責(zé)接收用戶的請求并根據(jù)用戶的請求返回相應(yīng)的視圖給用戶(分發(fā)調(diào)度);相當(dāng)于中央處理器,是整個流程控制的中心,有了dispatcherServlet減少了其它組件之間的耦合度。

  2. 前端控制器(DispatcherServlet): 用戶請求到達(dá)前端控制器,dispatcherServlet調(diào)用HandlerMapping(處理器映射器)。

3 處理器映射器(HandlerMapping) :前端控制器根據(jù)用戶的url,請求處理器映射器(HandlerMapping)查找匹配該url的handler,并返回一個執(zhí)行鏈(HandlerExecutionChain)。

*4 前端控制器收到HandlerMapping返還的Handler信息后,再請求處理器適配器(HandlerAdapter)調(diào)用相應(yīng)的handler進(jìn)行處理并返回給前端控制器一modelAndView。

處理器適配器(HandlerAdapter): HandlerAdapter根據(jù)DispatcherServlet 發(fā)來的handler信息找到具體的處理器,生成處理器對象及處理器攔截器(如果有則生成)一并返回給DispatcherServlet。

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

5 前端控制器拿到modelAndView之后,再請求視圖解析器(ViewResolver)進(jìn)行解析。

  • 視圖解析器View resolver: 負(fù)責(zé)將處理結(jié)果生成View視圖。
    (View Resolver首先根據(jù)邏輯視圖名,解析成物理視圖名(具體的頁面地址),再生成View視圖對象,最后對View進(jìn)行渲染將處理結(jié)果通過頁面展示給用戶。 springmvc框架提供了很多的View視圖類型,包括:jstlView、freemarkerView、pdfView等)

6 最后前端控制器將返回的視圖進(jìn)行渲染并把數(shù)據(jù)裝入到request域,返回給用戶。* 視圖View**(需要工程師開發(fā)) : View是一個接口,實現(xiàn)類支持不同的View類型(jsp、freemarker、pdf...)

為什么叫前端控制器?前端又是什么?

舉個例子:假如你去醫(yī)院看病,通過向分診臺的醫(yī)院描述自己的病情,就可以得到醫(yī)生的指導(dǎo)具體去看外科、內(nèi)科或者神經(jīng)科等等,這里我們的分診臺就扮演著前端控制器(Dispatcher)的角色,也叫做調(diào)度器,而各個科室就扮演著控制器(Controller)的角色,因為分診臺是在具體各個科室之前,所以這個模式就叫做前端控制器。


3 說說spring mvc中常用注解有哪些,分別什么作用?

@Controller標(biāo)識這個類是一個控制器
@RestController= @Controller+ @ResponseBody
@Autowired 根據(jù)SpringMVC的依賴注入通過包掃描自動注入
@Resource 根據(jù)SpringMVC的依賴注入通過配置文件注入
@Service 用來聲明業(yè)務(wù)層
@RequestMapping給控制器方法綁定一個uri/ 用來定義訪問接口,可以在類名和方法上使用
@ResponseBody將java對象轉(zhuǎn)成json,并且發(fā)送給客戶端
@RequestBody將客戶端請求過來的json轉(zhuǎn)成java對象
@RequestParam當(dāng)表單參數(shù)和方法形參名字不一致時,做一個名字映射
@PathVarible用于獲取uri中的參數(shù),比如user/1中1的值
Rest風(fēng)格的新api
@GetMapping@DeleteMapping@PostMapping@PutMapping
其他注解
@SessionAttribute聲明將什么模型數(shù)據(jù)存入session
@CookieValue獲取cookie值
@ModelAttribute將方法返回值存入model中
@HeaderValue獲取請求頭中的值

4 如何在spring mvc實現(xiàn)RESTful 服務(wù)

1,導(dǎo)入jackson2包
2,開啟注解驅(qū)動<mvc:annotation-driven/>
3,json交互=@RequestBody @ResponseBody

5 WebService如何與客戶端交互

① webServices通過SOAP協(xié)議進(jìn)行參數(shù)的接收與返回值的傳遞。
② SOAP協(xié)議在web上提供軟件服務(wù),使用WSDL文件進(jìn)行說明,通過UDDI進(jìn)行注冊
③ WSDL文件是一個XML文檔,用于說明一組SOAP消息以及如何交換這些信息,大多數(shù)情況下由軟件自動生成和使用
④ XML是一種擴展型可標(biāo)記語言,面向短期臨時數(shù)據(jù)和萬維網(wǎng)絡(luò)。
⑤ UDDI是一個主要針對web服務(wù)供應(yīng)商和使用者的項目,在用戶能夠調(diào)用web服務(wù)之前,必須確定這個服務(wù)包含哪些商務(wù)方法,找到被調(diào)用的接口定義,還要服務(wù)端來編制軟件;UDDI是一種根據(jù)描述文章來引導(dǎo)系統(tǒng)查找響應(yīng)服務(wù)的機制,UDDI利用SOAP消息機制來發(fā)布、編譯、瀏覽及查找注冊信息,它采用XML格式來封裝各種不同類型的數(shù)據(jù),并且發(fā)送到注冊中心來返回需要的數(shù)據(jù)。

6 什么是攔截器?有什么用?spring mvc如何定義攔截器?

what:
類似于filter的一個對象,用于預(yù)處理以及后處理處理器(控制器)。
how:
新建class實現(xiàn)HandlerInterceptor重寫三個方法:
preHandler
postHandler
afterCompletion
springmvc.xml中配置攔截器

7 springMVC與struts2的區(qū)別

一、攔截機制的不同
  Struts2是類級別的攔截,每次請求就會創(chuàng)建一個Action,和Spring整合時Struts2的ActionBean注入作用域是原型模式prototype,然后通過setter,getter把request數(shù)據(jù)注入到屬性。Struts2中,一個Action對應(yīng)一個request,response上下文,在接收參數(shù)時,可以通過屬性接收,這說明屬性參數(shù)是讓多個方法共享的。Struts2中Action的一個方法可以對應(yīng)一個url,而其類屬性卻被所有方法共享,這也就無法用注解或其他方式標(biāo)識其所屬方法了,只能設(shè)計為多例。

SpringMVC是方法級別的攔截,一個方法對應(yīng)一個Request上下文,所以方法直接基本上是獨立的,獨享request,response數(shù)據(jù)。而每個方法同時又何一個url對應(yīng),參數(shù)的傳遞是直接注入到方法中的,是方法所獨有的。處理結(jié)果通過ModeMap返回給框架。在Spring整合時,SpringMVC的Controller Bean默認(rèn)單例模式Singleton,所以默認(rèn)對所有的請求,只會創(chuàng)建一個Controller,有應(yīng)為沒有共享的屬性,所以是線程安全的,如果要改變默認(rèn)的作用域,需要添加@Scope注解修改。

Struts2有自己的攔截Interceptor機制,SpringMVC這是用的是獨立的Aop方式,這樣導(dǎo)致Struts2的配置文件量還是比SpringMVC大。
二、底層框架的不同
  Struts2采用Filter(StrutsPrepareAndExecuteFilter)實現(xiàn),SpringMVC(DispatcherServlet)則采用Servlet實現(xiàn)。Filter在容器啟動之后即初始化;服務(wù)停止以后墜毀,晚于Servlet。Servlet在是在調(diào)用時初始化,先于Filter調(diào)用,服務(wù)停止后銷毀。
三、性能方面
  Struts2是類級別的攔截,每次請求對應(yīng)實例一個新的Action,需要加載所有的屬性值注入,SpringMVC實現(xiàn)了零配置,由于SpringMVC基于方法的攔截,有加載一次單例模式bean注入。所以,SpringMVC開發(fā)效率和性能高于Struts2。
四、配置方面
  spring MVC和Spring是無縫的。從這個項目的管理和安全上也比Struts2高。

8 .攔截器和過濾器的區(qū)別

① 攔截器inteceptor是基于java的反射機制實現(xiàn)的;
過濾器Filter是基于函數(shù)回調(diào)實現(xiàn)(filter接口中的doFilter方法是回調(diào)函數(shù)實現(xiàn)的)
② 攔截器不依賴于servlet容器;
過濾器filter依賴servlet,沒有servlet無法回調(diào)doFilter
③ 攔截器只能對action請求起作用;
而filter可以對所有請求起作用,filter過濾范圍比攔截器大
④ 攔截器可以訪問action上下文,值棧里的對象;
而過濾器filter不能;
⑤ 在action的生命周期中,攔截器可以多次被調(diào)用;
而過濾器只能在容器初始化時被調(diào)用一次;
⑥ 攔截器可以獲取IOC容器中的各個bean,而過濾器不行;


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • SpringMVC的工作原理圖: SpringMVC的工作原理圖: SpringMVC流程 1、 用戶發(fā)送請求至前...
    我不餓我不想吃東西閱讀 914評論 0 1
  • 前言 對于Spring MVC項目搭建相信大家按照網(wǎng)上教程來做基本都會,但更多時候我們應(yīng)該多問幾個為什么,多思考實...
    九風(fēng)萍舟閱讀 2,833評論 0 12
  • 1.Spring背景 1.1.Spring四大原則: 使用POJO進(jìn)行輕量級和最侵入式開發(fā); 通過依賴注入和基于借...
    嗷大彬彬閱讀 917評論 0 2
  • 一 什么是spring mvc springMVC是spring框架的一個模塊,springMVC和spring無...
    敲程序的人生閱讀 212評論 0 1
  • 暗時間簡單的說就是思維的時間,也就是沒有產(chǎn)生直接成果的時間。一個人走路、買菜、洗臉洗手、坐公車、逛街、出游、吃飯、...
    不愛下雨天閱讀 338評論 0 0

友情鏈接更多精彩內(nèi)容