自己寫一個mvc框架吧(一)

何白白發表於2019-02-01
上一篇

寫一個工具生成資料庫實體類

自己寫一個mvc框架吧(一)

專案地址在:github.com/hjx60149632…

測試程式碼在:github.com/hjx60149632…

寫之前的一些廢話

廢話 1 (總是要先隨便說點啥)

寫了好幾年的java程式,基本上每個專案都有用到mvc的框架,可能是spring mvc也可能是struts。這些框架怎麼用相信大家也都很熟悉了,但是有沒有想過自己寫一個屬於自己的mvc的框架呢?有沒有想過為啥你請求一個http的地址,你的一個class裡的方法就能被執行了呢?現在我們們開始寫一個mvc框架吧。

因為2年前自己寫過一個mvc的框架,比較爛,但是也能用。所以大致需要的知識點我寫在下面,再寫一個應該也還是這些東西。

  1. 反射

    基本上要寫點框架性質的程式碼就都需要用到反射的知識。

  2. json,xml之類的配置檔案的解析

    或多或少都可能需要一點。

  3. 註解方面的

    如果不想使用配置檔案的話,自定義註解是肯定要有的。

  4. servlet

    因為http的入口就是這一個,肯定要用到。如果你要是要用filter,那你就要比較熟悉filter。

  5. asm

    這個是因為要獲取方法上的引數名稱,使用反射取引數名稱一般都是arg0,arg1這樣的,除非有特別的配置。

  6. 別的應該沒了

廢話 2 (大致的一個步驟)

大致說一下要寫一個mvc我們們都需要乾點啥。

第一步 建立一個對映關係

你需要一個 地址和一個方法的對映(這個地址可是一個http的地址,也可以單純的就是一個隨意的字串或者別的東西,因為這裡寫的是mvc框架,所以就確定它是一個http的請求地址)。

這個對映關係可以先用一個java物件儲存起來,之後我們可以根據不同的形式來獲取到這些資料並填充這個物件。這些資料或許是通過註解,或許是xml檔案,也可能是json檔案來得到,只需要根據不同的形式來寫不同的實現程式碼就好了,最終只要獲取到這個對映關係就好。

第二步 獲取方法的詳細資訊

請求地址與方法的對映建立完成之後,我們需要知道這個方法裡面都有那些引數,每個引數的名稱和引數型別是什麼。

這是使用了asm框架。不瞭解的的同學可以搜一下,他是一個處理java位元組碼的工具,各大知名框架裡都有用到,非常強大。我在這裡用這個的主要原因是使用它獲取方法的引數名稱,因為反射的話沒有特殊配置是取不到正確的名稱的,但是我又不想有特殊配置~~~

第三步 獲取並轉換請求引數

因為我們是通過http請求來呼叫java的方法,所以我們要把http請求中的引數取出來並轉換成為對應方法中實際的引數型別。比如一個方法的入參是 兩個int型別的資料,我們就要將http請求中的String型別的資料轉換成為int型別。

這一步我們不需要先直接處理http的請求,先用一些String型別的資料做一些測試即可。處理http請求的地方可以在後面再寫。

第四步 使用反射執行方法

這裡沒什麼好說的,反射中的知識點。

第五步 寫一個http請求的入口,並加一些配置

這裡開始寫一個請求的入口了,spring使用的入口是一個 servletstruts用的是一個filter,我在這裡也用一個servlet

這裡我們需要定義一個配置檔案,用來描述上面的對映關係。如果要使用註解的形式,還要自定義一些註解,並寫一個包掃描的來處理這些註解。總之就是要吧上面定義的 請求地址與方法對映 的這個物件資料填充起來。

然後將每次請求過來之後,根據不同的請求路徑,獲取其對映的方法。之後執行這個方法。

第六步 處理執行後的結果。

這裡可能有點麻煩,因為要能適應到不同的檢視解析之類的,可能是jsp,freemarker,或者別的啥的。需要好好設計一下程式碼。

因為我自己還沒有寫到,所以先打算以字串形式直接返回。

廢話 3 (再說點啥)

這個東西我剛開始寫,程式碼在:github.com/hjx60149632…

至於什麼時候寫完?這個就要看公司裡忙不忙了,但是基本上能保證這個是能寫完的。

部落格的話一般我是自己先寫一部分程式碼,然後在根據寫程式碼的思路寫一點部落格,可能寫著寫著就和之前的不太一樣了。不過我儘量吧我自己的思路說清楚。

廢話說完了

現在就開始寫吧~

嗯。下一篇開始具體更新每一步怎麼寫。

下一篇

自己寫一個mvc框架吧(二)

相關文章