apache开源项目-- Turbine

1.缘起

Jetspeed是Apache Jakarta小组的开放源码门户系统。它使得最终用户可以通过WAP手机、浏览器、PDA等各种设备来使用各种各样的网络资源(比如应用程序、数据以及这之外的任何网络资源)。在这里,Jetspeed扮演了一个处于信息和用户间的hub的角色。

1999 年左右,Jetspeed立项并开始运作。很快,Jetspeed的发展就超越了最初立项时的目标,以任何人都难以想象的速度发展。用Jakarta小组 自己的话说,就是:“The only problem is that this was beyond the scope of this project.”。

现在,Jetspeed逐渐演变成了一个基于Turbine(也是Jakarta小组的杰作)这个网络应用框架(Frameworks)的Web应用引擎。

1.1 Jetspeed

简单的看,Jetspeed就是添加了门户组件的Turbine。它本身既是Portlet容器,又包含了大量的实用Portlet。在Jetspeed中,Portlet的管理主要由以下两种文件完成:

l        .xreg注册文件

l        .psml配置文件

.xreg文件一般放置在webapp-name/WEB-INF/conf目录下,文件名不限。一个Portlet必须通过.xreg文件注册才能在Jetspeed中使用。每一个Portlet组件都是能够被系统实例化,用于输出特定Web文档的Java类。

.psml文件一般放置在webapp-name/WEB-INF/psml目录下,文件名不限。.psml设定了页面内容的显示模式,比如:一个页面如何布局,分为多少列、每列能有多少个窗格、各个窗格的内容是由哪个Portlet输出的等等内容。

2.概述

Turbine是一个基于Servlet的Web Application Frameworks,使得java开发者可以快速、安全的构建自己的网络应用。

Turbine是一个完全的MVC应用框架,主要由以下几个部分组成:

l        表述层:Velocity(又是Jakarta小组的杰作,一个基于Java的模版引擎)或JSP

l        数据层:Torque和Peers

l        控制层:Turbine

l        HTML Form Validation:Intake

l        日志:Log4j和Turbine2中的Logging Service

l        Service Frameworks:Turbine (在Turbine3中,此部分被称为Fulcrum)

本文主要介绍Turbine中的控制层,其余部分请参考各自的文档或参考资料中提到的站点。

3.基石

Turbine主要由五部分组成,如下图所示:

我们先对这五个部分进行单独介绍,再介绍Turbine的详细流程。

3.1 Action

Action是一个执行特定事务的模块,Turbine中的SessionValidator就是一个典型的Action。

在 用户提交一个HTML表单的时候,其中有一个隐含的字段就包含了将要被执行的Action的信息。Action机制使得java开发者更容易的处理用户提 交的数据。例如,对于“Logout”这个事务,在系统的多个地方都可能被调用;因此,将Logout的事务处理流程写成一个可重用的模块,使得这个事务 可以被更方便的调用。这个可重用的模块就是一个Action。通过系统中多种多样的Action,每个Action处理用户数据中不同的信息,这样,整个 系统就显得更加简单明快,更易编写、扩充与维护。

并且,Turbine通过Action机制中,还可以使程序流程更加灵活多变。例如,在Page的处理过程中,可以通过执行特定的Action,帮助判断其后将要显示哪个Screen。这时,Action的执行结果就可以作为以后程序的判断依据。

Action是系统中可重用的事务处理组件,Action机制使得Turbine拥有灵活、清晰的事务处理流程。

3.2 Page

Page模块是在页面生成过程中最先被执行的一个模块,它可以被认为是Action、Layout、Screen、Navigation之间的协调者和组织者。

一 般情况下,Page先执行用户请求中的指定的Action(如果有的话);然后,根据其后要装载的Screen来选择并执行相应Layout。请注意,在 这个时候,究竟是执行哪一个Screen,可能会因为Action执行结果的不同而改变。并且,Screen的Layout也可能因为 TurbineResources.properties配置文件中对DefaultLayout的设置不同而改变。

3.3 Screen

Screen模块从根本上说,是网页的“躯干”。这也是生成网页中的HTML代码的地方。Screen是整个Turbine中最主要的表述(View)部分。

Screen是由Layout调用的。

请注意:此时,你完全可以调用各种外部模块,比如EJB,来获得数据以构建你的HTML页面。也可以通过JSP,甚至是使用Blog来构建页面内容^_^。

3.4 Navigation

一般情况下,网站都有自己的Top & Bottom Navigation;不过,通常情况下它们都叫做Header或Footer。同Screen一样,Navigation也是由Layout调用的。

不光是作为Header或Footer,Navigation也能以Menu或Tree View的形式出现。

3.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.”

3.6 Loader

