手寫簡易springmvc框架
程式碼:https://github.com/JZWen/writeSpringMvc
回顧一遍:
準備工作:先寫兩個註解類
controller層的類 並寫上註解
自己寫dispatcherServlet 寫的也不是很完善 在裡面完成 init() doPost()
web.xml配置資訊 只需要配置dispatcherServlet
然後就開始dispatcherServlet的完善
首先是init()方法
第一步: 獲取帶有controller註解的類
現在掃描這個包的類 ,這個方法我也沒有看懂大概意思就是去將com.jzw.controller通過字元的轉變變成一個路徑,然後通過這個路徑去掃描檔案並獲取檔名
if ("file".equals(protocol)) {
// 獲取包的物理路徑
String filePath = URLDecoder.decode(url.getFile(), "UTF-8");
// 以檔案的方式掃描整個包下的檔案 並新增到集合中
findAndAddClassesInPackageByFile(packageName, filePath, recursive, classes);
}
得到了所有的類之後去掃描這些類上有沒有controller的註解
MyController myController = classInfo.getDeclaredAnnotation(MyController.class); //括號裡面傳的就是@contrller註解
將這個帶有註解的的類 放在map集合中 ConcurrentHashMap 下面這種集合
這是存放 掃描到有註解的類 key 小寫類名(String) value 該類的例項物件(Object)
第二步 掃描類上和方法上有沒有@RequestMapping 註解
還是獲取上面那個map裡面的類
然後看看有沒有@RequestMapping註解有的話那就獲取這個註解
暫時放在Url中,
通過Class 獲取這個類下面的方法。
Method[] methods = classInfo.getDeclaredMethods();
根據方法看看這個類上有沒有@RequestMapping 註解並獲取他的value
MyRequestMapping myRequestMapping = methods[i].getDeclaredAnnotation(MyRequestMapping.class);
再將這個value新增到url上
然後再存一個集合 concurrentHashMap
這是存放 掃描到註解上類和方法對應的地址 key 地址 url (String) vlaue 該類的例項物件
第三步 獲取地址和方法名
根據上面的地址和方法名(String)然後再建一個ConcurrentHashMap.然後就完成了。
最後是寫doPost裡面的方法 這個簡單,
就是根據Url去獲取方法 然後根據反射機制去執行這個方法 再獲取返回值,並進行頁面轉發。
如下幾張效果圖: