日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

SpringMVC工作原理

發(fā)布時(shí)間:2023/12/18 javascript 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringMVC工作原理 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

大家好,我是IT修真院深圳分院第十一期學(xué)員,一枚正直純潔善良的JAVA程序員。

今天給大家分享一下,修真院官網(wǎng)JAVA任務(wù)二的一個(gè)知識(shí)點(diǎn):SpringMVC工作原理

1、背景介紹

一:背景介紹

JavaWeb經(jīng)歷的幾個(gè)變化:

1:Jsp Model1第一代

2:JSP Model1第二代

3:JSP Model2

1)Jsp Model1第一代

JSP Model1是JavaWeb早期的模型,它適合小型Web項(xiàng)目,開發(fā)成本低!Model1第一代時(shí)期,服務(wù)器端只有JSP頁面,所有的操作都在JSP頁面中,連訪問數(shù)據(jù)庫的API也在JSP頁面中完成。也就是說,所有的東西都耦合在一起,對(duì)后期的維護(hù)和擴(kuò)展極為不利。

2)JSP Model1第二代

JSP Model1第二代,把業(yè)務(wù)邏輯的內(nèi)容放到了JavaBean中,而JSP頁面負(fù)責(zé)顯示以及請(qǐng)求調(diào)度的工作。而視圖工作和請(qǐng)求調(diào)度(控制器)放在一起會(huì)產(chǎn)生一定的耦合,所以依然不太完善。

3)JSP Model2

JSP Model2模式:可以清晰的看到MVC完整的結(jié)構(gòu)了。

-JSP:視圖層,用來與用戶打交道。負(fù)責(zé)接收用來的數(shù)據(jù),以及顯示數(shù)據(jù)給用戶;

-Servlet:控制層,負(fù)責(zé)找到合適的模型對(duì)象來處理業(yè)務(wù)邏輯,轉(zhuǎn)發(fā)到合適的視圖;

-JavaBean:模型層,完成具體的業(yè)務(wù)工作,例如:數(shù)據(jù)的查詢,更新等。

1.1 在講SpringMVC之前我們先來看一下什么是MVC模式

MVC:MVC是一種設(shè)計(jì)模式

M-Model 模型(完成業(yè)務(wù)邏輯:有javaBean構(gòu)成,service+dao+entity)

V-View 視圖(做界面的展示 jsp,html……)

C-Controller 控制器(接收請(qǐng)求—>調(diào)用模型—>根據(jù)結(jié)果派發(fā)頁面)

1.2 MVC的原理圖:

1.3 SpringMVC是什么:

SpringMVC是一個(gè)MVC的開源框架,SpringMVC=struts2+Spring,SpringMVC就相當(dāng)于是Struts2加上Spring的整合,但是這里有一個(gè)疑惑就是,SpringMVC和Spring是什么樣的關(guān)系呢?這個(gè)在百度百科上有一個(gè)很好的解釋:意思是說,SpringMVC是Spring的一個(gè)后續(xù)產(chǎn)品,其實(shí)就是Spring在原有基礎(chǔ)上,又提供了Web應(yīng)用的MVC模塊,可以簡(jiǎn)單的把SpringMVC理解為是Spring的一個(gè)模塊(類似AOP,IOC這樣的模塊),網(wǎng)絡(luò)上經(jīng)常會(huì)說SpringMVC和Spring無縫集成,其實(shí)SpringMVC就是Spring的一個(gè)子模塊,所以根本不需要同Spring進(jìn)行整合。

2、知識(shí)剖析

2.1 SpringMVC的原理圖:

https://images2015.cnblogs.co... 2.2 SpringMVC步驟詳解

看到這個(gè)圖大家可能會(huì)有很多的疑惑,現(xiàn)在我們來看一下這個(gè)圖的步驟:(可以對(duì)比MVC的原理圖進(jìn)行理解)

第一步:用戶發(fā)起請(qǐng)求到前端控制器(DispatcherServlet)

第二步:前端控制器請(qǐng)求處理器映射器(HandlerMappering)去查找處理器(Handle):通過xml配置或者注解進(jìn)行查找

第三步:找到以后處理器映射器(HandlerMappering)像前端控制器返回執(zhí)行鏈(HandlerExecutionChain)

