代码: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去获取方法 然后根据反射机制去执行这个方法 再获取返回值,并进行页面转发。
如下几张效果图: