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