java web项目_[适合初中级Java程序员修炼手册从0搭建整个Web项目](二)
前言
文本已收錄至我的GitHub倉庫,歡迎Star:https://github.com/bin392328206種一棵樹最好的時間是十年前,其次是現(xiàn)在six-finger-web
一個Web后端框架的輪子從處理Http請求【基于Netty的請求級Web服務(wù)器】 到mvc【接口封裝轉(zhuǎn)發(fā))】,再到ioc【依賴注入】,aop【切面】,再到 rpc【遠程過程調(diào)用】最后到orm【數(shù)據(jù)庫操作】全部自己擼一個(簡易)的輪子。
github
為啥要寫這個輪子
其實是這樣的,小六六自己平時呢?有時候喜歡看看人家的源碼比如Spring,但是小六六的水平可能不怎么樣,每次看都看得暈頭轉(zhuǎn)向,然后就感覺里面的細(xì)節(jié)太難了,然后我就只能觀其總體的思想,然后我就想我如果可以根據(jù)各位前輩的一些思考,自己擼一個簡單的輪子出來,那我后面去理解作者的思想是不是簡單點呢?于是呢 six-finger-web就面世了,它其實就是我的一個學(xué)習(xí)過程,然后我把它開源出來,希望能幫助那些對于學(xué)習(xí)源碼有困難的同學(xué)。還有就是可以鍛煉一下自己的編碼能力,因為平時我們總是crud用的Java api都是那些,久而久之,很多框架類的api我們根本就不熟練了,所以借此機會,鍛煉一下。
特點
- 內(nèi)置由 Netty 編寫 HTTP 服務(wù)器,無需額外依賴 Tomcat 之類的 web 服務(wù)(剛好小六六把Netty系列寫完,順便用下)
- 代碼簡單易懂(小六六自己寫不出框架大佬那種高類聚,低耦合的代碼),能力稍微強一點看代碼就能懂,弱點的也沒關(guān)系,小六六有配套的從0搭建教程。
- 支持MVC相關(guān)的注解確保和SpringMVC的用法類似
- 支持Spring IOC 和Aop相關(guān)功能
- 支持類似于Mybatis相關(guān)功能
- 支持類似于Dubbo的rpc相關(guān)功能
- 對于數(shù)據(jù)返回,只支持Json格式
絮叨
此教程只適合初中級水平,因為作者本身水平不高,不喜勿噴,今天是文章的第二篇,實現(xiàn)一個簡單的SpringMVC,參考的是Guide哥的jsoncat。 好了,下面我給大家來一一走一遍搭建流程
這邊建議一邊下載源碼,一邊來看,如果覺得有問題的話
總結(jié)的包結(jié)構(gòu)
首先我們來看看寫完了MVC之后的包結(jié)構(gòu),以至于大家心里有數(shù)
pom的修改
首先第一步,我先把pom文件新增的地方給大家看看
引入他們一個是反射,因為寫輪子,反射肯定用的多,還有一個就是json轉(zhuǎn)換工具
具體MVC的實現(xiàn)
這邊我先把整體的思想給大家捋捋,這個只是一個簡單的實現(xiàn),還有很多的細(xì)節(jié)沒有完成
首先,我們看看我們寫業(yè)務(wù)是個怎么樣的樣子,如下圖
好,這個就是我們最終要做到的效果,對吧,那我們?yōu)g覽器請求的時候長什么樣呢?
它長這樣,那其實久很清晰了,SpringMVC要實現(xiàn)的就是不同請求走不同的方法嘛,這就是核心思想嘛??偟膩碚f其實就三個部分
- 一個是原有的server的改造
- 一個是springmvc相關(guān)容器組件的初始化
- 一個是http請求的請求流程處理
下面,我一一來講解
改造Netty服務(wù)器的請求部分
這邊我解題然后把找類 方法的流程給大家,大家自己去看源碼
HttpRequestHandler->channelRead0
其實服務(wù)器這邊需要改造的地方也不多,就是通過請求,來找到不同的處理器,然后再去處理我們的業(yè)務(wù),然后根據(jù)業(yè)務(wù)的返回值,然后我們再去封裝一些成功或者失敗,然后這邊來看看server包下面的幾個類,具體的代碼,大家就自己去看了,每個類基本上有注釋
springmvc相關(guān)組件的初始化
首先我們再來看看我們的啟動類這邊, 類 ApplicationServer
然后我們就可以往下跟代碼了,其實大家看源碼也是這樣,但是源碼的話細(xì)節(jié)畢竟多,所以難懂點
類 DispatcherMethodMapper->loadRoutes
這個類的東西還比較多,基本上很多地方我寫了注釋,如果不懂的可以私下請教,然后我們大致來分析一下吧!
- 第一個肯定是加載包的掃描路徑,因為我這個是基于注解的,我就在配置文件中配置掃描路徑
- 之后就是遍歷里面的.class文件,然后找到類上面的注解,如果有RestController 說明他這個類是用來處理請求的,然后遍歷類中的方法,然后去一個個分析 PostMapping RequestMapping GetMapping 反正也就是if else 然后把這些方法,把請求的url封裝到一個springmvc的容器中,等請求來的時候,就去容器中匹配,然后找到對應(yīng)的方法,再填充對應(yīng)的參數(shù),就可以執(zhí)行方法了,具體的呢?建議大家跟著源碼來看哈
之后便是我們的主流程了,我們來看看主題流程怎么走的
還是在服務(wù)端那個類那跟起 HttpRequestHandler->channelRead0
我們來看這個方法中的
RequestHandlerFactory->create
其實就是根據(jù)不同的請求方式,找到對應(yīng)的處理類
然后我們接下去看 HttpRequestHandler->channelRead0
然后大家看,這個方法,才是我們的重頭戲,也就是我們處理的核心了,我們往下跟 RequestHandler 發(fā)現(xiàn)是一個接口
假設(shè)我們是Get請求找到他的實現(xiàn)類
GetRequestHandler->handle 這個就是我們真正要看的邏輯所在了,我們往下看
封裝請求參數(shù)和路徑參數(shù)
DispatcherMethodMapper->getMethodDetail
MethodDetail->build
這個就是核心填充的方法了,當(dāng)填充完成之后我們會獲得一個對象,這個對象就比較厲害了,他包含,當(dāng)前要執(zhí)行的方法 請求參數(shù)等,如下圖 GetRequestHandler->handle
接著往下
我們來看下,里面的核心方法 ParameterResolver->resolve
根據(jù)不同的方式去填充,然后填充完成之后呢
通過反射去拿到當(dāng)前要執(zhí)行的對象,然后再通過反射去執(zhí)行對應(yīng)的方法,至此mvc的所有流程走完了
我們看看請求的結(jié)果
要執(zhí)行的RestController
請求 http://localhost:8081/user/小六六寫MVC
結(jié)尾
好了,我們把MVC的小小流程寫完了,代碼也上傳了,希望大家好好學(xué)習(xí),一起加油,后面就要擼ioc 和aop了。
日常求贊
好了各位,以上就是這篇文章的全部內(nèi)容了,能看到這里的人呀,都是真粉。創(chuàng)作不易,各位的支持和認(rèn)可,就是我創(chuàng)作的最大動力,我們下篇文章
六脈神劍 | 文 【原創(chuàng)】如果本篇博客有任何錯誤,請批評指教,不勝感激 !
總結(jié)
以上是生活随笔為你收集整理的java web项目_[适合初中级Java程序员修炼手册从0搭建整个Web项目](二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: web项目 压力测试
- 下一篇: Java部署斗鱼直播,iOS斗鱼直播项目