帶着新人簡單看看servlet到springmvc

   很久都沒有寫博客了,不是由於本身懶了,而是總感受本身知道的只是太少了,每次想寫博客的時候都不知道怎麼下手,不過最近看到一篇博客說的是springmvc,給了我比較大的興趣,感受一會兒對整個springmvc框架一會兒清晰了,不少感受模糊的東西一會兒就清晰明瞭的。html

  我把那個老哥原博客網址貼出來:https://www.cnblogs.com/xdp-gacl/p/4101727.html前端

  不過呢,若是隻是將springmvc感受不過癮,因而順帶着說說servlet吧,以及爲何說springmvc本質上就是一個servlet,假如你能說明白這一點那麼你的springmvc就掌握得很清楚了,後面咱們根據那個老哥的博客,咱們一塊兒簡單實現一下springmvc就差很少了。java

 

1.簡單看看servletweb

  1.1.servlet繼承關係spring

  先看看下面servlet的這個繼承關係,有點印象便可(能夠暫時忽略ServletConfig,這個接口就是讓咱們能夠從web.xml文件中拿到標籤中的參數,好比<servlet-name>,<init-param>等標籤中的參數)瀏覽器

  而後咱們看一下最簡單的servlet用法,概念和由來就不說了,說了咱們也不懂,就知道可以經過瀏覽器訪問servlet就夠了。tomcat

  

  1.2.servlet最簡單的用法mvc

  新建一個myspringmvc項目,而後弄一下以下配置框架

  能夠了,就這麼多,而後咱們運行eclipse中集成的tomcat,在瀏覽器輸入url就能訪問了,很容易。eclipse

 

  1.3.servlet生命週期

  這個時候有個小問題,爲何咱們發送一個get請求(在瀏覽器輸入網址),就會直接跳轉到get方法呢?這麼智能的麼,這麼牛?

  因此咱們要站得高一點的角度看servlet的大概結構,以下圖,最重要的就是這三個方法,還有另外兩個方法暫時忽略:getServletConfig()是能夠拿到web.xml中配置的<init-param>等標籤的參數,還有getServletInfo()其實就是返回做者信息,版本信息等等,貌似還沒用過。。。。。

  最重要的就是那三個方法,通常別人都把這三個方法叫作servlet的生命週期。(注意service方法的兩個參數,沒有實現HTTP協議)

  到了這裏,假如就給你這樣一個接口,讓你本身寫實現類,你感受怎麼樣?反正我是很絕望的,不知道從哪裏下手,這麼多功能要實現,本身水平又比較菜,怎麼編寫一個徹底的servlet實現類呢?

  因而啊,一個抽象類就出來了GenericServlet,這個抽象類實現了Servlet接口,把幾乎全部的方法都給你實現出來了,好比獲取servlet上下文,獲取initParameter等等經常使用的功能,就留下了那三個生命週期方法init(), service(),destroy()沒有實現,這就須要咱們本身去實現類,因此咱們能夠繼承這個抽象類,實現這三個方法就ok了。

  可是啊,我仍是有點不會,由於我是用過瀏覽器發請求過來啊,你這個service方法要幹嗎呢?主要邏輯是什麼啊?並且每次都要實現這三個方法,好麻煩的啊,由於還要判斷是get仍是post方式提交,再調用get或者post方法,並且都是重複的東西,有點不會。

  終於,出來了一個比較全面的抽象類HttpServlet,這個類繼承了GenericServlet,還實現了http協議,其中作的最主要的是就是將那service()生命週期方法給實現了,而且在這裏會根據瀏覽器提交過來數據的方式,給分發到各自的方法去實現,好比分發到doGet(),doPost()等,簡單看一下源碼

  後面還有post,put,delete方法的判斷,跟這裏幾乎同樣,並且在本類中已經定義了doGet(),doPost()等方法,幾乎沒有怎麼實現,因此啊,咱們只須要繼承HttpServlet類,根據咱們的請求方式實現doGet(),doPost()等方法就能夠了,分工明確,用起來也很舒服。

  並且這裏新手可能有點頭暈,爲何會調用咱們實現的doGet,doPost方法,而不是父類中的那些doXXX()方法呢?其實啊,這裏又是一個基礎知識,好比子類B繼承父類A,重寫父類方法aa(),那麼實例化子類以後(這裏就是多態的用法),調用aa()方法確定是先在子類中找有沒有aa()方法,有的話就調用子類的,沒有的話就調用父類的!應該在java基礎的時候這種問題賊多,坑了不少新人。

  到這裏Servlet的大概輪廓就清楚了,咱們再來看看最上面的那個截圖,是否是以爲懂了一點點了

 

