首页 > 应用开发 > IT综合 > Turbine实战(下) (转)
Layout相当于Screen、Navigation的容器。负责页面的布局控制。XML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" />
模板化Layout,实际上就是以.vm文件作为Layout模板,使用Velocity来进行页面布局控制。
我们已经在2.2节中见到过一个Layout的模板。可以看到,在这个模板文件中,没有包含任何可显示的数据,仅有的都是一些用来控制布局用的HTML元素。Okay,相信聪明的你都明白我将要说什么了:Layout模板相当于一个有着很多的格子的盒子。而我们唯一需要做的,就是把Navigation、Screen等这些“插件”放到这些格子里去。此时,Layout就相当于表述层中的Controller。写到这里,我不禁为Turbine开发者如此的用心良苦表示钦佩与感谢。
在上一节中,我们已经用Velocity制作了一个简单的Screen。除了需要将基类换为VelocityOnlyLayout.NET/editor/Editor.htm#_edn1" name=_ednref1>[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。
Navigation的Velocity实现方式跟Screen、Layout完全一致。Navigation模板放置的地方为:“TEMPLATES-PATH/navigations/”目录。可以使用的基类为:VelocityNavigation。
当浏览器中输入的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中放入了一些数据。 上面只是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中嵌入这样的代码: …
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/10748419/viewspace-960838/
,如需转载,请注明出处,否则将追究法律责任。
3.3.4.1 Velocity Action Event