spring與servlet注解,java servlet spring_帶著新人簡單看看servlet到springmvc

 2023-10-21 阅读 26 评论 0

摘要:好久都沒有寫博客了,不是因為自己懶了,而是總感覺自己知道的只是太少了,每次想寫博客的時候都不知道怎么下手,不過最近看到一篇博客說的是springmvc,給了我比較大的興趣,感覺一下子對整個springmvc框架一下子清晰了,很多感覺

好久都沒有寫博客了,不是因為自己懶了,而是總感覺自己知道的只是太少了,每次想寫博客的時候都不知道怎么下手,不過最近看到一篇博客說的是springmvc,給了我比較大的興趣,感覺一下子對整個springmvc框架一下子清晰了,很多感覺模糊的東西一下子就清晰明了的。

spring與servlet注解?我把那個老哥原博客網址貼出來:https://www.cnblogs.com/xdp-gacl/p/4101727.html

不過呢,如果只是將springmvc感覺不過癮,于是順帶著說說servlet吧,以及為什么說springmvc本質上就是一個servlet,假如你能說明白這一點那么你的springmvc就掌握得很清楚了,后面我們根據那個老哥的博客,我們一起簡單實現一下springmvc就差不多了。

Spring mvc,1.簡單看看servlet

1.1.servlet繼承關系

先看看下面servlet的這個繼承關系,有點印象即可(可以暫時忽略ServletConfig,這個接口就是讓我們可以從web.xml文件中拿到標簽中的參數,比如,等標簽中的參數)

365a35b73e4b496554e19e767c47c8bb.png

然后我們看一下最簡單的servlet用法,概念和由來就不說了,說了我們也不懂,就知道能夠通過瀏覽器訪問servlet就夠了。

1.2.servlet最簡單的用法

新建一個myspringmvc項目,然后弄一下如下配置

fd1531e8aca6d55107caa5ea1cd45f7b.png

ed53223c07456cc637b3d1c5ead9bdd4.png

可以了,就這么多,然后我們運行eclipse中集成的tomcat,在瀏覽器輸入url就能訪問了,很容易。

88be17c2aa8a18ed007f7b131c97b739.png

1.3.servlet生命周期

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

所以我們要站得高一點的角度看servlet的大概結構,如下圖,最重要的就是這三個方法,還有另外兩個方法暫時忽略:getServletConfig()是可以拿到web.xml中配置的等標簽的參數,還有getServletInfo()其實就是返回作者信息,版本信息等等,貌似還沒用過。。。。。

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

925cdbbf0ae1ed0654e1a27ea556c49d.png

到了這里,假如就給你這樣一個接口,讓你自己寫實現類,你感覺怎么樣?反正我是很絕望的,不知道從哪里下手,這么多功能要實現,自己水平又比較菜,怎么編寫一個完全的servlet實現類呢?

于是啊,一個抽象類就出來了GenericServlet,這個抽象類實現了Servlet接口,把幾乎所有的方法都給你實現出來了,比如獲取servlet上下文,獲取initParameter等等常用的功能,就留下了那三個生命周期方法init(), service(),destroy()沒有實現,這就需要我們自己去實現類,所以我們可以繼承這個抽象類,實現這三個方法就ok了。

但是啊,我還是有點不會,因為我是用過瀏覽器發請求過來啊,你這個service方法要干嘛呢?主要邏輯是什么啊?而且每次都要實現這三個方法,好麻煩的啊,因為還要判斷是get還是post方式提交,再調用get或者post方法,而且都是重復的東西,有點不會。

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

2c2322e091f2e5a47ecea4962208240c.png

c5d1ac6a248292293503e545790d1ae1.png

后面還有post,put,delete方法的判斷,跟這里幾乎一樣,而且在本類中已經定義了doGet(),doPost()等方法,幾乎沒有怎么實現,所以啊,我們只需要繼承HttpServlet類,根據我們的請求方式實現doGet(),doPost()等方法就可以了,分工明確,用起來也很舒服。

