自己寫一個mvc框架吧(一)
目錄
寫之前的一些廢話
廢話 1 (總是要先隨便說點啥)
寫了好幾年的java程序,基本上每個項目都有用到mvc的框架,可能是spring mvc也可能是struts。這些框架怎么用相信大家也都很熟悉了,但是有沒有想過自己寫一個屬於自己的mvc的框架呢?有沒有想過為啥你請求一個http的地址,你的一個class里的方法就能被執行了呢?現在咱們開始寫一個mvc框架吧。
因為2年前自己寫過一個mvc的框架,比較爛,但是也能用。所以大致需要的知識點我寫在下面,再寫一個應該也還是這些東西。
-
反射
基本上要寫點框架性質的代碼就都需要用到反射的知識。
-
json,xml之類的配置文件的解析
或多或少都可能需要一點。
-
注解方面的
如果不想使用配置文件的話,自定義注解是肯定要有的。
-
servlet
因為http的入口就是這一個,肯定要用到。如果你要是要用filter,那你就要比較熟悉filter。
-
asm
這個是因為要獲取方法上的參數名稱,使用反射取參數名稱一般都是arg0,arg1這樣的,除非有特別的配置。
-
別的應該沒了
廢話 2 (大致的一個步驟)
大致說一下要寫一個mvc咱們都需要干點啥。
第一步 創建一個映射關系
你需要一個 地址和一個方法的映射(這個地址可是一個http的地址,也可以單純的就是一個隨意的字符串或者別的東西,因為這里寫的是mvc框架,所以就確定它是一個http的請求地址)。
這個映射關系可以先用一個java對象保存起來,之后我們可以根據不同的形式來獲取到這些數據並填充這個對象。這些數據或許是通過注解,或許是xml文件,也可能是json文件來得到,只需要根據不同的形式來寫不同的實現代碼就好了,最終只要獲取到這個映射關系就好。
第二步 獲取方法的詳細信息
請求地址與方法的映射創建完成之后,我們需要知道這個方法里面都有那些參數,每個參數的名稱和參數類型是什么。
這是使用了asm框架。不了解的的同學可以搜一下,他是一個處理java字節碼的工具,各大知名框架里都有用到,非常強大。我在這里用這個的主要原因是使用它獲取方法的參數名稱,因為反射的話沒有特殊配置是取不到正確的名稱的,但是我又不想有特殊配置~~~
第三步 獲取並轉換請求參數
因為我們是通過http請求來調用java的方法,所以我們要把http請求中的參數取出來並轉換成為對應方法中實際的參數類型。比如一個方法的入參是 兩個int類型的數據,我們就要將http請求中的String類型的數據轉換成為int類型。
這一步我們不需要先直接處理http的請求,先用一些String類型的數據做一些測試即可。處理http請求的地方可以在后面再寫。
第四步 使用反射執行方法
這里沒什么好說的,反射中的知識點。
第五步 寫一個http請求的入口,並加一些配置
這里開始寫一個請求的入口了,spring使用的入口是一個 servlet,struts用的是一個filter,我在這里也用一個servlet。
這里我們需要定義一個配置文件,用來描述上面的映射關系。如果要使用注解的形式,還要自定義一些注解,並寫一個包掃描的來處理這些注解。總之就是要吧上面定義的 請求地址與方法映射 的這個對象數據填充起來。
然后將每次請求過來之后,根據不同的請求路徑,獲取其映射的方法。之后執行這個方法。
第六步 處理執行后的結果。
這里可能有點麻煩,因為要能適應到不同的視圖解析之類的,可能是jsp,freemarker,或者別的啥的。需要好好設計一下代碼。
因為我自己還沒有寫到,所以先打算以字符串形式直接返回。
廢話 3 (再說點啥)
這個東西我剛開始寫,代碼在:https://github.com/hjx601496320/aMvc 。
至於什么時候寫完?這個就要看公司里忙不忙了,但是基本上能保證這個是能寫完的。
博客的話一般我是自己先寫一部分代碼,然后在根據寫代碼的思路寫一點博客,可能寫着寫着就和之前的不太一樣了。不過我盡量吧我自己的思路說清楚。
廢話說完了
現在就開始寫吧~
嗯。下一篇開始具體更新每一步怎么寫。
