分享
 
 
 

Turbine实战(下)

王朝java/jsp·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

3.3.2 Layout

Layout相当于Screen、Navigation的容器。负责页面的布局控制。

模板化Layout,实际上就是以.vm文件作为Layout模板,使用Velocity来进行页面布局控制。

我们已经在2.2节中见到过一个Layout的模板。可以看到,在这个模板文件中,没有包含任何可显示的数据,仅有的都是一些用来控制布局用的HTML元素。Okay,相信聪明的你都明白我将要说什么了:Layout模板相当于一个有着很多的格子的盒子。而我们唯一需要做的,就是把Navigation、Screen等这些“插件”放到这些格子里去。此时,Layout就相当于表述层中的Controller。写到这里,我不禁为Turbine开发者如此的用心良苦表示钦佩与感谢。

在上一节中,我们已经用Velocity制作了一个简单的Screen。除了需要将基类换为VelocityOnlyLayout[i]以外,使用Velocity编写Layout的步骤跟Screen是完全一样的。Layout模板文件放置在“TEMPLATES-PATH/layouts/”目录下。

现在,让我们再来看一下2.2节中Layout模板里的几个主要变量:

l $screen_placeholder - 非常重要的一个变量。这个变量放置的地方就是Screen将要被输出的地方。这个变量里填充的就是保存在String对象里的Screen文本信息。

l $navigation - 这个变量是用来取得Navigation的。它的对象类型是:org.apache.turbine.util.template.TemplateNavigation。

l $data - 不用多说,就是RunDataJ。

3.3.3 Navigation

Navigation的Velocity实现方式跟Screen、Layout完全一致。Navigation模板放置的地方为:“TEMPLATES-PATH/navigations/”目录。可以使用的基类为:VelocityNavigation。

3.3.4 Action

当浏览器中输入的URI中包含Action参数,即类似这样时:

http://www.server.com/servlet/Turbine/template/HelloWorld.vm/action/UpdateWorld

Action将会被触发并执行。

此时,Turbine按照以下顺序执行:

首先,位于“WEB-INF/classes/com/yourcompany/app/modules/actions/”下的UpdateWorld class将会被执行;随后,执行HelloWorld class(如果存在的话);最后,执行HelloWorld.vm。

Action是一个执行特定事务的模块。这些事务可能是发一封mail,也可能是操作数据库,或其他可能的事务。Action执行结束后不返回任何值,仅有可能通过RunData.setMessage()方法在RunData中放置一条Message。但是,在Action的事务处理过程中,有可能改变或中断即将被执行的Template和Screen。

Velocity同样提供了对Action的支持,但与上面提到的三个模块(Screen、Layout、Navigation)不同的是,Action不需要编写对应的模板文件。下表就是一个简单的Action:

package com.yourcompany.app.modules.actions;

// Velocity Stuff

import org.apache.velocity.context.Context;

// Turbine Stuff

import org.apache.turbine.util.RunData;

import org.apache.turbine.modules.actions.VelocityAction;

public class AddUser extends VelocityAction

{

public void doPerform( RunData data, Context context ) throws Exception

{

if ( data.getParameters().getString("username",null) == null)

{

data.setMessage("Username does not exist");

setTemplate ( data, "AddUser.vm" );

return;

}

// store user info into database

data.setMessage("Information stored!");

setTemplate( data, "MainMenu.vm");

// stuff something into the Velocity Context

context.put ("variable", "foo");

}

}

它检查提交的数据中是否包含“username”变量。如果不包含的话,将切换到“AddUser.vm”模板,并显示了一个错误提示。否则,转换到“MainMenu.vm”,并显示相应的提示信息,除此之外,还在Velocity Context中放入了一些数据。

3.3.4.1 Velocity Action Event

上面只是Action的一个简单用法,Turbine还提供一种机制,就是Action Event。通过Action Event机制,Turbine提供了一种非常便利的处理form submission的方法,使得我们可以更快速的开发Turbine应用。

为了明白Action Event机制的原理,我们先复习一下Turbine的相关内容J:

