概述
Turbine是一个基于Servlet的Web Application Frameworks,使得java开发者可以快速、安全的构建自己的网络应用。Turbine是一个完全的MVC应用框架,主要由以下几个部分组成:
- 表述层:Velocity(又是Jakarta小组的杰作,一个基于Java的模版引擎)或JSP
- 数据层:Torque和Peers
- 控制层:Turbine
- HTML Form Validation:Intake
- 日志:Log4j和Turbine2中的Logging Service
- Service Frameworks:Turbine (在Turbine3中,此部分被称为Fulcrum)
基石
Turbine主要由五部分组成,如下图所示。我们先对这五个部分进行单独介绍,再介绍Turbine的详细流程。1 Action
Action是一个执行特定事务的模块,Turbine中的SessionValidator就是一个典型的Action。在用户提交一个HTML表单的时候,其中有一个隐含的字段就包含了将要被执行的Action的信息。Action机制使得java开发者更容易的处理用户提交的数据。例如,对于“Logout”这个事务,在系统的多个地方都可能被调用;因此,将Logout的事务处理流程写成一个可重用的模块,使得这个事务可以被更方便的调用。这个可重用的模块就是一个Action。通过系统中多种多样的Action,每个Action处理用户数据中不同的信息,这样,整个系统就显得更加简单明快,更易编写、扩充与维护。
并且,Turbine通过Action机制中,还可以使程序流程更加灵活多变。例如,在Page的处理过程中,可以通过执行特定的Action,帮助判断其后将要显示哪个Screen。这时,Action的执行结果就可以作为以后程序的判断依据。
Action是系统中可重用的事务处理组件,Action机制使得Turbine拥有灵活、清晰的事务处理流程。
2 Page
Page模块是在页面生成过程中最先被执行的一个模块,它可以被认为是Action、Layout、Screen、Navigation之间的协调者和组织者。一般情况下,Page先执行用户请求中的指定的Action(如果有的话);然后,根据其后要装载的Screen来选择并执行相应Layout。请注意,在这个时候,究竟是执行哪一个Screen,可能会因为Action执行结果的不同而改变。并且,Screen的Layout也可能因为TurbineResources.properties配置文件中对DefaultLayout的设置不同而改变。
3 Screen
Screen模块从根本上说,是网页的“躯干”。这也是生成网页中的HTML代码的地方。Screen是整个Turbine中最主要的表述(View)部分。Screen是由Layout调用的。请注意:此时,你完全可以调用各种外部模块,比如EJB,来获得数据以构建你的HTML页面。也可以通过JSP,甚至是使用Blog来构建页面内容。
4 Navigation
一般情况下,网站都有自己的Top & Bottom Navigation;不过,通常情况下它们都叫做Header或Footer。同Screen一样,Navigation也是由Layout调用的。不光是作为Header或Footer,Navigation也能以Menu或Tree View的形式出现。
5 Layout
Layout由Page调用,可以认为是Screen和Navigation的容器。类似Swing和AWT中的各种容器,Layout一般定义了各个Navigation、Screen分别显示在页面的什么地方,起到一个布局管理的作用。
可以看出,Turbine中各个模块对象间的封装关系大致如下图所示:
从上图中,我们又可看到,Turbine中的各个元素互相封装(encapsulation),使得HTML页面以一种模板化的形式出现在了我们面前。为什么会这样?Jakarta小组是这样对我们解释的:“This is no accident, the Turbine framework is essentially an object oriented representation of the components of an Html page.”
6 Loader
除了上面提到的五种组件外,Turbine中还存在着另外一种组件:Loader。Loader负责动态装载上面提到五种组件。这些Loader能够将上面的五种组件对象保持在内存中,以形成缓存,加快程序响应。
Loader通过配置文件:TurbineResources.properties来识别这些组件。Loader相当于java中的ClassLoader;而TurbineResources.properties就好像“Loader Classpath”一样,帮助Loader识别各个组件。这样,Turbine就能保证我们的Web Application总是能被正确地装载和执行。
流程
在基于Turbine的Web Application中,一般只有一个Servlet(Turbine Servlet),用来接收用户请求。当这个Servlet接收到请求后,通过分析其中的数据,决定load哪个Page;如果需要的话,Page去执行指定的Action;然后,装载指定的Layout;最后,由Layout调用Screen和Navigation负责web页面的生成。
RunData
在经过这么多层的调用过程中,用户请求中包含的数据是通过RunData对象来传递的。 在系统流程一节的描述中,可以看到RunData通过RunData.save()方法记 录了一个用户登录与否的信息。实际上,RunData主要起到在整个框架中传递参数的作用。RunData实例中可以保存数据库连接、GET/POST/PATH_INFO (GPP) 数 据、Action和Screen的名字以及输出HTML的Document实例。并且,也可以在 RunData中保存需要持久化的信息。 需要注意的是:
* 因为RunData实例不是线程安全的,所以每次请求时RunData实例都会重新创建,并且永远不会保存到全局上下文(Global context)中。 * 每一个Request请求中,只可能存在一个RunData实例。 另外,在
Turbine2.2中,RunData已经由2.0中的public class变成了public interface。但使用方法不变。
Turbine2.2中,RunData已经由2.0中的public class变成了public interface。但使用方法不变。