第四步:前端控制器(DispatcherServlet)調(diào)用處理器適配器(HandlerAdapter)去執(zhí)行處理器(Handler)

第五步:處理器適配器去執(zhí)行Handler

第六步:Handler執(zhí)行完給處理器適配器返回ModelAndView

第七步:處理器適配器向前端控制器返回ModelAndView

第八步:前端控制器請(qǐng)求視圖解析器(ViewResolver)去進(jìn)行視圖解析

第九步:視圖解析器像前端控制器返回View

第十步:前端控制器對(duì)視圖進(jìn)行渲染

第十一步:前端控制器向用戶響應(yīng)結(jié)果

2.3 SpringMVC中的組件

看到這些步驟我相信大家很感覺非常的亂,這是正常的,接下來給大家介紹一下SpringMVC中的幾個(gè)組件:

1、前端控制器DispatcherServlet

作用:接收請(qǐng)求,響應(yīng)結(jié)果,降低其它組件之間的耦合度。

用戶請(qǐng)求到達(dá)前端控制器,它就相當(dāng)于MVC模式中的C,DispatcherServlet是整個(gè)流程控制的中心,由它調(diào)用其它組件處理用戶的請(qǐng)求。

2、處理器映射器HandlerMapping

作用:根據(jù)請(qǐng)求的url查找Handler

HandlerMapping負(fù)責(zé)根據(jù)用戶請(qǐng)求找到Handler即處理器,SpringMVC提供了不同的映射器實(shí)現(xiàn)不同的映射方式,例如:配置文件方式,實(shí)現(xiàn)接口方式,注解方式等。

3、處理器適配器HandlerAdapter

作用:按照特定規(guī)則(HandlerAdapter要求的規(guī)則)去執(zhí)行Handler

通過HandlerAdapter對(duì)處理器進(jìn)行執(zhí)行,這是適配器模式的應(yīng)用,通過擴(kuò)展適配器可以對(duì)更多類型的處理器進(jìn)行執(zhí)行。

4、處理器Handler

注意:編寫Handler時(shí)按照HandlerAdapter的要求去做,這樣適配器才可以去正確執(zhí)行Handler

Handler 是繼DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler對(duì)具體的用戶請(qǐng)求進(jìn)行處理。

由于Handler涉及到具體的用戶業(yè)務(wù)請(qǐng)求,所以一般情況需要工程師根據(jù)業(yè)務(wù)需求開發(fā)Handler。

5、視圖解析器View resolver

作用:進(jìn)行視圖解析,根據(jù)邏輯視圖名解析成真正的視圖(view)

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

6、視圖View

View是一個(gè)接口,實(shí)現(xiàn)類支持不同的View類型(jsp、freemarker、pdf...)

【組件說明】

以下組件通常使用框架提供實(shí)現(xiàn):

前端控制器(DispatcherServlet)

處理器映射器(HandlerMapping)

處理器適配器(HandlAdapter)

視圖解析器(ViewResolver)

3、常見問題

3.1 Controller返回值設(shè)置錯(cuò)誤,導(dǎo)致404報(bào)錯(cuò)。

例如:頁面名為index.jsp,但Controller中相關(guān)語句設(shè)定的返回值為inde,頁面就會(huì)報(bào)錯(cuò)404.

