java web項目_[適合初中級Java程序員修煉手冊從0搭建整個Web項目](二)

前言

文本已收錄至我的GitHub倉庫,歡迎Star:github.com/bin392328206種一棵樹最好的時間是十年前,其次是現在

six-finger-web

一個Web后端框架的輪子從處理Http請求【基于Netty的請求級Web服務器】 到mvc【接口封裝轉發)】,再到ioc【依賴注入】,aop【切面】,再到 rpc【遠程過程調用】最后到orm【數據庫操作】全部自己擼一個(簡易)的輪子。

github

為啥要寫這個輪子

其實是這樣的,小六六自己平時呢?有時候喜歡看看人家的源碼比如Spring,但是小六六的水平可能不怎么樣,每次看都看得暈頭轉向,然后就感覺里面的細節太難了,然后我就只能觀其總體的思想,然后我就想我如果可以根據各位前輩的一些思考,自己擼一個簡單的輪子出來,那我后面去理解作者的思想是不是簡單點呢?于是呢 six-finger-web就面世了,它其實就是我的一個學習過程,然后我把它開源出來,希望能幫助那些對于學習源碼有困難的同學。還有就是可以鍛煉一下自己的編碼能力,因為平時我們總是crud用的Java api都是那些,久而久之,很多框架類的api我們根本就不熟練了,所以借此機會,鍛煉一下。

特點

  • 內置由 Netty 編寫 HTTP 服務器,無需額外依賴 Tomcat 之類的 web 服務(剛好小六六把Netty系列寫完,順便用下)
  • 代碼簡單易懂(小六六自己寫不出框架大佬那種高類聚,低耦合的代碼),能力稍微強一點看代碼就能懂,弱點的也沒關系,小六六有配套的從0搭建教程。
  • 支持MVC相關的注解確保和SpringMVC的用法類似
  • 支持Spring IOC 和Aop相關功能
  • 支持類似于Mybatis相關功能
  • 支持類似于Dubbo的rpc相關功能
  • 對于數據返回,只支持Json格式

絮叨

此教程只適合初中級水平,因為作者本身水平不高,不喜勿噴,今天是文章的第二篇,實現一個簡單的SpringMVC,參考的是Guide哥的jsoncat。 好了,下面我給大家來一一走一遍搭建流程

這邊建議一邊下載源碼,一邊來看,如果覺得有問題的話

總結的包結構

首先我們來看看寫完了MVC之后的包結構,以至于大家心里有數

pom的修改

首先第一步,我先把pom文件新增的地方給大家看看

引入他們一個是反射,因為寫輪子,反射肯定用的多,還有一個就是json轉換工具

具體MVC的實現

這邊我先把整體的思想給大家捋捋,這個只是一個簡單的實現,還有很多的細節沒有完成

首先,我們看看我們寫業務是個怎么樣的樣子,如下圖

好,這個就是我們最終要做到的效果,對吧,那我們瀏覽器請求的時候長什么樣呢?

它長這樣,那其實久很清晰了,SpringMVC要實現的就是不同請求走不同的方法嘛,這就是核心思想嘛。總的來說其實就三個部分

  • 一個是原有的server的改造
  • 一個是springmvc相關容器組件的初始化
  • 一個是http請求的請求流程處理

下面,我一一來講解

改造Netty服務器的請求部分

這邊我解題然后把找類 方法的流程給大家,大家自己去看源碼

HttpRequestHandler->channelRead0

其實服務器這邊需要改造的地方也不多,就是通過請求,來找到不同的處理器,然后再去處理我們的業務,然后根據業務的返回值,然后我們再去封裝一些成功或者失敗,然后這邊來看看server包下面的幾個類,具體的代碼,大家就自己去看了,每個類基本上有注釋

springmvc相關組件的初始化

首先我們再來看看我們的啟動類這邊, 類 ApplicationServer

然后我們就可以往下跟代碼了,其實大家看源碼也是這樣,但是源碼的話細節畢竟多,所以難懂點

類 DispatcherMethodMapper->loadRoutes

這個類的東西還比較多,基本上很多地方我寫了注釋,如果不懂的可以私下請教,然后我們大致來分析一下吧!

  • 第一個肯定是加載包的掃描路徑,因為我這個是基于注解的,我就在配置文件中配置掃描路徑
  • 之后就是遍歷里面的.class文件,然后找到類上面的注解,如果有RestController 說明他這個類是用來處理請求的,然后遍歷類中的方法,然后去一個個分析 PostMapping RequestMapping GetMapping 反正也就是if else 然后把這些方法,把請求的url封裝到一個springmvc的容器中,等請求來的時候,就去容器中匹配,然后找到對應的方法,再填充對應的參數,就可以執行方法了,具體的呢?建議大家跟著源碼來看哈

之后便是我們的主流程了,我們來看看主題流程怎么走的