除了上面提到的五种组件外,Turbine中还存在着另外一种组件:Loader。

Loader负责动态装载上面提到五种组件。这些Loader能够将上面的五种组件对象保持在内存中,以形成缓存,加快程序响应。

Loader 通过配置文件:TurbineResources.properties来识别这些组件。Loader相当于java中的ClassLoader;而 TurbineResources.properties就好像“Loader Classpath”一样,帮助Loader识别各个组件。这样,Turbine就能保证我们的Web Application总是能被正确地装载和执行。

4.流程

行文至此,相信各位对Turbine的标准控制流程已了然于胸:

在 基于Turbine的Web Application中,一般只有一个Servlet(Turbine Servlet),用来接收用户请求。当这个Servlet接收到请求后,通过分析其中的数据,决定load哪个Page;如果需要的话,Page去执行 指定的Action;然后,装载指定的Layout;最后,由Layout调用Screen和Navigation负责web页面的生成。

4.1 Turbine Standard System Flow

在一个常见的Turbine应用中,Turbine Servlet一般遵循下面的处理流程:

1、  当一个新请求来到时,Turbine Servlet首先检查HttpSession实例是否存在。如果不存在HttpSession实例,则直接重定向到这个网址的“HomePage”(这 个“HomePage”的默认值是Login Screen。当然,你也可以在TurbineResources.properties中将它指向任何你希望的地方)。

在重定向的过程中,Turbine还会在Cookie中为这个访问者记录一个唯一标识;如果客户端浏览器不支持Cookie,Turbine会激活“session tracking”,使以后的URLs中都会包含这个用户的标识信息。

2、  用户Session建立后,Turbine会将一部分经常用到的数据缓存到RunData实例中。

3、  接下来,Turbine Servlet会检查用户是否在尝试登录。方法是检查请求中定义的Action是否是“LoginUser”(当然,依旧可以在 TurbineResources.properties文件中进行自定义)。如果是的话,就执行这个Action操作。与其他Action不同的是,这 个“LoginUser”Action必须实现一个用于用户身分验证,并调用RunData.save()方法(表明已通过身分验证)。

4、  无论用户验证通过与否, Turbine Servlet都会调用SessionValidator Action。SessionValidator Action检查用户是否已经登录,如果有的话,更新该用户最后一次登录的时间戳;否则重定向到“Login”Page。这里有一个技巧:如果你希望你的 某些页面拥有权限保护的话,你可以在这些页面的Layout中调用SessionValidate Action。或者你的系统不需要登录的话,你可以用一个简单的仅返回null的SessionValidate Action版本来替代默认版本。

5、  接下来,Turbine Servlet会调用“DefaultPage”。“DefaultPage”会开始一连串的事务处理:调用Action(如果有的话)、执行Layout等等。

6、  当Layout处理完Screen和Navigation后,System Flow结束,Turbine Servlet返回所请求的页面信息。

5. RunData

看到此处,可能大家会有一个共同的疑问,那就是:经过这么多层的调用,那么用户请求中包含的数据究竟是怎么传递的呢?答案就是RunData。

在System Flow一节的描述中,我们可以看到RunData通过RunData.save()方法记录了一个用户登录与否的信息。实际上,RunData主要起到在整个框架中传递参数的作用。RunData实例中可以保存数据库连接、GET/POST/PATH_INFO (GPP) 数据、Action和Screen的名字以及输出HTML的Document实例。并且,你也可以在RunData中保存需要持久化的信息。

需要注意的是:

l        因为RunData实例不是线程安全的,所以每次请求时RunData实例都会重新创建,并且永远不会保存到全局上下文(Global context)中。

l        每一个Request请求中,只可能存在一个RunData实例。

另外,在Turbine2.2中,RunData已经由2.0中的public class变成了public interface。但使用方法不变。参考资料

1、http://jakarta.apache.org/turbine/, Turbine官方站点。

2、http://jakarta.apache.org/turbine/fsd.html, Functional Specification Document。

3、http://jakarta.apache.org/jetspeed/, Jetspeed官方站点。

4、http://jakarta.apache.org/velocity, Velocity官方站点。

5、http://db.apache.org/torque/, Torque官方站点。

6、http://jakarta.apache.org/turbine/fulcrum/howto/intake-service.html, Intake简介。

7、http://jakarta.apache.org/log4j/docs/index.html, Log4j官方站点。

8、http://jakarta.apache.org/turbine/fulcrum/index.html, Fulcrum官方站点。

9、http://www.bluesunrise.com/jetspeed-docs/, Jetspeed第三方文档集。

10、李剑华,《Turbine探索》,《程序员》2003.07。

时间: 2024-11-17 13:14:51

apache开源项目-- Turbine的相关文章

apache开源项目--Apache Drill

