大家好,今天小編來為大家解答spring mvc原理和實(shí)現(xiàn)機(jī)制這個(gè)問題,Spring MVC的工作原理是怎樣的很多人還不知道,現(xiàn)在讓我們一起來看看吧!
spring mvc流程詳解
1、首先創(chuàng)建父容器(AnnotationConfigWebApplicationContext),通過自定義的getRootConfigClasses()拿到配置類,并注冊(cè)到父容器中。
2、通過父容器作為參數(shù)創(chuàng)建ContextLoaderListener監(jiān)聽器。并添加到servletContext(Tomcatservlet容器)。
3、通過自定的getServletConfigClasses()方法拿到MVC的配置類創(chuàng)建子容器,并把配置類注冊(cè)到子容器中。
4、創(chuàng)建DispatcherServlet,并將DispatcherServlet添加到servletContext的Servlet容器中去。
5、設(shè)置dispatcherServlet相關(guān)屬性(啟動(dòng)時(shí)加載,設(shè)置映射路徑)。
springmvc mv vm區(qū)別
springmvcmvvm的區(qū)別是:模式不同。MVVM是MVC的一種設(shè)計(jì)模式,其中MV代表Model,View代表View,Model代表Model。MVVM將視圖從數(shù)據(jù)庫(kù)中提取出來作為Model的一部分,同時(shí)將業(yè)務(wù)邏輯相關(guān)的數(shù)據(jù)對(duì)象作為View的一部分。這樣可以更好地復(fù)用代碼,提高代碼復(fù)用性和可維護(hù)性。
mvc操作流程
SpringMVC工作流程描述:
1.用戶向服務(wù)器發(fā)送請(qǐng)求,請(qǐng)求被Spring前端控制ServeltDispatcherServlet捕獲;
2.DispatcherServlet對(duì)請(qǐng)求URL進(jìn)行解析,得到請(qǐng)求資源標(biāo)識(shí)符(URI)。然后根據(jù)該URI,調(diào)用HandlerMapping獲得該Handler配置的所有相關(guān)的對(duì)象(包括Handler對(duì)象以及Handler對(duì)象對(duì)應(yīng)的攔截器),最后以HandlerExecutionChain對(duì)象的形式返回;
3.DispatcherServlet根據(jù)獲得的Handler,選擇一個(gè)合適的HandlerAdapter;
4.提取Request中的模型數(shù)據(jù),填充Handler入?yún)ⅲ_始執(zhí)行Handler(Controller)。
在填充Handler的入?yún)⑦^程中,根據(jù)你的配置,Spring將幫你做一些額外的工作:
HttpMessageConveter:將請(qǐng)求消息(如Json、xml等數(shù)據(jù))轉(zhuǎn)換成一個(gè)對(duì)象,將對(duì)象轉(zhuǎn)換為指定的響應(yīng)信息。
數(shù)據(jù)轉(zhuǎn)換:對(duì)請(qǐng)求消息進(jìn)行數(shù)據(jù)轉(zhuǎn)換。如String轉(zhuǎn)換成Integer、Double等。
數(shù)據(jù)根式化:對(duì)請(qǐng)求消息進(jìn)行數(shù)據(jù)格式化。如將字符串轉(zhuǎn)換成格式化數(shù)字或格式化日期等。
數(shù)據(jù)驗(yàn)證:驗(yàn)證數(shù)據(jù)的有效性(長(zhǎng)度、格式等),驗(yàn)證結(jié)果存儲(chǔ)到BindingResult或Error中。
5.Handler執(zhí)行完成后,向DispatcherServlet返回一個(gè)ModelAndView對(duì)象;
6.根據(jù)返回的ModelAndView,選擇一個(gè)適合的ViewResolver(必須是已經(jīng)注冊(cè)到Spring容器中的ViewResolver)返回給DispatcherServlet;
7.ViewResolver結(jié)合Model和View,來渲染視圖;
8.將渲染結(jié)果返回給客戶端。
spring 自動(dòng)裝配原理
Spring的自動(dòng)裝配原理是通過依賴注入(DependencyInjection,DI)實(shí)現(xiàn)的。依賴注入是指在創(chuàng)建對(duì)象的過程中,將所依賴的其他對(duì)象(依賴對(duì)象)自動(dòng)注入到目標(biāo)對(duì)象中,從而實(shí)現(xiàn)對(duì)象間的關(guān)系建立和依賴解析。
Spring的自動(dòng)裝配是通過以下方式實(shí)現(xiàn)的:
1.根據(jù)注解:Spring通過掃描帶有特定注解的類,從容器中查找匹配的依賴,并將其注入到目標(biāo)對(duì)象中。常用的注解有@Autowired、@Qualifier、@Resource等。
2.根據(jù)類型:Spring根據(jù)目標(biāo)對(duì)象所聲明的依賴類型,在容器中自動(dòng)查找匹配的依賴,并將其注入。如果存在多個(gè)匹配的依賴,可以使用@Qualifier注解或者泛型限定符來指定具體的依賴對(duì)象。
3.根據(jù)名稱:Spring根據(jù)目標(biāo)對(duì)象所聲明的依賴名稱,在容器中查找名稱匹配的依賴,并將其注入到目標(biāo)對(duì)象中。
自動(dòng)裝配的步驟如下:
1.Spring容器掃描并加載所有的Bean定義。
2.當(dāng)需要?jiǎng)?chuàng)建一個(gè)Bean時(shí),Spring通過Bean的定義信息找到對(duì)應(yīng)的Class,并創(chuàng)建該Class的實(shí)例。
3.對(duì)于該實(shí)例的屬性,Spring會(huì)檢查相應(yīng)的注解或配置來確定是否需要進(jìn)行自動(dòng)裝配。
4.如果需要進(jìn)行自動(dòng)裝配,Spring會(huì)根據(jù)注解、類型或名稱等方式查找匹配的依賴,并將其注入到目標(biāo)對(duì)象的對(duì)應(yīng)屬性中。
5.完成自動(dòng)裝配后,Spring會(huì)調(diào)用Bean的初始化方法,最終將Bean返回給調(diào)用者。
需要注意的是,自動(dòng)裝配是根據(jù)Spring容器中注冊(cè)的Bean定義和配置信息來實(shí)現(xiàn)的。所以,在使用自動(dòng)裝配時(shí),確保類和依賴對(duì)象正確地注冊(cè)到Spring容器中,并配置正確的注解或配置信息,以便正確地進(jìn)行自動(dòng)裝配。
總結(jié)一下,Spring的自動(dòng)裝配原理是利用依賴注入來實(shí)現(xiàn)的,通過掃描注解、類型或名稱等方式,自動(dòng)查找匹配的依賴,并將其注入到目標(biāo)對(duì)象中,從而實(shí)現(xiàn)對(duì)象之間的關(guān)系建立和依賴解析。
如何實(shí)現(xiàn)MVC模式
最簡(jiǎn)單的方法是使用struts或jsf等mvc的框架,本身就是一個(gè)實(shí)現(xiàn)。如果自己實(shí)現(xiàn),比較復(fù)雜的就是要自己寫一個(gè)總控制器,接受所有用戶的請(qǐng)求,進(jìn)行分發(fā)給其他servlet或直接進(jìn)行頁(yè)面跳轉(zhuǎn)。不建議自己實(shí)現(xiàn),建議使用一個(gè)mvc框架,然后搞明白他的生命周期和原理,再去看框架總控制器的源代碼,這樣比較好。
原理:
jsp發(fā)展經(jīng)歷了兩個(gè)模型時(shí)代,jsp模型一時(shí)代是把代碼都寫在jsp頁(yè)面上,用戶訪問jsp頁(yè)面時(shí),jsp頁(yè)面來對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作并返回值到j(luò)sp頁(yè)面,這樣第一不好維護(hù),第二安全性不高,第三代碼結(jié)構(gòu)不清晰,第四重用性不高。于是就有了jsp模型二時(shí)代,人們將所有的頁(yè)面請(qǐng)求交給一個(gè)servlet控制器來接受,然后進(jìn)行分發(fā),由該servlet來決定調(diào)用其他servlet訪問數(shù)據(jù)庫(kù)還是進(jìn)行頁(yè)面跳轉(zhuǎn),這個(gè)servelt就是MVC中的C,struts中好像叫ActionServlet,Jsf中叫FacesServelt,web.xml中配置的就是總servlet控制器,為了更好的分層,重用,降低依賴性,就有了MVC,由M層接受和綁定用戶的數(shù)據(jù),V層進(jìn)行展現(xiàn),C層進(jìn)行控制。
目前主流的開發(fā)模式是四層開發(fā)模式:界面層(page)+動(dòng)作處理層(action)+業(yè)務(wù)邏輯層(service)+數(shù)據(jù)訪問層(dao),page層用于展現(xiàn)頁(yè)面,action層用于捕獲用戶事件并調(diào)用service層處理業(yè)務(wù)邏輯,service要處理業(yè)務(wù)邏輯肯定就要對(duì)數(shù)據(jù)庫(kù)進(jìn)行增刪改查,拼接HQL語(yǔ)句,然后調(diào)用dao層對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,hibernate完成的就是DAO層。但是這樣一來action層對(duì)service層產(chǎn)生了依賴,因?yàn)橐獎(jiǎng)?chuàng)建一個(gè)service接口的引用,service層對(duì)dao層產(chǎn)生了依賴,就是說實(shí)例化一個(gè)action層的對(duì)象,同時(shí)要至少實(shí)例化一個(gè)service層和至少實(shí)例化一個(gè)dao層,于是spring的IOC就可以起作用了,就可以降低各層之間的依賴。將各層做為接口對(duì)象實(shí)例配置到spring中,降低依賴。
關(guān)于spring mvc原理和實(shí)現(xiàn)機(jī)制到此分享完畢,希望能幫助到您。