而且這里新手可能有點頭暈,為什么會調用我們實現的doGet,doPost方法,而不是父類中的那些doXXX()方法呢?其實啊,這里又是一個基礎知識,比如子類B繼承父類A,重寫父類方法aa(),那么實例化子類之后(這里就是多態的用法),調用aa()方法肯定是先在子類中找有沒有aa()方法,有的話就調用子類的,沒有的話就調用父類的!應該在java基礎的時候這種問題賊多,坑了很多新人。

到這里Servlet的大概輪廓就清楚了,我們再來看看最上面的那個截圖,是不是覺得懂了一點點了

365a35b73e4b496554e19e767c47c8bb.png

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

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

反正我是牢記這個概念,哦哦,原來springmvc本質就是一個servlet啊,然后我就放著不管了,也不是怎么懂,反正我springmvc用的賊熟練。不就是那幾個處理器嗎?前端控制器,處理器映射器,處理器控制器,controller,視圖解析器,我經常簡單的這么一配置,就可以用了,然后和spring一整合,ok了!

2.1.springmvc和servlet的關系

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

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

6244bbe397297e530782e5ffa7f08e74.png

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

2.2.隨便看看HttpServletBean,FrameworkServlet

對于HttpServletBean,我們先回憶前面的servlet的內容,在HttpServlet總只是實現了service()方法并在其中做了方法分發,但是servlet生命周期可是有三個方法啊,還有init()和destroy(),于是我們在這里就會用到init方法了;

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

2b23034c2e7bc0aa941204921e228bef.png

由于這個initServletBean()方法是一個空方法,肯定是留給子類去實現的,然后我們去FrameworkServlet中還真的找到了這個initServletBean()方法。

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

521525dd27d7cf5e173fdc07259c83be.png

注意:大家知不知道springmvc+spring整合的時候,會有父子容器的概念!父容器就是ioc容器,啟動toncat就會被web.xml中的那個監聽器監聽到,立馬就會創建ioc容器,里面放的是service,dao,以及其他的各種bean;這里的子容器是springmvc的容器,里里面放著web層的所有組件,處理器映射器,處理器適配器,視圖解析器,controller等;

還有我沒有記錯的話,由于父容器先創建,子容器后創建。所以父容器的引用會保存在子容器一份,所以可以通過子容器獲取父容器的實例,然后再獲取其中的bean;

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

afc578ffffcad4ed0f61a9e1d3d244d1.png

cd41dd7068981384274fd2298f467efb.png

你點開刷新方法你會發現這又是一個空方法,等著子類去實現的!不知道大家到這里有沒有看到一個很有趣的邏輯,就是很多時候,一個類中有些方法自己是不會去實現的,而是要留給子類去實現,哈哈哈!子類假如會說話,肯定會說:我真是日了狗哦!

2.3.繼續隨便看看DispatcherServlet

終于到這個類了,前面說了這么多,都快睡著了。。。

由上面可以知道,DispatcherServlet中肯定要實現那個刷新方法,于是我們就直接到這個刷新方法看看到底是什么鬼!

68170afa27cba3c67690e57afb003313.png

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

3.springmvc處理請求

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

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

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

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

3af6b78e683bef79dc8ebec71396627f.png

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

c9ffdb8274eededd8276f53f6066b539.png

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

ad5407467925ad3b385685ac9af17f05.png

c5b65358158ec0370a41202ff09bf694.png

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

2b463540677af3c6017eca9032768f8a.png

3b5d7c9d3bddd4038255282d74894641.png

看看最后的doDispatcher方法:

320cdca6ac52da7910912034a0740aaa.png

4e5b5e37d9c4e2cdf3a2597cc2ec14e4.png

8f8a75e5a2e980a6d6ba7c9b44487250.png

到這里,基本就差不多了,把整個結構都給梳理了一遍!肯定還有很多小伙伴對后半段有點迷糊,放心,我下一篇博客會一起來簡單實現一下我們自己的springmvc框架。

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/158589.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息