1. 程式人生 > >手寫簡易springmvc框架

手寫簡易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去獲取方法 然後根據反射機制去執行這個方法 再獲取返回值,並進行頁面轉發。

 

如下幾張效果圖: