Turbine实战(上)

1 综述<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

Turbine的简介和控制流程请参见《Turbine简述》,本文主要描述Turbine2.2应用的开发步骤。

根据我们不同的需要,可以有三种方式来使用Turbine。我们可以任选其一或三者皆取,这取决于我们自己:

l        当成一个Servlet Frameworks,Turbine作为其中的Controller

l        当成一个Framework Code Library

l        当成一个Object-Relational Tool

不论你想如何使用Turbine,都只需要简单的使用Turbine.jar文件就行了。换句话说,比如你想使用Turbine的连接池,只需要把Turbine.jar添加到你的ClassPath里,然后在你的应用里用适当的代码告诉Turbine,配置文件可以在哪里获取,就可以了。

Turbine现在已经发展成了一个庞大的、容易使人畏缩的代码库(Codebase)。虽然如此,但是Turbine拥有清晰的组织形式,使人们能轻松的辨认出各部分的代码的功用。

1.1 Code Organization

Turbine的代码分为以下几个部分:

l        org.apache.Turbine.modules - 这就是Turbine中的Module system。有关各个Module的详细介绍请参见《Turbine简述》。

l        org.apache.Turbine.om - OM的意思是Object Model。这部分代码就是表现Turbine的Object Model是如何构筑的地方,这里到处充斥着Turbine对RDBMS的处理J。

l        org.apache.Turbine.services - 这部分就是Turbine的Service Framework。Service Framework在Turbine中是一个非常重要的方面。这些Service处理着各种各样的事务,比如数据库连接池、比如日志服务等等。

l        org.apache.Turbine.torque - 这就是Turbine的数据持久层。它能根据定义好的XML文件产生出针对特定数据库的.sql,这样的话,我们就很容易构建出一个Object Relational的系统。

l        org.apache.Turbine.util - 顾名思义,这就是Turbine的工具包。这里提供了许许多多的在Web Application里经常会用到的工具。

2 演练

2.1 TDK

为了更方便的做好的演练,我们需要使用到TDK。

Turbine Development Kit (TDK) 是Turbine、Tomcat以及一大堆jar、文档的集合。通过它,我们能够更容易的学习和开发Turbine Application。

2.1.1 TDK

的安装
TDK详细的安装说明请参见参考资料3,本文不再赘述。不过该文的叙述中,仅给出了MySQL数据库的连接方法,鉴于Oracle的使用非常广泛,在此给出Oracle的连接方法:

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

# -------------------------------------------------------------------

#

#  D A T A B A S E  S E T T I N G S

#

# -------------------------------------------------------------------

 

database.name = newapp

database = oracle

createDatabaseUrl = java:oracle:thin:@192.168.99.XXX:1521:SID

buildDatabaseUrl = java:oracle:thin:@192.168.99. XXX:1521:<?xml:namespace prefix = st1 ns = "urn:schemas:contacts" />SID

databaseUrl = java:oracle:thin:@192.168.99. XXX:1521:SID

databaseDriver = oracle.jdbc.OracleDriver

databaseUser = system

databasePassword = manager

databaseHost = 192.168.99. XXX

<?xml:namespace prefix = w ns = "urn:schemas-microsoft-com:office:word" />

Okay,大家都已经安装好TDK和Turbine Data Manager示例了吧。那么,我们现在就开始了。

2.2 Turbine Data Manager

访问Turbine Data Manager(TDM)的首页,我们看到了什么:

查看webapp-name/templates/app/layouts下的Login.vm文件,其内容如下:

<table width="100%">

  <tr>

    <td colspan="2">

      $navigation.setTemplate("/DefaultTop.vm")

    </td>

  </tr>

  <tr>

    <td align="left">

      $screen_placeholder

    </td>

  </tr>

  <tr>

    <td colspan="2">

      $navigation.setTemplate("/DefaultBottom.vm")

    </td>

  </tr>

</table>

试着在其最前面加上一行:“Welcome Turbine Data Manager!”,再次刷新Turbine Data Manager的首页,我们发现,它的首页变为了:

在它的最上方,多了我们刚才加入的一行文本。这究竟是怎么一回事呢?

请注意在《Turbine简述》中所提到的,Turbine使用Velocity来作为其表述层,而.vm(VelociMacro,HTML格式的文本文件)正是Velocity用来控制页面显示使用的配置文件。Velocity以Service的形式加入了Turbine之中,也就是Turbine Service Framework中的Velocity Service。Velocity + Turbine即构成了Template Service。

而Login.vm正是用来控制TDM Login页面显示的VelociMacro。

再看Login.vm中的如下几行:

    <td colspan="2">

      $navigation.setTemplate("/DefaultTop.vm")

</td>

它定义了Login Layout中需要调用DefaultTop Navigation,并且,这个Navigation应该放置在一个表格之中。而DefaultTop.vm中定义了需要显示一个图片,这个图片就是“Turbine Data Manager”。

类似Layout和Navigation的控制方式,Turbine中的Screen、UI也是采取同样的方法进行控制。除了使用.vm文件进行控制外,Turbine还可以通过java类来进行页面布局、内容显示等的控制。

那么,Turbine是如何知道要到这些地方去寻找这些文件的呢?

Turbine的配置文件查找方式为:

1、在web.xml中定义TurbineResources.properties文件的存放路径;

2、在TurbineResources.properties文件中,定义Template File的存放路径[i]。

2.2.1 TDM

中的Screen
现在,让我们来详细看一看TDM中的Screen吧:

请转移到“webapps/APPNAME/templates/app/screens”目录下。大家可能还记得Login.vm文件中有一个“$screen_placeholder”变量,其实,各个Layout中的这个变量就是用现在这个目录下的文件来进行替换的[ii]。

打开“Index.vm”文件,其中有一个名叫“$headings”的变量,这个变量保存了在Index页面中的HEAD信息;另外的一个叫“$entries”的变量则保存所有在Index页面中需要动态显示的内容。这些变量的取值来自与之相关的java类。并且,在Index.vm中还有一些以“#”打头的函数,例如“#entryCell(...)”,这些函数在运行时被替换为各种各样的HTML代码[iii][iv]。

再到“webapps/APPNAME/WEB-INF/src/java/PACKAGE/modules/screens”目录中来看一下,TDM中每个页面里的动态内容都是与这里的java文件紧密相关的。打开“Index.java”文件,就像我们所见到的,doBuildTemplate方法建立了一个名叫“entries”的变量并将getEntries方法中取出的数据放到了其中。你可以自己修改这个java文件,就能够改变TDM取得数据的方法和数据。如果你想知道更详细的信息,请参考Turbine的Turbine/Turbine-2.3/howto/velocity-site-howto.html">Velocity Site Howto

文档。

2.2.2 TDM

中的Action
在TDM中插入一条数据,可以看到,浏览器中显示的URL中的最后一段是:“/action/SQL”。而插入数据实际调用的就是对应于这个Action的“webapps/APPNAME/WEB-INF/src/java/PACKAGE/modules/actions/SQL.java”java类。

在示例程序TDM中,我们可以看到大量这样的URL,通过这些URL,我们就能知道每个操作调用的都是哪些Action,可以使我们更容易地学习Turbine。



[i] 后文将讲述如何配置此项。

[ii] 嗯,严格的讲,这句话并不正确,但相对而言容易理解,姑且如此罢。

[iii] 这些代码保存在“webapps/APPNAME/templates/app/GlobalMacros.vm”文件中,通过这些代码,你就能明白这些函数究竟是用来完成什么功能的啦。

[iv] 至于这些.vm文件中出现的各种不同于HTML的标记、函数的具体意义,请参见资源4

时间: 2024-12-21 21:07:58

Turbine实战(上)的相关文章

Ceph分布式存储实战.

云计算与虚拟化技术丛书 Ceph分布式存储实战 Ceph中国社区 著 图书在版编目(CIP)数据 Ceph分布式存储实战/Ceph中国社区著. -北京:机械工业出版社,2016.11 (云计算与虚拟化技术丛书) ISBN 978-7-111-55358-8 I. C- II. C- III. 分布式文件系统 IV. TP316 中国版本图书馆CIP数据核字(2016)第274895号 Ceph分布式存储实战 出版发行:机械工业出版社(北京市西城区百万庄大街22号 邮政编码:100037) 责任编

Ceph分布式存储实战导读

前言 随着信息化浪潮的到来,全球各行各业逐步借助信息技术深入发展.据悉,企业及互联网数据以每年50%的速率在增长.据权威调查机构Gartner预测,到2020年,全球数据量将达到35ZB,相当于80亿块4TB硬盘,数据结构的变化给存储系统带来了全新的挑战.那么有什么方法能够存储这些数据呢?我认为Ceph是解决未来十年数据存储需求的一个可行方案.Ceph是存储的未来!SDS是存储的未来! 为什么写这本书 目前,磁盘具备容量优势,固态硬盘具备速度优势.但能否让容量和性能不局限在一个存储器单元呢?我们

