Turbine實戰(下) (轉)

gugu99發表於2007-08-16
Turbine實戰(下) (轉)[@more@]

Layout相當於Screen、Navigation的容器。負責頁面的佈局控制。:namespace prefix = o ns = "urn:schemas--com::office" />

模板化Layout,實際上就是以.vm作為Layout模板,使用Velocity來進行頁面佈局控制。

我們已經在2.2節中見到過一個Layout的模板。可以看到,在這個模板檔案中,沒有包含任何可顯示的資料,僅有的都是一些用來控制佈局用的HTML元素。Okay,相信聰明的你都明白我將要說什麼了:Layout模板相當於一個有著很多的格子的盒子。而我們唯一需要做的,就是把Navigation、Screen等這些“”放到這些格子裡去。此時,Layout就相當於表述層中的Controller。寫到這裡,我不禁為Turbine開發者如此的用心良苦表示欽佩與感謝。

在上一節中,我們已經用Velocity製作了一個簡單的Screen。除了需要將基類換為VelocityOnlyLayout/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..turbine.util.template.TemplateNavigation。

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

Navigation的Velocity實現方式跟Screen、Layout完全一致。Navigation模板放置的地方為:“TEMPLATES-PATH/navigations/”目錄。可以使用的基類為:VelocityNavigation。

當中輸入的URI中包含Action引數,即類似這樣時:

/action/UpdateWorld

Action將會被觸發並。

此時,Turbine按照以下順序執行:

首先,位於“-INF/classes/com/yourcompany/app/modules/actions/”下的UpdateWorld class將會被執行;隨後,執行HelloWorld class(如果存在的話);最後,執行HelloWorld.vm。

Action是一個執行特定事務的模組。這些事務可能是發一封,也可能是操作,或其他可能的事務。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");

  }

}

word" />ectratio="t" v:ext="edit">

它檢查提交的資料中是否包含“username”變數。如果不包含的話,將切換到“AddUser.vm”模板,並顯示了一個錯誤提示。否則,轉換到“MainMenu.vm”,並顯示相應的提示資訊,除此之外,還在Velocity Context中放入了一些資料。

3.3.4.1 Velocity Action Event

上面只是Action的一個簡單用法,Turbine還提供一種機制,就是Action Event。透過Action Event機制,Turbine提供了一種非常便利的處理fosubmission的方法,使得我們可以更的開發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中嵌入這樣的程式碼:

這一次,請大家自己看一下執行結果吧!

原來,在我們的這個繼承自VelocityAction 的Action開始執行的時候,有一個“event”也同時傳遞給了它。Turbine會根據這個“event”自動去執行相應的方法。如果沒有指定“event”或指定的“event”沒有對應的處理方法的話,doPerform()方法將會被執行。

好了,看到這樣的機制給我們帶來了一個什麼樣的結果了嗎?我們可以把原來需要用一個Action類來完成的事務寫到ActionEvent類的一個方法裡!這樣,我們就不必為每一個“Action”都寫一個對應的類,給我們日後的維護和文件維護帶來了非常大的便利之處。尤其在一個頁面中有很多Button的時候,我們就能更輕鬆的應付,並且阻止了我們陷入“if…else if…”的怪圈。

然而,為了獲得這項神奇的能力,我們不得不以自由為代價……J:

1、Action Event name必須以“eventSubmit_”作為字首

2、完成Action Event的方法必須以“do”打頭

3、“do”之後的第一個字母必須大寫,其餘的字母必須小寫

總結

本文整理了在Turbine下開發簡單應用的方法步驟,主要起到一個引領的作用。透過本文,讀者應能夠快速上手,再透過一些自我實踐,開發一個完整的Turbine應用不是難事。

檔案的查詢方式

假設在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來說,將按照下面的順序查詢相應的模板檔案:

1、/about_us/directions/driving.vm

2、/about_us/directions/default.vm

3、/about_us/default.vm

4、/default.vm

1、  /jbvelocity/jbvelocity.htm">, 用Jbuilder開發Turbine應用。

2、  , TDK的點。

3、  , TDK指南。

4、  , Velocity Context how-to。

5、  , 如何用更簡短的形式書寫URL。



在Turbine2.2的示例程式中,使用VelocityECSLayout作為預設的Layout類,但這個類不支援Frame。除此之外,還提供了VelocityDirectLayout、VelocityLayout兩個類供開發者使用。

在這裡,這個“Event”就是“eventSubmit_doAdd”。

此時,Turbine使用.lang.reflect包完成了這件神奇的事。不過值得注意的是:java.lang.reflect包可是一個“大名”昭著的殺手。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-960838/,如需轉載,請註明出處,否則將追究法律責任。

Turbine實戰(下) (轉)
請登入後發表評論 登入
全部評論

相關文章