继手写spring之Ioc、DI之后,对其中的mvc功能做了进一步操作
主要是自己手动实现mvc九大组件中的其中3个,包括HandlerMapping、HandlerAdapter、ViewResovler。另外又实现了View以及ModelAndView对象
代码整体结构如图
完整代码发布在Github:https://github.com/yangzhenyan/spring_mvc.git
基本思路流程:
MVC(初始化Ioc DI操作完成之后,会初始化MVC九大组件,这里我们实现其中3个组件,初始化之后会执行service)
一、initHandlerMapping()
1、调用applicationContext中的方法获取beanName数组
2、通过getBean(beanName)方法获取对象
3、取出RequestMapping注解上的值
4、封装HandlerMapping对象并放入list集合
二、initHandlerAdapter()
1、遍历HandlerMapping,一个HandlerMapping对应一个HandlerAdapter
2、将遍历HandlerMapping、new HandlerAdapter放入adapterMap集合中
三、initViewResolvers()
1、调用ApplicationContext中的getConfig方法,获取配置文件中定义的页面存放路径
2、根据页面存放路径获取文件的File对象,遍历File,一个File对应一个new ViewResovler(一个页面对应一个视图解析器)
3、并用list集合接收ViewResovler
以上mvc组件初始化完成之后,进入service方法doDisPath()
1、根据前端传过来的uri拿到对应的HandlerMapping
2、如果传过来的uri没有对应的HandlerMapping,processDispatchResult()对结果做判断,new ModelAndView('404')参数传过去
3、processDispatchResult()中遍历ViewResovler集合,调用ViewResovler中resolveViewName(mv.getName())方法并返回View
4、调用View中render()方法对页面进行渲染,render方法中定义RandomAccessFile对象对文件进行逐行读取赋值
5、如果uri有对应的HandlerMapping,则从adapterMap集合获取对应的HandlerAdapter
6、调用HandlerAdapter中getModelAndView()方法,进行参数适配反射执行invoke方法并返回ModelAndView对象
7、最后再调用processDispatchResult()方法,解析相应的页面