if(loginUser!=null){request.setAttribute("loginUser", loginUser.getName());return "inde";

3.2 如何解決POST請(qǐng)求中文亂碼問題。

3.3 運(yùn)行mvn jetty run,報(bào)錯(cuò)

【java.lang.IllegalStateException: Duplicate fragment name: spring_web for jar:file:/D:/Maven/repo/org/springframework/spring-web/4.2.5.RELEASE/spring-web-4.2.5.RELEASE.jar!/META-INF/web-fragment.xmlandjar:file:/D:/Maven/repo/org/springframework/org.springframework.web/3.2.2.RELEASE/org.springframework.web-3.2.2.RELEASE.jar!/META-INF/web-fragment.xml】

4、解決方案

4.1 編寫項(xiàng)目時(shí)注意編碼規(guī)范,注意IDEA中的提示 ,在可能有問題的代碼下會(huì)加上波浪線來提示。

4.2 在web.xml中加入過濾器:

<!-- 過濾通過用于處理項(xiàng)目中的亂碼問題,該過濾器位于org.springframework.web.filter包中,指向類CharacterEncodingFilter --> <filter> <description>字符集過濾器</description> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <description>字符集編碼</description> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>

4.3 spring-web和org.springframework.web.servlet中都有一個(gè)web-fragment.xml文件,導(dǎo)致jetty讀取時(shí)報(bào)錯(cuò)。

<dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency><groupId>org.springframework</groupId><artifactId>org.springframework.web.servlet</artifactId><version>3.2.2.RELEASE</version> </dependency>

解決辦法:將第一個(gè)spring-web刪掉就好了……

這個(gè)錯(cuò)誤很奇怪,在使用Tomcat的時(shí)候,這兩個(gè)都是必須存在的,但是使用jetty的時(shí)候就會(huì)報(bào)錯(cuò)。

5、編碼實(shí)戰(zhàn)

6、擴(kuò)展思考

6.1 springMVC和struts2的區(qū)別有哪些?

(1)springmvc的入口是一個(gè)servlet即前端控制器(DispatchServlet),而struts2入口是一個(gè)filter過慮器(StrutsPrepareAndExecuteFilter)。

(2)springmvc是基于方法開發(fā)(一個(gè)url對(duì)應(yīng)一個(gè)方法),請(qǐng)求參數(shù)傳遞到方法的形參,可以設(shè)計(jì)為單例或多例(建議單例),struts2是基于類開發(fā),傳遞參數(shù)是通過類的屬性,只能設(shè)計(jì)為多例。

(3)Struts采用值棧存儲(chǔ)請(qǐng)求和響應(yīng)的數(shù)據(jù),通過OGNL存取數(shù)據(jù),springmvc通過參數(shù)解析器是將request請(qǐng)求內(nèi)容解析,并給方法形參賦值,將數(shù)據(jù)和視圖封裝成ModelAndView對(duì)象,最后又將ModelAndView中的模型數(shù)據(jù)通過reques域傳輸?shù)巾撁妗sp視圖解析器默認(rèn)使用jstl。

6.2 Springmvc的優(yōu)點(diǎn):

(1)它是基于組件技術(shù)的。全部的應(yīng)用對(duì)象,無論控制器和視圖,還是業(yè)務(wù)對(duì)象之類的都是 java組件.并且和Spring提供的其他基礎(chǔ)結(jié)構(gòu)緊密集成.

(2)不依賴于Servlet API(目標(biāo)雖是如此,但是在實(shí)現(xiàn)的時(shí)候確實(shí)是依賴于Servlet的)

(3)可以任意使用各種視圖技術(shù),而不僅僅局限于JSP

(4) 支持各種請(qǐng)求資源的映射策略

(5)它應(yīng)是易于擴(kuò)展的

7、 參考文獻(xiàn)

百度

8、更多討論

8.1 Controller并未直接收到用戶請(qǐng)求,它怎么能處理用戶的請(qǐng)求?

前端Servlet接受到用戶請(qǐng)求后,通常會(huì)對(duì)用戶請(qǐng)求進(jìn)行簡(jiǎn)單預(yù)處理,然后通過反射來創(chuàng)建Controller實(shí)例,并調(diào)用指定的方法來處理用戶請(qǐng)求。

8.2當(dāng)Servlet攔截到用戶請(qǐng)求后,它如何知道創(chuàng)建哪個(gè)接口的實(shí)例呢?

有兩種方法,第一種是使用xml文件,在xml文件中描述請(qǐng)求對(duì)應(yīng)使用的類,告訴MVC應(yīng)該去哪找

第二種是使用注解,使用@Controller描述一個(gè)類,然后用@RequestMapping來描述對(duì)應(yīng)的方法。

8.3SpringMVC常用的注解有哪些?

@Controller @RequestMapping 等

今天的分享就到這里啦,歡迎大家點(diǎn)贊、轉(zhuǎn)發(fā)、留言、拍磚~

總結(jié)

以上是生活随笔為你收集整理的SpringMVC工作原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。