当Turbine接受到一个包含Action请求的URI时,首先执行这个Action,然后……噢,对的,就是这样。然而,对于那些继承自ActionEvent的类来说,在这个Action被执行时,发生了一些奇妙的事……

给大家留个悬念先,让我们来看一下代码J:

public class NewUserFoo extends VelocityAction

{

public void doAdd (RunData data, Context context) throws Exception

{

// put code here to add the user to the system

context.put ("username", username );

data.setMessage("User Added!");

}

public void doPerform(RunData data, Context context) throws Exception

{

data.setMessage("Button not found!");

}

}

然后,在我们的HTML tag中嵌入这样的代码:

<form method="post" action="$link.setAction("NewUserFoo ")">

<input type="submit" name="eventSubmit_doAdd" value="Add User">

这一次,请大家自己看一下执行结果吧!

原来,在我们的这个继承自VelocityAction 的Action开始执行的时候,有一个“event”也同时传递给了它[ii]。Turbine会根据这个“event”自动去执行相应的方法[iii]。如果没有指定“event”或指定的“event”没有对应的处理方法的话,doPerform()方法将会被执行。

好了,看到这样的机制给我们带来了一个什么样的结果了吗?我们可以把原来需要用一个Action类来完成的事务写到ActionEvent类的一个方法里!这样,我们就不必为每一个“Action”都写一个对应的类,给我们日后的程序维护和文档维护带来了非常大的便利之处。尤其在一个页面中有很多Button的时候,我们就能更轻松的应付,并且阻止了我们陷入“if…else if…”的怪圈。

然而,为了获得这项神奇的能力,我们不得不以自由为代价……J:

1、Action Event name必须以“eventSubmit_”作为前缀

2、完成Action Event的方法必须以“do”打头

3、“do”之后的第一个字母必须大写,其余的字母必须小写

4 总结

本文整理了在Turbine下开发简单应用的方法步骤,主要起到一个引领入门的作用。通过本文,读者应能够快速上手,再通过一些自我实践,开发一个完整的Turbine应用不是难事。

备注

Velocity template文件的查找方式

Screen

假设在Turbine的控制流程中,data.getParameters().getString("template")返回的是“/about_us/directions/driving.vm”的话,Turbine将按照如下顺序查找相应的Screen class:

4、about_us.directions.Driving

5、about_us.directions.Default

6、about_us.Default

7、Default

8、VelocityScreen(即services.VelocityService.default.screen)

如果返回值为null,则VelocityScreen将会被执行,此时调用的模板文件为“templates/screens/index.vm”。

假设出现其他任何异常,比如“templates/screens/index.vm”不存在,或模板文件不合法,或发生了其他任何异常,“templates/screens/error.vm”都将被载入执行。

Layout & Navigation

此时,对于Layout和Navigation来说,将按照下面的顺序查找相应的模板文件:

1、/about_us/directions/driving.vm

2、/about_us/directions/default.vm

3、/about_us/default.vm

4、/default.vm

资源

1、 http://www.jieesoft.com/resource/jbvelocity/jbvelocity.htm, 用Jbuilder开发Turbine应用。

2、 http://jakarta.apache.org/builds/jakarta-turbine/tdk/release/, TDK的下载点。

3、 http://jakarta.apache.org/turbine/tdk/tdk-howto.html, TDK安装指南。

4、 http://jakarta.apache.org/turbine/turbine-2.2.1/howto/context-howto.html, Velocity Context how-to。

5、 http://httpd.apache.org/docs/mod/mod_rewrite.html, 如何用更简短的形式书写URL。

[i] 在Turbine2.2的示例程序中,使用VelocityECSLayout作为缺省的Layout类,但这个类不支持Frame。除此之外,还提供了VelocityDirectLayout、VelocityXslLayout两个类供开发者使用。

[ii] 在这里,这个“Event”就是“eventSubmit_doAdd”。

[iii] 此时,Turbine使用java.lang.reflect包完成了这件神奇的事。不过值得注意的是:java.lang.reflect包可是一个“大名”昭著的性能杀手。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有