老司機教你用原生JDK 擼乙個 MVC 框架!!!

2022-06-06 12:57:07 字數 1654 閱讀 6369

其實 spring mvc 是乙個基於請求驅動的 web 框架,並且也使用了前端控制器模式來進行設計,再根據請求對映規則分發給相應的頁面控制器進行處理,具體工作原理見下圖。

在這裡,就不詳細談相關的原理和實現細節了,感興趣的話,可以讀一下這方面的書籍。

我在網上看到一篇不錯的關於講述怎麼實現乙個 mvc 框架的文章,在此,分享給各位讀者,也許能幫助到你。

原文內容如下。

我今天主要帶大家實現乙個迷你版的 spring mvc ,本專案將在乙個乾淨的 web 工程開發,不引入 spring,完全通過原生 jdk 來實現。

具體的工程**結構如下圖。

在 annotation 包下,我將提供自定義的註解,為了方便理解,會與 spring mvc 保持一致。

為了模擬 spring mvc 的方法呼叫鏈,我這裡提供 controller/service/dao 層進行測試。

提供自定義的 dispatcherservlet 來完成核心邏輯處理。

先給各位讀者解釋一下 jdk 提供了幾個元註解:

我這邊自定義的註解主要是模擬 spring mvc ,具體實現如下。

1、@controller提供控制器

2、@qualifier提供依賴注入

4、dao層註解

5、service層註解

在 spring mvc 中,dispatcherservlet 是核心類,下面我的**主要用來實現它。首先來說,spring mvc 中的 dispatcherservlet 說到底,還是 httpservlet 的子類,因此我這邊自定義的 dispatcherserlvet 也需要繼承 httpservlet。

1、pom.xml 加入 servlet 依賴

2、定義 dispatcherservlet

**中的 @webservlet 用處是什麼呢?其實,以前我們定義乙個 servlet ,需要在 web.xml 中去配置,不過在 servlet 3.0 後出現了基於註解的 servlet 。

仔細觀察,你會發現,這個 dispatcherservlet 是自啟動,而且傳入了乙個引數。

要知道,在 spring mvc 中,要想基於註解,需要在配置中指明掃瞄的包路徑,就像這個樣子。

為了方便,我這裡就通過初始化引數直接將需要掃瞄的基包路徑傳入。

a、初始化流程

其實,在 init 中,我們主要是完成了什麼呢?

其實,spring mvc 的處理流程,就是類似這樣的!

b、掃瞄基包

注意,基包是 x.y.z 的形式,而 url 是 x/y/z 的形式,需要轉換。

c、例項化

從這裡你可以看出,我們完成了被註解標註的類的例項化,以及和註解名稱的對映。

d、依賴注入

以前,我們總是說spring ioc,上面不就是在做這個事情麼?

e、url對映處理

我們需要把 url 提取出來,對映到 controller 的 method 上。

f、doget/dopost

在 dopost 方法中,非常簡單,我們只需要提取出 url,通過 url 對映到method 上,然後通過反射的方式進行呼叫即可。

1、controller層

2、service層

3、dao層

4、執行結果

到這裡,乙個迷你版的 spring mvc 就開發完成了。

手把手教你用Python設計乙個簡單的命令列介面

對 python 程式來說,完備的命令列介面可以提公升團隊的工作效率,減少呼叫時可能碰到的困擾。今天,我們就來教大家如何設計功能完整的 python 命令列介面。對 python 開發者來說用的最多的介面恐怕還是命令列。就拿我參與的機器學習專案來說,訓練模型和評估演算法的精確度都是通過在命令列介面執...

10分鐘教你用Python打造乙個AI貪吃蛇

最近在修一門叫python基礎的課,然後匆忙之中做了這個ai貪吃蛇想交個大作業,結果老師的結課作業是給定了題目,我真是 首先說明一點哈,此ai非彼ai。今天要講的ai貪吃蛇還是傳統意義上遍歷圖的找路演算法編寫的,並不是利用機器學習進行學習控制的哈。傳送門 10分鐘教你用python打造貪吃蛇超詳細教...

手把手教你用Python完成乙個控制台小遊戲

很多人想學python程式設計或者已經了解過一點python程式設計基礎,卻沒辦法開發出乙個專案。今天,通過演示乙個簡單的控制台小遊戲製作,手把手教你如何用python編寫乙個遊戲程式,即便你是個新手,也完全可以跟著操作。開始前,我們先簡明扼要的討論一下python是什麼,以及python應該注意的...