模仿Spring MVC搭建一个小型的MVC架构(smartMVC)
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"
- 处理转发请求
- 是
- 整个设计完成,当然,还有一部分细节设计没有写出来,比如说自定义配置文件名以及一些使用的细节这些将在代码或使用说明中体现.