2.簡單看看springmvc初始化過程

  還記得最開始學習springmvc的時候是本身看視頻學習的,剛開始有不少的問題不懂,要本身慢慢理解,而後大量的查資料,記得比較清楚的一句話是說:springmvc中那個前端控制器其實就是一個servlet,springmvc的本質就是一個servlet!

  反正我是牢記這個概念,哦哦,原來springmvc本質就是一個servlet啊,而後我就放着無論了,也不是怎麼懂,反正我springmvc用的賊熟練。不就是那幾個處理器嗎?前端控制器,處理器映射器,處理器控制器,controller,視圖解析器,我常常簡單的這麼一配置,就能夠用了,而後和spring一整合,ok了!

  

  2.1.springmvc和servlet的關係

  首先問一個問題,爲何前端控制器是一個servlet啊?難道也是繼承了HttpServlet嗎?其中大概的流程是怎麼樣的呢?總感受很模糊,似懂非懂。

  那麼咱們就先來看一個前端控制器(DispatcherServlet)的繼承結構(混個眼熟):

  上圖很明顯,有三個新增的類,分別是HttpServletBean,FrameworkServlet,DispatcherServlet;這三個類我第一眼看過去反正我是不知道幹嗎用的,就大概知道最後那個前端控制器,因此咱們就慢慢的來看看前面兩個類是幹嗎用的啊?把前面兩個弄清楚了,就差很少了。

 

  2.2.隨便看看HttpServletBean,FrameworkServlet

  對於HttpServletBean,咱們先回憶前面的servlet的內容,在HttpServlet總只是實現了service()方法並在其中作了方法分發,可是servlet生命週期但是有三個方法啊,還有init()和destroy(),因而咱們在這裏就會用到init方法了;

  這裏會重寫GenericServlet的init方法(其實就是重寫HttpServlet的父類GenericServlet的init方法)

  

  因爲這個initServletBean()方法是一個空方法,確定是留給子類去實現的,而後咱們去FrameworkServlet中還真的找到了這個initServletBean()方法。

  這裏就是一個比較重要的地方了,稍微截一下initServletBean()方法中的代碼:

 

 

  注意:你們知不知道springmvc+spring整合的時候,會有父子容器的概念!父容器就是ioc容器,啓動toncat就會被web.xml中的那個監聽器監聽到,立馬就會建立ioc容器,裏面放的是service,dao,以及其餘的各類bean;這裏的子容器是springmvc的容器,裏裏面放着web層的全部組件,處理器映射器,處理器適配器,視圖解析器,controller等;

  還有我沒有記錯的話,因爲父容器先建立,子容器後建立。因此父容器的引用會保存在子容器一份,因此能夠經過子容器獲取父容器的實例,而後再獲取其中的bean;

  在initWebApplicationContext()方法中,其實就是對spring 子容器的建立以及刷新,這裏就隨便提一下,不深刻了!咱們只看其中的刷新方法:

  你點開刷新方法你會發現這又是一個空方法,等着子類去實現的!不知道你們到這裏有沒有看到一個頗有趣的邏輯,就是不少時候,一個類中有些方法本身是不會去實現的,而是要留給子類去實現,哈哈哈!子類假如會說話,確定會說:我真是日了狗哦!

 

  2.3.繼續隨便看看DispatcherServlet

  終於到這個類了,前面說了這麼多,都快睡着了。。。

  由上面能夠知道,DispatcherServlet中確定要實現那個刷新方法,因而咱們就直接到這個刷新方法看看究竟是什麼鬼!

   能夠看到初始化了好多組件,注意一點:這裏的context是子容器。

 

 3.springmvc處理請求

  前面springmvc初始化說了這麼多,其實就是將子容器建立,而後初始化了那9個組件放進去就ok了,那麼接下來就說說怎麼處理一個請求吧!

  還記得前面說處理請求,也就是咱們在瀏覽器輸入網址,一點回車,就會執行相應servlet的service()方法吧!

  在HttpServlet中的service()方法中接收請求,根據請求方式(Get,Post等)分發到相應的doGet(),doPost()等方法,而後咱們在FrameworkServlet中會發現,這個類將這些service和doGet(),doPost()等方法都重寫了,是個狠類啊!

  咱們就來簡單看看FrameworkServlet中的方法執行流程吧,不細看源碼!

 

  打開doGet方法,發現也是到processRequest()方法中

 

 

  咱們繼續往processRequest()方法看:

 

   咱們接下來就是在DispatcherServlet中看看有沒有doService()方法了;

 

   看看最後的doDispatcher方法:

  

  到這裏,基本就差很少了,把整個結構都給梳理了一遍!確定還有不少小夥伴對後半段有點迷糊,放心,我下一篇博客會一塊兒來簡單實現一下咱們本身的springmvc框架。

相關文章
相關標籤/搜索