从学习SEO的途径来解读网站优化越来越难

对于网站优化为什么越来越难,新手要怎样去学习网站优化这些问题大家都谈论的比较多,所以守护也就不再重复了,今天和大家分析的问题是从学习途径来解读网站优化难题,对于各学习途径要采取如何的方式去优化网站.守护建议不管是新手还是SEO资深专员都应该认真读完本篇内容. 大家可能都发现了1月4号的大更新,然而有人欢喜有人愁.各站长类网站论坛也有不少议论,当然更新是好事,有人欢喜有人愁而已.然而很多的人越来越摸不着头脑了:网站优化到底要怎么做?SEO新手到底要怎样入门?对于这些问题本文从三个学习途径和大家讲起

一次排错-当磁盘明明还有空间却写不进去怎么办

  今天上班有一周了,总算开始进行对平台的运维,遇到了第一个实战上的错误. 今天遇到一个告警,说磁盘不能写入,然后查看了一下磁盘空间 使用 df -h 发现磁盘并没有写满,还有很多的剩余空间,然后就想是什么问题,会不会是磁盘出故障什么的了. 然后咨询了一下其他人,通过df -i 查看磁盘的inode号,结果发现inode号在这个磁盘中使用为百分之百. 解决办法: 卸载磁盘 格式化磁盘,并增加inode 然后再重新挂载回原来的地方.

【最受程序员欢迎的图书推荐】学习知识,什么时候都不晚,写书评,就有机会获得这些书

加班 -> 没空学习 -> 总是写同等水平代码 -> 无法提升代码质量 -> 总是出Bug -> 总是需要修改 -> 加班 -> .... 如果这是你的日常,那么恭喜你,你距离被淘汰就不远了. 这个世界每天都在飞速发展,尤其是技术领域,有可能上个月你刚学会的框架,这个月就有了更好的替代品.你在过去引以为豪的技能,今天或许就成了前进的绊脚石. 只有不断学习,才能与时俱进.本文为你总结了过去一年中最受程序员欢迎的图书,看看别人都在看什么.学什么. 福利来了:  1.

毕业就开始做医院信息系统,以后再其他行业有没有前途?

问题描述 毕业就开始做医院信息系统,公司不是很忙,感觉锻炼的机会少,我知道对于刚开始工作的人不利,也没以后再其他行业有没有前途?请大家指教? 解决方案 看你自己的发展趋势了.你毕业就做了医院的信息系统,如果项目很正统的话,这是一个正规项目经验.那么在做正规项目的时候能学到很多东西,比如:ER图设计,业务分析,软件分析等.这是好处一.你公司不忙,说好也说不太好,如果自己爱学,多多丰富知识,时间上很够用,如果真到了以后了,真没啥学习的时候了,而且你现在学习呢,放下心了能学进去.这是其二.那么弊处呢,

JS 追加数组采用 push.apply 的坑

JS数组追加数组没有现成的函数,这么多年我已经习惯了a.push.apply(a, b);这种自以为很酷的,不需要写for循环的写法,一直也没遇到什么问题,直到今天我要append的b是个很大的数组时才遇到了坑. a = new Array(); b = new Array(125624); a.push.apply(a, b); 以上的代码在mac的chrome下抛出了如下的异常 Uncaught RangeError: Maximum call stack size exceeded 如果把

中国大数据六大技术变迁记

集"Hadoop中国云计算大会"与"CSDN大数据技术大会"精华之大成, 历届的中国大数据技术大会(BDTC) 已发展成为国内事实上的行业顶尖技术盛会.从2008年的60人Hadoop沙龙到当下的数千人技术盛宴,作为业内极具实战价值的专业交流平台,每一届的中国大数据技术大会都忠实地描绘了大数据领域内的技术热点,沉淀了行业实战经验,见证了整个大数据生态圈技术的发展与演变. 2014年12月12-14日,由中国计算机学会(CCF)主办,CCF大数据专家委员会协办,中科院

关于JS数组追加数组采用push.apply的问题_javascript技巧

复制代码 代码如下: a = new Array();b = new Array(125624);                     a.push.apply(a, b); 以上的代码在mac的chrome下抛出了如下的异常 复制代码 代码如下: Uncaught RangeError: Maximum call stack size exceeded 如果把数组改为b = new Array(125623);小一个元素居然就好了,测试了一下其他浏览器也都有大数组才出错的问题,但不同浏览器