实现一个自定义MVC
在Spring核心思想之 AOP:在自定义容器基础上实现AOP功能的容器上实现类似SpringMVC的功能。先分析下SpringMVC功能,在Spring MVC快速搭建初体验中:
1、web.xml配置的功能被实现了WebApplicationInitializer的类替代,即不用解析web.xml配置文件直接执行WebApplicationInitializer实现类即可。
2、关于访问路径与页面的匹配,直接在控制类中实现,也不用进行xml文件相关配置。
3、使用@EnableWebMvc使WebMvc可用。其中使用Java Bean的方式,配置了页面路径、处理方式等相关内容。
本质就是处理url匹配应用服务,如何匹配的问题。自定义实现中通过LFDispatcherServlet,其实现关系图如下:
在看看其类图:
其中:
1)handlerMappings(list)保存控制类中关于requestMapping的解析内容;
2)handlerAdapters(map)保存handlerMapping与handler(实际处理业务逻辑)的映射;
3)viewResolvers(list)保存渲染页面的resolver——即处理页面相关内容。
以上关于配置文件及页面等资源文件的处理结束后,就是等待用户访问请求。
接受访问请求:重写Servelet中的doPost的方法,具体内容如下:
这个方法的作用就是访问的url与handlerMappings中的匹配,如果匹配获取handlerAdapters中的处理对象,利用这个对象中的处理逻辑得到处理页面和模块,最后返回给客户端。
这个过程中就体现了dispatch,看下图:
最早使用Servelet时在配置文件中需要将servelet与其对应执行类一一映射,访问请求没问题就直接调用执行对象了。而MVC中映射在控制类中配置,同时多了一步就是将所有的映射全部保存在一个servelet中DispatcherServlet,这样一个全局的servelet就可以处理接受到的所有请求。
SpringMVC就是在表现层干了这么一件事,却优势多多——是不是精兵简政了。
看看@EnableWebMvc:
看类中的方法是不是与自定义中的的配置类似。在这个类中还有很多其他方法,比如addInterceptors(Spring MVC拦截器(Interceptor)使用)等增加额外的功能。
实现源码及测试代码:https://gitee.com/duckinpool/homework_2021/tree/master/1.3_springmvc