作者: Chuck Cavaness
原文: http://www.onjava.com/pub/a/onjava/excerpt/progjakstruts_14/index3.html
譯者: blasterboy
Email: [email protected]
MSN: [email protected]
這是Jakarta Struts編程一書中使用 Tiles框架系列的第三部分,主要闡述瞭如何使用標記庫(包括:insert, definition, put, putList, add, get, getAsString, useAttribute, importAttribute, and initComponentDefinitions).
Tiles標記庫(The Tiles Tag Library)
這一部分介紹Tiles 框架使用的JSP自定義標記。表14-1列出了框架可用的標記 。這些標記與其他一些基於模板的框架所提供的標記是非常相似的,但是Tiles框架中蘊含着更豐富的功能。
標記名(Tag name) 描述(Description)
Add 增加一個元素到環境列表中。
definition 創建一個Tiles組件定義。
Get 從請求作用域中得到內容(content),這個內容是put 標
記所置入的。
GetAsString 傳遞tile/component/template屬性指定的值到當前的
JspWriter中。
importAttribute 引入一個Tiles屬性到指定的上下文(context)中;
initComponentDefinitions 初始化一個Tiles定義工廠。
Insert 插入一個Tiles組件。
Put 設置一個屬性到一個Tiles上下文中。
PutList 聲明一個列表,這個列表作爲一個屬性被傳遞。
useAttribute 在頁面中使用一個屬性值。
insert 標記
insert 標記是負責頁面中插入內容。在一個Tiles佈局中, insert標記使用屬性值指定的內容。在非Tile佈局中,insert標記是用來獲得一個框架(layout)並且使用put 標記把內容傳遞給佈局中。
表14-2列出insert 標記的屬性:
屬性名(Attribute name) 描述(Description)
attribute 當前Tiles /組件上下文的屬性名稱,這個屬性值是由
name 屬性來傳遞的。
beanName Bean 的名稱作爲值來使用.Bean是從指定的內容中獲得。
如果有的話,Bean可以從指定的上下文中獲得。否則就得
使用pageContext.findAttribute( ) 方法獲得。 如果
beanProperty 屬性已經指定,也可以從相應Bean屬性中
獲得這個值 。
如果,這個Bean(或Bean的屬性值)是某個屬性類
(Direct, Instance,等等)的實例, 那麼插入過程要依照類
的類型而定。另外,調用Bean 的toString( ) 方法,並返
回值爲String,並傳給name屬性。
beanProperty Bean 屬性(property)的名字,如果指定,那麼這個值從
Bean的屬性(property)中獲得.
beanScope Bean的作用範圍,如果沒有指定,
pageContext.findAttribute( ) 方法可以使用。Bean的
範圍可以是任何的JSP, 組件(component),或者模板
(template)。在後兩者情況(組件,模板),bean 可
以在 Tiles (tile)/組件(component)/模板(template)
內容中
component 一個描述tile 或者 模板(template)URI的字符串. 模板
(template),頁(page)和 組件(component)屬
性必須有嚴格相同的行爲
controllerUrl 在頁被插入前,控制器(controller)的直接URI 。 這個URI
通常用來指示一個struct action. 這個控制器(action) 是用
來爲inserted tile 準備數據的。
只能有 一個controllerUrl 或 controllerClass
controllerClass 頁面(page)被插入前,直接調用的一種控制(control)類
的類型。這個類是用來爲inserted tile 準備數據的。
只能有 一個controllerUrl 或 controllerClass 。這個類
實現或擴展下列類之一:
org.apache.struts.tiles.Controller,
org.apache.struts.tiles.ControllerSupport,
或org.apache.struts.action.Action.
definition Insert定義的名稱。定義在一個集中的文件中被定義。現
在,僅僅一個工廠(factory)的定義可以用這個屬性插入。
插入一個用definition定義的定義,用beanName="".
flush true 或者 false. 如果true, 當前頁會在tile insertion.前
輸出流
ignore 如果這個屬性設置爲 true 並且name所指定的屬性不存在的
話,僅僅會返回一個什麼都沒有寫得結果。初始值設置爲
false,可以拋出一個 runtime exception
name 一個要被插入得實體(entity)的名字。查找按照下面的順
序 definition, attribute, 然後 page.
page 一個表示tile 或者 template 的URI字符串。template,
page, 和 component 屬性要嚴格的有同樣的行爲
role 如果用戶是指定的角色,那麼這個標記纔會起作用,否則,
這個標記會被忽略掉,並且不會寫出任何內容。
template 一個表示tile 或者 template 的URI字符串。template,
page, 和 component 屬性要嚴格的有同樣的行爲
definition 標籤
definition 標籤用bean的定義方法創建一個tile (template),這個新創建的bean在requested scope用一個id來標識。definition 標籤的有些語法和insert 一樣。新的定義可以擴展在definition factory (XML file)中已經描述過的定義,並且可以重載以前定義的參數。
屬性名 描述
extends 可以用來擴展的父定義,這個父定義在definitions factory被
定義了。
id 定義bean的名稱,這個屬性是必需的
page 要插入template/component 的URL 。和template.一樣。
role 在插入一個定義前,進行檢查role.如果當前用戶並沒有定義這個
role,那麼這個定義將不會被插入。再插入的時候進行檢查,
而不是在定義的時候。
scope 在新定義bean 的時候被創建。如果沒有指定,
默認值是page scope.
template tile/component/template (a JSP page)的URL .
下面的片斷展示瞭如何在JSP中使用definition標籤。
<tiles:definition
id="storefront.default"
page="/layouts/storefrontDefaultLayout.jsp"
scope="request">
<tiles:put name="header" value="/common/header.jsp" />
<tiles:put name="menubar" value="/common/menubar.jsp" />
<tiles:put name="copyright" value="/common/copyright.jsp" />
</tiles:definition>
一個完整的例子將在這章後面的"Declaring Definitions in a JSP Page" 中展示
put 標籤
put 標籤用來傳遞屬性到一個tile 組件。 這個標籤只能在insert 或 definition 標籤內部使用。 put標籤的值被value 屬性或者標籤體指定。也經常被指定值得類型。
string: 文如其名
page 或template: 內容包含指定的URL. 名字通常以URL用.
definition: 內容從指定(from factory)的定義獲得. 名字以已定義的名字使用。如果type 已經使用, 他就會被get 或 insert 標籤插入到tile. 如果type 屬性沒有被指定,則內容是不確定的untyped,除非它來自一個typed bean.
提示: Setting direct="true" 與setting type="string" 是相同的.
屬性名 描述
beanName Bean 的名稱,和值(value)的使用方法一樣.Bean是從
特殊的內容中獲得。如果有的話,還可以用
pageContext.findAttribute( ) 方法獲得。 如果
beanProperty 屬性已經指定,可以從相應Bean屬性中獲
得這個值 。
beanProperty Bean 屬性(property)的名字,如果指定,那麼這個值從
Bean的屬性(property)中獲得.
beanScope Bean的作用範圍,如果沒有指定,
pageContext.findAttribute( ) 方法可以使用。Bean的
範圍可以是任何的JSP, 組件(component),或者模板
(template)。在後兩者情況(組件,模板),bean 可以
在 Tiles (tile)/組件(component)/模板(template) 內
容中
content Content 在tile 範圍內。 屬性相當於value 屬性,增加是
爲了於JSP template tags 兼容。.
Direct Content的控制方法: true意味着Content直接顯示; false
意味着content 被包含。 false 是默認值。也是指定
content 類型的一種方法。如果 direct="true", content
是 "string"; 如果 direct="false", content 是 "page".
增加這個屬性是爲了於JSP template tags 兼容。.
Name 屬性的名稱(name).
Role 如果用戶是指定的角色,那麼這個標記纔會起作用,否則,
這個標記會被忽略掉,並且不會寫出任何內容。
Type content 的類型(type)。有效值
是"string", "page", "template", 或 "definition".
Value 屬性的值,可以是String 或者 Object. 值是直接被分配
的。 (value="aValue") 或者從一個bean 獲得。一個
value, content, 或 beanName 一定存在。
putList 標籤
putList 標籤建立一個list,在 tile 中以值傳遞。 list 元素用add 標籤增加。這個標籤只能在insert 或definition 標籤中使用。
屬性名 描述
Name List 的名稱。這個屬性是被要求的。
add 標籤
add 標籤是增加一個element 到周圍的list 中。這個標籤只能在putList 標籤中使用。這個值可以直接被分配。 (value="aValue") 或者從一個bean中獲得。 一個value 或beanName 必須被指定。
屬性名 描述
beanName Bean 的名稱,和值(value)的使用方法一樣.Bean
是從特殊的內容中獲得。如果有的話,還可以用
pageContext.findAttribute( ) 方法獲得。 如果
beanProperty 屬性已經指定,可以從相應Bean屬性
中獲得這個值 。
beanProperty Bean 屬性(property)的名字,如果指定,那麼這
個值從Bean的屬性(property)中獲得.
beanScope Bean的作用範圍,如果沒有指定,
pageContext.findAttribute( ) 方法可以使用。
Bean的範圍可以是任何的JSP, 組件
(component),或者模板(template)。在後兩者
情況(組件,模板),bean 可以在 Tiles (tile)/組件
(component)/模板(template) 內容中content
和value 屬性相同。增加這個屬性是爲了於JSP
template tags 兼容。
direct Content的控制方法: true意味着Content直接顯示;
false 意味着content 被包含。 false 是默認值
role 如果用戶是指定的角色,那麼這個標記纔會起作用,否
則,這個標記會被忽略掉,並且不會寫出任何內容。如果
add 標籤在定義中被定義,則role不會起什麼作用。.
type content 的類型(type)。有效值
是"string", "page", "template", 或 "definition".
如果type 屬性沒有指定,則 content 是沒有類型的
(untyped)除非它從一個bean 類型中獲得。.
value 增加的值。可以是String 或者 Object.
get 標籤
get 標籤是從 tile 文中獲得內容。並且把它插入到頁面中。
屬性名 描述
flush true 或者 false. 如果true, 當前頁會在tile insertion.前輸出流.
ignore 如果這個屬性值被設置爲 true 並且屬性被指定的名字不存在,
只會簡單的返回一個什麼都沒有的結果。默認值是false, 它可以引
起一個runtime exception 的拋出。
name 從 tile 範圍內得到的內容的名稱。這個屬性是要求的。
role 如果用戶是指定的角色,那麼這個標記纔會起作用,否則,這個標
記會被忽略掉,並且不會寫出任何內容。
getAsString 標籤
getAsString標記負責查找tile屬性指定的屬性值,並作爲字符串傳給當前的JspWriter對象,一般使用toString()方法進行轉換。如果不存在,將會拋出一個JSPException異常。表14-8列出了這個標記的屬性:
屬性名 描述
ignore 如果這個屬性值被設置爲 true 並且屬性被指定的名字不存在,只
會簡單的返回一個什麼都沒有的結果。默認值是false, 它可以引起
一個runtime exception 的拋出。
name 屬性的名稱(name). 這個屬性是要求的
role 如果用戶是指定的角色,那麼這個標記纔會起作用,否則,這個標
記會被忽略掉,並且不會寫出任何內容。
useAttribute標記
useAttribute 標記在指定的範圍內使用tile的屬性值聲明瞭一個Java 變量和一個屬性。這個變量和屬性由id指定一個名字,如果沒有指定,則是original name 。
屬性名 描述
classname 聲明變量的類名
id 屬性和變量所聲明的名稱
ignore 如果這個屬性值被設置爲 true 並且屬性被指定的名字不存
在,只會簡單的返回一個什麼都沒有的結果。默認值是
false, 它可以引起一個runtime exception 的拋出。
name 屬性的名稱(name). 這個屬性是要求的
scope 聲明屬性的Scope.默認是"page".
importAttribute 標記從tile 中插入一個屬性到被請求的作用域。name 和 scope 屬性是可選的。如果沒有指定,所有的屬性將引入到page作用域 中. 一旦引入,這個屬性可以像其他在JSP中的BEAN一樣使用。
Table 14-10 列出了 importAttribute 標籤的屬性
屬性名 描述
ignore 如果這個屬性值被設置爲 true 並且屬性被指定的名字不存在,只
會簡單的返回一個什麼都沒有的結果。默認值是false, 它可以引起
一個runtime exception 的拋出。
name Tile的屬性名。如果沒有指定,則所有的屬性將被引入。
scope 被引入屬性的scope屬性,默認值"page".
initComponentDefinitions標記
initComponentDefinitions標記初始化定義工廠。
屬性名 描述
classname 如果指定,值爲創建和初始化工廠屬性的類名。
file 定義文件名,此屬性是必需的
作者簡介:
Chuck Cavaness:畢業於Georgia Tech,獲計算機工程與科學學位,在醫療,銀行和B2B領域創建了許多Java企業系統,同時也是O'Reilly的Programming Jakarta Struts 和 Jakarta Struts Pocket Reference兩本書的作者。