還是在服務端那個類那跟起 HttpRequestHandler->channelRead0

我們來看這個方法中的

RequestHandlerFactory->create

其實就是根據不同的請求方式,找到對應的處理類

然后我們接下去看 HttpRequestHandler->channelRead0

然后大家看,這個方法,才是我們的重頭戲,也就是我們處理的核心了,我們往下跟 RequestHandler 發現是一個接口

假設我們是Get請求找到他的實現類

GetRequestHandler->handle 這個就是我們真正要看的邏輯所在了,我們往下看

封裝請求參數和路徑參數

DispatcherMethodMapper->getMethodDetail

MethodDetail->build

這個就是核心填充的方法了,當填充完成之后我們會獲得一個對象,這個對象就比較厲害了,他包含,當前要執行的方法 請求參數等,如下圖 GetRequestHandler->handle

接著往下

我們來看下,里面的核心方法 ParameterResolver->resolve

根據不同的方式去填充,然后填充完成之后呢

通過反射去拿到當前要執行的對象,然后再通過反射去執行對應的方法,至此mvc的所有流程走完了

我們看看請求的結果

要執行的RestController

請求 http://localhost:8081/user/小六六寫MVC

結尾

好了,我們把MVC的小小流程寫完了,代碼也上傳了,希望大家好好學習,一起加油,后面就要擼ioc 和aop了。

日常求贊

好了各位,以上就是這篇文章的全部內容了,能看到這里的人呀,都是真粉

創作不易,各位的支持和認可,就是我創作的最大動力,我們下篇文章

六脈神劍 | 文 【原創】如果本篇博客有任何錯誤,請批評指教,不勝感激 !

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

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

相關文章

MapReduce操作HBase

運行HBase時常會遇到個錯誤,我就有這樣的經歷。 ERROR: org.apache.hadoop.hbase.MasterNotRunningException: Retried 7 times 檢查日志:org.apache.hadoop.ipc.RPC$VersionMismatch: Protocol org.apache.hadoop.hdfs.protocol.ClientProtocol versio…

轉 ABAP_ALV_Function方式與OO方式(較為簡單、普通的ALV)

ABAP_ALV_Function方式與OO方式(較為簡單、普通的ALV) 分類: SAP ABAP2013-01-31 09:58 1511人閱讀 評論(0) 收藏 舉報目錄 一、ALV簡介 1、簡介 2、ALV_GRID介紹 3、其它描述 二、開發ALV的基本流程 三、ALV相關開發細節 1、標準ALV與對象ALV的共同開發細節 2、標準…

MAC OS X 1.1 El Capitan安裝方法與步驟

2019獨角獸企業重金招聘Python工程師標準>>> 蘋果公司發布了最新的Mac系統El Capitan,我也跟風安裝了, 昨天試了一天終于算是安裝成功了. ###電腦配置: CPU: E3-1230 v2 主板: 技嘉B75M D3V 顯卡: 微星6850 聲卡: Realtek ALC887 鍵盤: Noppoo 84鍵機械鍵盤 ###下載…

vp與vs聯合開發-網口通信(socket)

Socket通信是一種在網絡中進行進程間通信的機制。它使用了一種稱為套接字(Socket)的編程接口,通過該接口可以創建、連接、發送和接收數據等操作。 Socket通信中,有兩個主要的角色:服務器和客戶端。服務器負責監聽指定…

第3章 Python 數字圖像處理(DIP) - 灰度變換與空間濾波8 - 直方圖處理 - 直方圖均衡化(全局直方圖均衡化)

直方圖均衡化 灰度映射函數: sT(r),0≤r≤L?1(3.8)s T(r), \quad 0\leq r \leq L -1 \tag{3.8}sT(r),0≤r≤L?1(3.8) 假設: (1) T(r)T(r)T(r)在區間0≤r≤L?10 \leq{r} \leq{L-1}0≤r≤L?1 上是一個單調遞增函數。 (2) 對于0≤r≤L?10 \leq{r} …

python 元組和列表區別_Python干貨整理:一分鐘了解元組與列表使用與區別

元組是 Python 對象的集合,跟列表十分相似。下面進行簡單的對比。列表與元組1、python中的列表list是變量,而元組tuple是常量。列表:是使用方括號[],元組:則是使用圓括號()2、兩者都可以使用索引讀取值列表1.列表中的a…

JS拖拽,移動與拉伸

上次做的簡單的拖拽:javascript簡單拖拽練習(鼠標事件 mousedown mousemove mouseup) 這次增加了一些相關的功能,增加四個角的拉伸改變寬度,主要還是用到一些簡單的坐標位置計算,沒有什么技術難度,熟練了一下自己對拖拽…

關于release后retainCount還是1的問題

轉自:http://www.cocoachina.com/bbs/read.php?tid175523 realse之后再調用還能調用的的問題,我做了這么多年也是經常遇到,也曾經試圖尋找原因, 就像6樓說的,很多時候都會出現realse過后還能調用的現象。而且對象不是…