为了帮助企业用户寻找更为有效.加快Hadoop数据查询的方法,Apache 软件基金会发起了一项名为“Drill”的开源项目.Apache Drill 实现了 Google's Dremel. Apache Drill 在基于 SQL 的数据分析和商业智能(BI)上引入了 JSON 文件模型,这使得用户能查询固定架构,演化架构,以及各种格式和数据存储中的模式无关(schema-free)数据.该体系架构中关系查询引擎和数据库的构建是有先决条件的,即假设所有数据都有一个简单的静态架构. Apach

15个非常重要的Apache开源项目汇总

15个非常重要的Apache开源项目汇总 自1999年创立以来,Apache软件基金会如今已成了众多重要的开源软件项目之家.本文列举了15个多年来非常重要的Apache项目,这些项目不仅对开源运动来说非常重要,对于与一般的技术世界来说也是非常重要的. 虽然Apache没有去维护有关下载量的完备统计数字,但是像Apache HTTP Server,已成为全球将近5亿多个网站的引擎,再比如OpenOffice,虽然只是前不久才进入Apache的项目库,但也已经被下载了数百万次.Apache还提供更为

Java Apache 开源项目简介

Apache Commons Apache Commons是Apache的一个开源项目,主要致力于各种可重用的Java组件.主要由以下三部分构成: The Commons Proper - 一个可重用的Java组件库(已经开发完的项目,一般我们导入相关jar包就可以使用) The Commons Sandbox - Java组件开发工作区(正在开发的项目) The Commons Dormant - 当前处于非活跃的Java组件库(其实就是还没开始开发) The Commons Proper 一

【转】apache开源项目的介绍

Jakarta项目是ASF(The Apache Software Foundation)的一部分.ASF是一个非赢利组织,她鼓励基于开放的软件许可下进行合作.注重实效的开发,并提供各个领域的高质量软件,她涉及到Http服务器,编译工具,类库,开发架构,服务器端Java技术,J2EE容器,数据库工具,日志工具,XML解析等等诸多领域.ASF提供的java项目有一部分在Jakarta中,还有一些成为独立的诸如Tomcat的项目,Jakarta项目则提供了多种多样开源的java解决通用方案. 先介绍

apache开源项目--nutch

Nutch 是一个开源Java 实现的搜索引擎.它提供了我们运行自己的搜索引擎所需的全部工具.包括全文搜索和Web爬虫. Nutch的创始人是Doug Cutting,他同时也是Lucene.Hadoop和Avro开源项目的创始人. Nutch诞生于2002年8月,是Apache旗下的一个用Java实现的开源搜索引擎项目,自Nutch1.2版本之后,Nutch已经从搜索引擎演化为网络爬虫,接着Nutch进一步演化为两大分支版本:1.X和2.X,这两大分支最大的区别在于2.X对底层的数据存储进行了

apache开源项目--CouchDB

Apache CouchDB 是一个面向文档的数据库管理系统.它提供以 JSON 作为数据格式的 REST 接口来对其进行操作,并可以通过视图来操纵文档的组织和呈现. CouchDB 是 Apache 基金会的顶级开源项目. CouchDB落实到最底层的数据结构就是两类B+Tree . 与现在流行的关系数据库服务器不同,CouchDB 是围绕一系列语义上自包含的文档而组织的. CouchDB 中的文档是没有模式的(schema free),也就是说并不要求文档具有某种特定的结构. CouchDB

15个具有高度影响力的Apache开源项目

自1999年创立以来,Apache软件基金会如今已成了众多重要的开源软件项目之家.其中成功的项目有Geronimo,有Tomcat,有Hadoop,有如今成了大数据王国关键车毂的分布式计算系统. 虽然Apache没有去维护有关下载量的完备统计数字,但是像Apache HTTP Server,已成为全球将近5亿多个网站的引擎,再比如OpenOffice,虽然只是前不久才进入Apache的项目库,但也已经被下载了数百万次. Apache还提供更为宽容的开源许可证. 下面是15个多年来非常重要的Apa

Apache开源项目

log4j Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件,甚至是套接口服务器.NT的事件记录器.UNIX Syslog守护进程等:我们也可以控制每一条日志的输出格式:通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程.最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码. 原文地址:https://www.cnblogs.com/dictionary/p/10957484.h

apache开源项目--Apache POI

Apache POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目.目前POI已经有了Ruby版本. 结构: HSSF - 提供读写Microsoft Excel XLS格式档案的功能. XSSF - 提供读写Microsoft Excel OOXML XLSX格式档案的功能. HWPF - 提供读写Microsoft Word DOC97格式档案的功能. XWPF - 提供读写Microsoft Word DOC2003格式档案的功能. HSLF - 提供读写Micr