项目包
- annotation包:自定义注解,这里主要还是模仿的Spring mvc注解的命名,为了区分前面都加了一个My***
- core包:测试controoler
- servlet:自定义servlet(框架核心实现)
- resources:配置文件(maven定义)
实现
项目主要的实现在MyDispatcherServlet自定义Servlet中,web.xml配置:
- MyDispatcherServlet中定义了6个自定义变量(容器),根据变量名称可知道主要做什么的
- 第一步:在初始化Servlet的时候进行配置加载,通过类加载器获取到配置,设置到上文代码中的properties中
第二步:获取到的配置信息(递归扫描包),加载到classNames这个变量中
第三步:通过第二步获取到的所有class名称,判断是有自定义的MyControoler注解,存在则初始化(反射)加入到ioc
- MyDispatcherServlet中定义了6个自定义变量(容器),根据变量名称可知道主要做什么的
请求之后地址解析
- 可以看到post和get都是使用的doDispatch方法处理,处理的思路是通过获取对应url 的method参数列表解析类型参数通过反射调用method,这里只处理了HttpServletRequest,HttpServletResponse,String 其他类型可以自己做个解析
- 主要代码
最后
- 其中一段代码(首字母转换小写)看我很是懵逼(基础太差),我提出来,不知道还有人跟我一人的懵逼么。参考博客:JAVA中的char类型,和 ASCII码表有关系
- 还有个问题charArray[0] += 32; 写成 charArray[0] = charArray[0] + 32;为什么报错其实看编译代码就知道,charArray[0] + 32会小转大到int类型,而charArray[0] += 32; 看如下class编译代码就懂了
总结
这里项目虽然很简单,但是比看Spring源码看着好很多,对于目前的我来说源码看得很吃力,看过Spring 源码之后(并没读懂),再来看这个其实就轻松多了,虽然算个简易的半成品但是看到了自己的不足,以前面试有人问我能不能自己手写一个Spring mvc框架,当时懵逼,现在看来其实简易的框架也没那么复杂。还是自己基础不好,对Servlet的生命周期和数据处理没有好的理解。
项目地址