SpringMVC工作原理

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

今天給大家分享一下,修真院官網JAVA任務二的一個知識點:SpringMVC工作原理

1、背景介紹

一:背景介紹

JavaWeb經歷的幾個變化:

1:Jsp Model1第一代

2:JSP Model1第二代

3:JSP Model2

1)Jsp Model1第一代

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

clipboard.png

2)JSP Model1第二代

JSP Model1第二代,把業務邏輯的內容放到了JavaBean中,而JSP頁面負責顯示以及請求調度的工作。而視圖工作和請求調度(控制器)放在一起會產生一定的耦合,所以依然不太完善。

clipboard.png

3)JSP Model2

JSP Model2模式:可以清晰的看到MVC完整的結構了。

-JSP:視圖層,用來與用戶打交道。負責接收用來的數據,以及顯示數據給用戶;

-Servlet:控制層,負責找到合適的模型對象來處理業務邏輯,轉發到合適的視圖;

-JavaBean:模型層,完成具體的業務工作,例如:數據的查詢,更新等。

clipboard.png

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

MVC:MVC是一種設計模式

M-Model 模型(完成業務邏輯:有javaBean構成,service+dao+entity)

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

C-Controller 控制器(接收請求—>調用模型—>根據結果派發頁面)

1.2 MVC的原理圖:

clipboard.png

1.3 SpringMVC是什么:

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

2、知識剖析

2.1 SpringMVC的原理圖:

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

clipboard.png

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

第一步:用戶發起請求到前端控制器(DispatcherServlet)

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

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

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

第五步:處理器適配器去執行Handler

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

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

第八步:前端控制器請求視圖解析器(ViewResolver)去進行視圖解析

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

第十步:前端控制器對視圖進行渲染

第十一步:前端控制器向用戶響應結果

2.3 SpringMVC中的組件

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

1、前端控制器DispatcherServlet

作用:接收請求,響應結果,降低其它組件之間的耦合度。

用戶請求到達前端控制器,它就相當于MVC模式中的C,DispatcherServlet是整個流程控制的中心,由它調用其它組件處理用戶的請求。

2、處理器映射器HandlerMapping

作用:根據請求的url查找Handler

HandlerMapping負責根據用戶請求找到Handler即處理器,SpringMVC提供了不同的映射器實現不同的映射方式,例如:配置文件方式,實現接口方式,注解方式等。

3、處理器適配器HandlerAdapter

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

通過HandlerAdapter對處理器進行執行,這是適配器模式的應用,通過擴展適配器可以對更多類型的處理器進行執行。

4、處理器Handler

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

Handler 是繼DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler對具體的用戶請求進行處理。

由于Handler涉及到具體的用戶業務請求,所以一般情況需要工程師根據業務需求開發Handler。

5、視圖解析器View resolver

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

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

6、視圖View

View是一個接口,實現類支持不同的View類型(jsp、freemarker、pdf...)

【組件說明】

以下組件通常使用框架提供實現:

前端控制器(DispatcherServlet)

處理器映射器(HandlerMapping)

處理器適配器(HandlAdapter)

視圖解析器(ViewResolver)

3、常見問題

3.1 Controller返回值設置錯誤,導致404報錯。

例如:頁面名為index.jsp,但Controller中相關語句設定的返回值為inde,頁面就會報錯404.

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

3.2 如何解決POST請求中文亂碼問題。

3.3 運行mvn jetty run,報錯

【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 編寫項目時注意編碼規范,注意IDEA中的提示 ,在可能有問題的代碼下會加上波浪線來提示。

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

<!-- 過濾通過用于處理項目中的亂碼問題,該過濾器位于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中都有一個web-fragment.xml文件,導致jetty讀取時報錯。

<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>

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

這個錯誤很奇怪,在使用Tomcat的時候,這兩個都是必須存在的,但是使用jetty的時候就會報錯。

5、編碼實戰

6、擴展思考

6.1 springMVC和struts2的區別有哪些?

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

(2)springmvc是基于方法開發(一個url對應一個方法),請求參數傳遞到方法的形參,可以設計為單例或多例(建議單例),struts2是基于類開發,傳遞參數是通過類的屬性,只能設計為多例。

(3)Struts采用值棧存儲請求和響應的數據,通過OGNL存取數據,springmvc通過參數解析器是將request請求內容解析,并給方法形參賦值,將數據和視圖封裝成ModelAndView對象,最后又將ModelAndView中的模型數據通過reques域傳輸到頁面。Jsp視圖解析器默認使用jstl。

6.2 Springmvc的優點:

(1)它是基于組件技術的。全部的應用對象,無論控制器和視圖,還是業務對象之類的都是 java組件.并且和Spring提供的其他基礎結構緊密集成.

(2)不依賴于Servlet API(目標雖是如此,但是在實現的時候確實是依賴于Servlet的)

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

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

(5)它應是易于擴展的

7、 參考文獻

百度

8、更多討論

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

前端Servlet接受到用戶請求后,通常會對用戶請求進行簡單預處理,然后通過反射來創建Controller實例,并調用指定的方法來處理用戶請求。

8.2當Servlet攔截到用戶請求后,它如何知道創建哪個接口的實例呢?

有兩種方法,第一種是使用xml文件,在xml文件中描述請求對應使用的類,告訴MVC應該去哪找

第二種是使用注解,使用@Controller描述一個類,然后用@RequestMapping來描述對應的方法。

8.3SpringMVC常用的注解有哪些?

@Controller @RequestMapping 等

今天的分享就到這里啦,歡迎大家點贊、轉發、留言、拍磚~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/450036.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450036.shtml
英文地址,請注明出處:http://en.pswp.cn/news/450036.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android應用開發—如何解決handler的警告:Handler Class Should be Static or Leaks Occur

轉自android handler的警告Handler Class Should be Static or Leaks Occur 在使用Handler更新UI的時候&#xff0c;我是這樣寫的&#xff1a; public class SampleActivity extends Activity {private final Handler mLeakyHandler new Handler() {Overridepublic void hand…

從遠程(包括ftp,http等協議)地址獲取文件流信息

URL url new URL("ftp://172.18.251.155:8010/recordsImg/2019-01-28/000008_1548649813267.jpg"); MultipartFile multipartFile new MockMultipartFile(fileName,fileName,"", url.openStream());轉載于:https://www.cnblogs.com/baihaojie/p/10331134…

shell 數組

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1&#xff09;定義數組&#xff1a; my_array(1 2 3 4) 也可這樣賦值&#xff1a;my_array[4]愛 讀取&#xff1a; echo ${my_array[2]…

nodejs 實現文件拷貝

通過4中不通的方式實現對一個文件的拷貝 方式一&#xff1a;readFile 異步一次性讀取文件再寫入 //異步形式讀取文件 function copyFile(url){const extName path.extname(url)const fileName path.basename(url)const dirName path.dirname(url)fs.readFile(url, (err, dat…

國家部委對4G調研:未定給中電信聯通發放牌照

一場有關4G牌照發放的論戰正在發酵&#xff0c;矛盾的核心在于&#xff0c;除了中移動外&#xff0c;政府是否也會向中電信和聯通發放TD-LTE(中國主導的4G標準)牌照 記者 王云輝 雍忠瑋 一場圍繞4G的新博弈已經白熱化。 “多個國家部委正在對4G展開全面調研&#xff0c;但最終如…

Luogu4735 最大異或和

題目藍鏈 Description 給你一個序列&#xff0c;你需要支持以下兩個操作&#xff1a; A x: 在序列尾部添加一個整數\(x\)&#xff0c;序列的長度增加\(1\)Q l r x: 詢問操作&#xff0c;你需要找到一個位置\(p \in [l, r]\)&#xff0c;使得&#xff1a;\(x \bigoplus a_p \big…

Spring-jdbc:JdbcTemplate使用簡介

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 為了使 JDBC 更加易于使用,Spring 在 JDBCAPI 上定義了一個抽象層, 以此建立一個JDBC存取框架. 作為 SpringJDBC 框架的核心, JDBC 模板…

Java多線程編程:變量共享分析(Thread)

Java多線程編程&#xff1a;變量共享分析&#xff08;Thread&#xff09; Java 創建線程的兩種方法 此處只簡單講下自己對java多線程變量共享的理解&#xff1a; 按照進程和多線程的原理&#xff0c;同一進程內的多個線程之間的地址空間是共享的&#xff08;除去ThreadLocal&a…

