首先,必须承认,turbine作为一个开发框架,已经快绝迹了,阿里巴巴的webx框架是基于turbine做的,所以这里简单介绍一下,如果是阿里系新入职的同学,可以参考一下,当然任何开发人员如果感兴趣turbine的设计,都欢迎。
turbine是什么?
turbine是一个应用开发框架,是一个开发web应用的工具箱,100%纯java,且基于jdk1.3及以上。j2ee兼容且基于servlet,面向MVC构建。
turbine的框架架构overview如下:
turbine的代码结构包含了services、modules和util几个大类,在上图中可见,在servlet基础之上,以MVC为基础结构,modules包含了view部分及action,view主要是pages,其中有三种具体的module——screen、layout和navigation,action作为controller存在,toolbox提供了很多通用的tool,service则是整个框架的插件。一个完整的请求处理流程如下:
请求到来,turbine的controller处理,view部分渲染页面,然后响应输出。
就顺着这个流程,分析一下turbine的架构,对于view部分,我们最直观想到的就是pages,page模块值包含了几个概念,是jsp的?还是velocity的?仅此而已。那么,以一个velocity页面为例,如何组织呢?turbine讲究的是“约定胜于配置”,记住这句真言,也就可以理解turbine了。在开发应用中,要建立三个页面目录,分别是screen、layout和navigation,screen是页面的主体内容,layout是页面的布局,而navigation则是一些页面修饰元素,比如下面这个页面结构:
这三个部分的调用顺序如下:
因为约定的代码结构是在三个目录下写对应名字的java代码,因此名字如果不一致,那么就会出错。当然,页面模板目录有默认的结构,如果在对应的目录下找不到文件,就会读取default.vm文件。
类似servlet,写一个java文件对应处理screen页面,那么代码可能是这样的:
可以看到,这种处理代码很像servlet,方法就像是servlet标准中的doGet和doPost,只不过参数进行了封装。其实,turbine就是一个servlet,看看turbine的源码,Turbine类继承了HttpServlet,实现了doGet和doPost方法,除了一开始初始化一系列配置相关的变量外,在接到一个http请求(get)后,turbine会执行doGet方法,turbine封装了request和response,构建了一个叫做RunData的对象,Rundata是个接口,具体实现是DefaultTurbineRunData,其内部提供了获取http各种数据的方法接口。在每个请求周期,turbine都会利用TurbineRunDataService新建一个RunData,将所有基于servlet的请求相关的东西塞到这个data中。然后,利用从request中得到的请求地址,再调用PageLoader找到对应的Page,执行其中的build方法,其中DefaultPage里会通过LayoutLoader和ScreenLoader来定位到对应的layout和screen,然后执行其中的build相关方法。这样,一整套请求执行就完成了。值得说明的就是如果是表单提交,那么多数情况会多出一个action的执行,也是在page里进行的。如下图
至于turbine中的tool,这类工具是通过配置,以“拉”模式被应用的。当应用启动后,在vm页面中以$开始调用某个tool的时候,就会初始化这个tool。当然,这里就用到了TurbinePullService。
在初步了解了turbine后,如果使用过webx,那么就会知道并一定程度理解了webx的设计;没使用过的,结合自己用过的mvc框架,也可以了解一些框架设计的思路。
参考资料:
Turbine Tutorial
Apache Turbine
本文全部图片都截取自Turbine Tutorial,使用请注明