Maven for Eclipse 第二章 ——安裝 m2eclipse插件

m2eclipse 是一個提供了 Maven 與 Eclipse 整合的插件。它的意圖是橋接上 Maven 和 Eclipse 之間的缺口。通過 Maven 原型提供的簡單直白的接口創建項目,它使 Maven 在 IDE 中非常容易使用。下面是m2eclipse 提供的一些特性。 創建和導入 Maven 項目在 Eclipse 運行…

第3章 Python 數字圖像處理(DIP) - 灰度變換與空間濾波9 - 直方圖處理 - 直方圖匹配(規定化)灰度圖像,彩色圖像都適用

直方圖匹配(規定化) 連續灰度 sT(r)(L?1)∫0rpr(w)dw(3.17)s T(r) (L-1) \int_{0}^{r} p_r(w) \text{d} w \tag{3.17} sT(r)(L?1)∫0r?pr?(w)dw(3.17) 定義關于變量zzz的一個函數GGG,它具有如下性質: G(z)(L?1)∫0zpz(v)d…

C#委托之就是跟委托過不去…

在上一篇博文當中,我們例舉了一個機房自動化系統的邏輯控制程序,其中用到了Lambda表達式,因此方便了我們程序功能的實現.然而,我們不能僅僅為實現功能,完成任務而奮斗,應該知其然,知其所以然,也就是說,知道了Lambda表達式能夠帶來這樣的方便,也應該知道為什么能夠帶來這樣的方便…

closewait一直不釋放_機床為什么要釋放應力?怎么釋放應力才好?

在機床行業內一直有種說法,就是機床需要釋放應力,而且越是高精密的機床就越要注意應力的釋放,最近就有機床粉向小編詢問應力是什么?為什么要釋放應力?如果釋放要釋放多久?怎么釋放應力才好等一系列關于機床…

HDU 1025 Constructing Roads In JGShining's Kingdom(DP+二分)

點我看題目 題意 :兩條平行線上分別有兩種城市的生存,一條線上是貧窮城市,他們每一座城市都剛好只缺乏一種物資,而另一條線上是富有城市,他們每一座城市剛好只富有一種物資,所以要從富有城市出口到貧窮城市…

表單元素選擇器

無論是提交還是傳遞數據,表單元素在動態交互頁面的作用是非常重要的。jQuery中專門加入了表單選擇器,從而能夠極其方便地獲取到某個類型的表單元素 表單選擇器的具體方法描述: 注意事項: 除了input篩選選擇器,幾乎每個…

怎樣在excel表格中畫斜線并打字_一日一技丨Excel斜線表頭如何制作?標題、表頭的4個技巧...

來源 | 迅捷PDF轉換器 (ID:xjpdf6)作者丨小小迅「一日一技」是每天的知識分享專欄,一是分享一些PDF、Office、辦公小技巧;二是抽取小可愛們在留言中的疑問并解決。希望對大家有所幫助!表頭的標題是Excel中的第一道大門,精致好看的…

Retina時代的前端視覺優化

隨著New iPad的發布,平板也將逐漸進入Retina時代,在高分辨率設備里圖片的顯示效果通常不盡人意,為了達到最佳的顯示效果就需要對圖片進行優化,這里介紹一些優化方法: 一、用CSS替代圖片 這一點在任何時候都適用&#x…

第3章 Python 數字圖像處理(DIP) - 灰度變換與空間濾波10 - 直方圖處理 - 局部直方圖處理

這里寫目錄標題局部直方圖處理局部直方圖處理 因為像素是由基于整個圖像的灰度的變換函數修改的。這種全局性方法適合于整體增強,但當目的是增強圖像中幾個小區域的細節時,通常就會失敗。這是因為在這些小區域中,像素的數量對計算全局變換的…

CodeForces369C On Changing Tree

昨天的CF自己太挫了。一上來看到A題,就有思路,然后馬上敲,但是苦于自己很久沒有敲計數的題了,許多函數都稍微回憶了一陣子。A題的主要做法就是將每個數質因數分解,統計每個質因子的個數,對于每個質因子pi的…

ES6之const命令

一直以來以ecma為核心的js始終沒有常量的概念,es6則彌補了這一個缺陷; const foofoo;foobar;//TypeError: Assignment to constant variable.上例聲明了一個基本類型的常量,如過試圖修改初始值則會報錯;如果是引用類型的值同樣適用…

C++和Rust_后端程序員一定要看的語言大比拼:Java vs. Go vs. Rust

這是Java,Go和Rust之間的比較。這不是基準測試,更多是對可執行文件大小、內存使用率、CPU使用率、運行時要求等的比較,當然還有一個小的基準測試,可以看到每秒處理的請求數量,我將嘗試對這些數字進行有意義的解讀。為了…