实现一个自定义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

posted on 2024-03-21 15:52  池塘里洗澡的鸭子  阅读(6)  评论(0编辑  收藏  举报