天天看點

Struts2架構學習之五:通用标簽詳解

前言

struts2架構為我們提供了很多标簽,這些标簽總體上可以分為兩類:通用标簽和ui标簽。而較常使用的又是通用标簽,是以文章的内容也是圍繞通用标簽展開的。通用标簽分為兩類:資料标簽和控制标簽。資料标簽用于通路值棧中資料,控制标簽用于控制呈現頁面時資料執行流程。如果需要使用struts 2架構的标簽庫,需要在頁面的首部引入以下代碼:<code>&lt;%@ taglib uri="/struts-tags" prefix="s"%&gt;</code>下面将分别對這兩種标簽進行說明。

資料标簽

資料标簽主要用于通路actioncontext和值棧中資料,資料标簽包括:

property

set

push

param

bean

action

include

url

a

i18n

text

date

debug

1、property标簽

property标簽用于輸出值棧中對象的屬性值,value屬性就是要輸出的值。如果沒有執行value屬性,那麼預設就會輸出棧頂對象

property标簽的屬性包括:

名稱

是否必需

說明

default

如果value屬性是null,則輸出default的值

value

進行求值的表達式

2、set标簽

set标簽是将一個值賦給指定範圍的變量。如下前面的ognl表達式文章中就多次使用了set标簽。set标簽的屬性包括:

name

變量的名字

指定一個表達式,将計算的結果賦給變量。如果沒有執行value屬性,預設将棧頂對象賦給變量

scope

變量的範圍,有application、session、request、page和action(預設值)

注意的是,在使用預設scope的值,即action範圍的時候,value屬性值會儲存在request和ognlcontext(ognl上下文)中。比如下面的例子:

action:

jsp:

最後的測試結果:

Struts2架構學習之五:通用标簽詳解

3、push标簽

push标簽的作用是将一個對象放入值棧中,是以push對象位于棧頂,但是push标簽結束之後,棧頂的元素将會被删除,是以需要通路push的對象需要在push标簽的内部通路。push标簽隻有屬性value,這也是一個必需提供的屬性。那麼具體在開發中push标簽有什麼作用呢?答案是簡化對屬性的通路。比如需要通路一個user對象的name屬性和age屬性,正常在jsp頁面使用struts 2标簽庫進行通路的方式是<code>#request.user.name</code>和<code>#request.user.age</code>(假設是request範圍),而使用push标簽,通路name屬性的方式是:

4、param标簽

param标簽通常是作為其他标簽的子标簽,用于為其他标簽提供參數。param标簽有兩個非必需屬性name和value。其中的name屬性是要設定參數的名字,value則是該參數的值。使用param标簽有兩種方式:<code>&lt;param name="username" value="zhangsan"/&gt;</code>和<code>&lt;param name="username"&gt;zhangsan&lt;/param&gt;</code>。在第一種方式中,value屬性并不會作為name屬性的值,而是表達式對待,是以如果zhangsan屬性是空的話,将得到null ,是以需要把value改成<code>%{'zhangsan'}</code>。第二種通路方式是沒有什麼問題的。是以這種方式也是推薦的寫法。

5、bean标簽

bean标簽相當于jsp中的usebean标簽,bean标簽通常用于執行個體化一個javabean對象,一個bean标簽内部可以有多個param标簽,用于為bean執行個體設定屬性值(要求有set方法)。bean标簽有兩個屬性:name和id。其中的name屬性是要執行個體化的bean的完整類名,id用于指定一個名字,用于引用放入ognlcontext中的javabean對象。這裡需要注意的是,出了bean标簽,放入棧頂的執行個體(用bean标簽建立的javabean對象會放入棧頂)會被移除。但是如果指定了id屬性,在bean标簽的外部就可以通路了。此時需要使用#符号。是以如果需要建立在bean執行個體可以在bean标簽的外部也可以通路到,就需要指定id屬性。

6、action标簽

通過指定action的名字和可選的命名空間,action标簽允許在jsp頁面直接通路action。如果将action标簽的executeresult屬性設定為true,那麼action對應的輸出結果也會包含在本頁面中。由于這種方式并不常用,而且在實際開發中使用的場合比較少,這裡就不詳細說明了。

7、include标簽

該标簽類似于jsp中<code>&lt;jsp:include&gt;&lt;/jsp:include&gt;</code>标簽。在标簽的内部可以包含多個param标簽,用于向被包含的頁面傳遞參數。include标簽隻有一個value屬性,用于指定被包含的jsp或者servlet。比如下面的代碼:

includetag.jsp

includejsp.jsp:

最後的通路includetag.jsp,可以看到如下的結果:

Struts2架構學習之五:通用标簽詳解

8、其他标簽

其中的url标簽用于建立一個url,在标簽内部可以提供url附加的參數資訊。i18n标簽和text标簽主要用于國際化的支援。i18n标簽把一個資源包放入值棧中,text标簽用于從資源包中擷取消息。date标簽主要用于格式化日期的輸出。

控制标簽

控制标簽用于在呈現頁面的時候控制程式的執行流程。常用的控制标簽包括:

if/elseif/else

iterator

generator

1、if/elseif/else 标簽

下面是這個标簽使用的一個例子:

2、iterator标簽

iterator标簽用于疊代一個集合的元素,在疊代的過程中,會暫時把疊代的對象壓入棧頂,這樣在标簽的内部可以通路對象的屬性值了。通路結束之後,會把棧頂的疊代對象移除,并把下一次疊代的對象壓入棧頂。這樣一直到所有的對象疊代完畢。iterator标簽有三個屬性:id、value和status。id屬性幾乎不使用,value屬性用于指定疊代的集合,status屬性可以擷取疊代中的一個狀态資訊(比如索引值、是否是奇數、偶數等),其所有的方法如下:

public int getcount():得到疊代元素的總數

public int getindex():得到目前疊代元素的索引

public boolean iseven():判斷目前疊代的元素的順序是否是偶數

public boolean isodd():判斷目前疊代的元素的順序是否是奇數

public boolean isfirst():判斷目前疊代的元素是否是第一個元素

public boolean islast():判斷目前疊代的元素是否是最後一個元素

比如下面的例子:

3、generator标簽

generator标簽主要是根絕分隔符對元素進行處理,該标簽一般和iterator标簽使用,在generator标簽的内部可以使用iterator标簽對處理之後的元素進行疊代,下面是一個例子:

generator标簽中上述的separator屬性和val屬性是必需的,如果指定了id屬性,那麼将以id屬性的值作為key,将生成的疊代器儲存在pagecontext對象中。