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

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><param name="username" value="zhangsan"/></code>和<code><param name="username">zhangsan</param></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><jsp:include></jsp:include></code>标簽。在标簽的内部可以包含多個param标簽,用于向被包含的頁面傳遞參數。include标簽隻有一個value屬性,用于指定被包含的jsp或者servlet。比如下面的代碼:
includetag.jsp
includejsp.jsp:
最後的通路includetag.jsp,可以看到如下的結果:
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對象中。