嘉益仕(Litns)帶您讀懂MES系統:選型篇

自從智能制造概念提出以來&#xff0c;制造執行系統MES在國內掀起了新一波的熱潮。眾多企業在技術發展、政策導向和自身需要的推動下&#xff0c;紛紛上馬MES請添加鏈接描述項目。 由此也帶動了MES軟件開發企業的快速發展。一夜之間MES軟件開發企業遍地開花&#xff0c;MES產品…

[WPF]xml序列化以及反序列化數據

代碼 XML序列化工具類 public static class XMLHelper{/// <summary>/// 將對象序列化為指定的文件名/// </summary>/// <typeparam name"T"></typeparam>/// <param name"obj"></param>/// <param name"fil…

多線程的那點兒事

1. 多線程的那點兒事&#xff08;基礎篇&#xff09; 多線程編程是現代軟件技術中很重要的一個環節。要弄懂多線程&#xff0c;這就要牽涉到多進程&#xff1f;當然&#xff0c;要了解到多進程&#xff0c;就要涉及到操作系統。不過大家也不要緊張&#xff0c;聽我慢慢道來。…

Android應用開發—AsyncTask

摘錄自 Android 多線程—–AsyncTask詳解 AsyncTask AsyncTask&#xff1a;異步任務&#xff0c;從字面上來說&#xff0c;就是在我們的UI主線程運行的時候&#xff0c;異步的完成一些操作。AsyncTask允許我們的執行一個異步的任務在后臺。我們可以將耗時的操作放在異步任務當…

std::shared_ptr之deleter的巧妙應用

本文由作者鄒啟文授權網易云社區發布。std::shared_ptr一次創建&#xff0c;多處共享&#xff0c;通過引用計數控制生命周期。 實例 在郵箱大師PC版中&#xff0c;我們在實現搜索時&#xff0c;大致思路是這樣的&#xff1a; 每一個賬號都有一個SearchFlow&#xff0c;搜索開始…

js - 執行上下文和作用域以及閉包

首先&#xff0c;咱們通常被"執行上下文"&#xff0c;"執行上下文環境"&#xff0c;"上下文環境"&#xff0c;"執行上下文棧"這些名詞搞混。那我們一一來揭秘這些名字的含義。 這一塊一直比較晦澀難懂&#xff0c;還是需要仔細去斟酌斟…

Spring之JDBCTemplate

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 一、Spring對不同的持久化支持&#xff1a; Spring為各種支持的持久化技術&#xff0c;都提供了簡單操作的模板和回調 ORM持久化技術模…

從螞蟻金服實踐入手,帶你深入了解 Service Mesh

本文整理自螞蟻金服高級技術專家敖小劍在 QCon 上海 2018 上的演講。我是來自螞蟻金服中間件團隊的敖小劍&#xff0c;目前是螞蟻金服 Service Mesh 項目的 PD。我同時也是 Servicemesher 中國技術社區的創始人&#xff0c;是 Service Mesh 技術在國內最早的布道師。我今天給大…

Android應用開發—FragmentManager如何管理fragments

本文主要摘錄自Android中使用FragmentManager管理fragments 和 淺談FragmentManager與fragment之一二事 先講下自己對fragment的理解&#xff1a; 對于fragment&#xff0c;有太多官方文檔和博文來介紹&#xff0c;此處不做轉述&#xff1a;我感覺android提供fragment這種組件…

數組指針 和 指針數組

最近發現公司有些人說怎樣區分 數組指針 和 指針數組 &#xff1f; 其實 很簡單&#xff1b; 數組指針&#xff0c; 先是&#xff08;定語 &#xff09; &#xff08;主體&#xff09;&#xff0c; &#xff08;定語 數組&#xff09; &#xff08;主體 指針&#xff09…

在云服務器上注意GeoServer和ShadowDataMap的跨域設置

在云服務器上注意GeoServer和ShadowDataMap的跨域設置 1、對于支持cors的網絡資源 可以在ShadowDataMap的devserverconfig.json里設置相應的跨域資源 提示&#xff1a;geoserver發布的地圖服務雖然同在一個服務器上&#xff0c;但是端口不一樣&#xff0c;同樣需要設置跨域 如&…