写框架思路进程(五)

来源:互联网 发布:大数据与企业战略 编辑:程序博客网 时间:2024/06/07 00:49

主线流程

主线流程,我们需要走一遍,让这个框架可以以一个HelloWorld形式跑起来,这需要把几个核心类的核心方法用最简单的方式进行实现。这里拿我们的MVC框架作为举例:

1、从startup开始,可能需要实现ServletContextListener来动态注册我们框架的入口Serlvet,暂且起名为DispatcherServlet,在这个类中我们需要走一些主线流程。

 1.1 调用Routes.findRoute()获得IRoute

 1.2 调用IRoute.getRouteResult来获得RouteResult

 1.3 使用拿到的RouteResult作为参数调用DefaultControllerFacotry.createController()获得IController(其实也就是AbstractController)

 1.4 调用IController.execute()


2、在config中创建一个IConfig作为一种配置方式,我们实现一个DefaultConfig,把各种默认实现注册到框架中去,也就是DefaultRoute、DefaultControllerFactory、DefaultActinInvoker,然后把各种IViewEngine加入ViewEngines


3、然后需要完成相关默认类的实现:

 3.1 Routes.findRoute()

 3.2 DefaultRoute.getRouteResult()

 3.3 DefaultControllerFactory.createController()

 3.4 AbstractController.execute()

 3.5 DefaultActionInvoker.invokeAction()

 3.6 ViewResult.execute()

 3.7 ViewEngines.findViewEngine()

 3.8 VelocityViewEngine.getViewEngineResult()

 3.9 VelocityView.render()


在这一步,我们并不一定要去触碰filter和model这部分的内容,我们的主线流程只是解析路由,获得控制器,执行方法,找到视图然后渲染视图。过滤器和视图模型的绑定属于增强型的功能,属于支线流程,不属于主线流程。



实现各种支线流程

1. 实现更多的IRoute,并注册到Routes
2. 实现更多的IViewEngine,并注册到ViewEngines
3. 实现必要的IFilterProvider以及FilterProviders,把IFilterProvider注册到FilterProviders
4. 增强DefaultActionInvoker.invokeAction()方法,在合适的时候调用这些IFilter
5. 实现更多的IActionResult,并且为AbstractController实现更多的便捷方法来返回这些IActionResult
6. ……实现更多model模块的内容和plugin模块的内容



总结,实现一个框架的第一大步就是:

1. 设计一套合理的接口

2. 为框架进行模块划分

3. 为框架搭建由抽象结构构成的整体骨架

4. 在这个骨架基础上实现一个HelloWorld程序

5. 为这个骨架的其它部分填充更多实现




Routing 路由分析:


实现Web MVC基础可以概括为1个前段控制器和2个映射。

(1)前端控制器FrontController

ASP.NET和JSP都是以Page路径和URL一一对应,Web MVC要通过URL映射Controller和View,就需要一个前端控制器统一接收和解析请求,再根据的URL将请求分发到Controller。由于ASP.NET和Java分别以IHttpHandler和Servlet作为核心,因此ASP.NET MVC和Spring MVC分别使用实现了对应接口的MvcHandler和DispatcherServlet作为前段控制器。

ASP.NET中通过HttpModule的实现类处理URL映射,UrlRoutingModule根据URL将请求转发给前端控制器MvcHandler。

Spring MVC中,则根据URL的配置,直接将请求转发给前端控制器DispatcherServlet。

(2)URL和Contrller的映射

ASP.NET MVC将URL和Controller的映射规则存储在RouteCollection中,前端控制器MvcHandler通过IController接口查找控制器。

Spring MVC则通过RequestMapping和Controller注解标识映射规则,无需通过接口依赖实现控制器。

(3)URL和View的映射

ASP.NET MVC 默认通过RazorViewEngine来根据URL和视图名称查找视图,核心接口是IViewEngine。

Spring MVC 通过internalResourceViewResolver根据URL和视图名称查找视图,核心接口是ViewResolver。



0 0
原创粉丝点击