1. 概述:
SmartMVC 是由四個Package,五個Class和一個Annotation組成的web項目.依賴於Apache Tomcat V8.5部署運行.利用了Java反射和xml解析技術實現動態創建和現實不同的功能.
2. 詳細組成:
- Package:
- base.annotation 註解包
- base.common 處理器(視圖/映射處理器)包
- base.web 核心控制包
- Class:
- Handler 映射處理器對象類
- HandlerMapping 映射處理器類
- ViewRosolver 視圖處理器類
- DispatcherServlet 核心控制類
- Annotation
- RequestMapping 自定義註解
3. 實現思路
- 在DispatcherServlet->init方法中讀取配置文件名
- 在DispatcherServlet->init方法中利用dom4j技術解析配置文件獲得處理器類名,並實例化.
- 將獲得到的處理器實例交給HandlerMapping(映射處理器類)處理
- 爲了方便利用Java反射來調用處理器對象,這裏需要設計一個Handler(映射處理器對象類)
- 在HandlerMapping->process方法中獲得對應的class對象.
- 獲得方法前的註釋
- 獲得註釋上的路徑信息
- 將path和Handler對象存儲在HandlerMap中.
- 依據請求的路徑,返回對應的Handler對象.
- 創建視圖處理器
- 在DispatcherServlet->service方法中處理請求資源路徑
- 獲取請求資源路徑
- 獲得應用名
- 截取請求資源路徑的後面的一部分
- 調用HandlerMapping的getHandler方法獲取處理器
- 判斷是否有相應的處理器
- 如果找到相應的處理器
- 判斷處理器方法是否帶有參數
- 如果帶參數
- 創建Object數組來存放參數
- 判斷參數類型
- 賦值
- 返回調用方法結果作爲return.value
- 如果不帶參數
- 直接返回方法調用結果作爲return.value
- 如果帶參數
- 判斷處理器方法是否帶有參數
- 如果沒有找到相應的處理器
- 直接返回error作爲return.value的值
- 如果找到相應的處理器
- 將return.value作爲視圖名viewName.
- 判斷是否有相應的處理器
- 調用視圖處理器來處理視圖名
- 創建ViewResolver類來統一處理viewName
- 判斷viewName是否是以"redirect:"開頭
- 是
- 處理重定向請求
- 將viewName的"redirect:"截掉,再拼上應用名
- 處理重定向請求
- 否
- 處理轉發請求
- forWardPath = “WEB-INF/”+viewName+".jsp"
- 處理轉發請求
- 是
- 整個設計完成,當然,還有一部分細節設計沒有寫出來,比如說自定義配置文件名以及一些使用的細節這些將在代碼或使用說明中體現.