id已經被var代替,status是迭代狀態,從零開始.java
若是設置status="s",能夠這麼寫:express
<s:if test="s.index==0">apache
----------數組
</s:if>
session
下面介紹下簡單的demo:app
s:iterator 標籤有3個屬性:jsp
value:被迭代的集合this
id(即如今的var,表示句柄,) :指向集合中的正在被迭代的元素url
status 迭代元素的狀態spa
1:jsp頁面定義元素寫法 數組或list
<s:iterator value="{'1','2','3','4','5'}" id='number'>
<s:property value='number'/>A
</s:iterator>
打印結果爲: 1A2A3A4A5A
2:索引的用法
若是指定了status,每次的迭代數據都有IteratorStatus的實例,它有如下幾個方法
int getCount()返回當前迭代了幾個元素
int getIndex()返回當前元素索引
boolean isEven()固然的索引是否偶數
boolean isFirst()當前是否第一個元素
boolean isLast()
boolean isOdd()當前元素索引是否奇數
<s:iterator value="{'a','b','c'}" id='char' status='st'>
<s:if test="#st.Even">
如今的索引是奇數爲:<s:property value='#st.index'/>
</s:if>
當前元素值:<s:property value='char'/>
</s:iterator>
3:遍歷map
value能夠直接定義爲:
value="#{"1":"a","2":"b"}"
每一個元素以都好隔開。元素之間的key和value 冒號隔開
value也能夠是數據棧裏面的java.util.Map對象
遍歷寫法以下:
<s:iterator value="map" id="id" status="st">
key : <s:property value='key'/>
value:<s:property vlaue='value'/>
</s:iterator>
固然key 和value 均可以使java 的 Object
3:遍歷數據棧.簡單的List類,該list類中的元素是一個javabean對象,
例如:
List<Attr> label ,該Attr類具備屬性:String attrName,而且attrName具備set,get方法
JSP頁面循環:
<s:iterator value="label" id="id">
<s:property value="#id.attrName" />
</s:iterator>
固然value 還能夠寫成 value="%{label}" ,表示強制從值棧中取名稱爲label的變量
label的屬性List 能夠寫成value="%{label.list}" 至關於:getLabel().getList();
4:遍歷2個對應的list;
List<AttrName> attrN {color,size,style}//顏色,尺寸,背景
List<AttrValue> attrV {red,20,gay}//紅色,20,灰色
這2個list的元素是一一對應的,一個attrN對應一個attrV
<s:iterator value="%{attrN }" id="id" status="status">
index is : <s:property value='status.index'/>
attrName is : <s:property value='id'/> or <s:property value='%{id}'/>
attrName is : <s:property value='%{attrV[#status.index]}'/>
</s:iterator>
<s:bean name="org.apache.struts2.util.Counter" id="counter">
<s:param name="first" value="5" />
<s:param name="last" value="10" />
<s:iterator>
counter:<s:property/>
</s:iterator>
</s:bean>
這個標籤主要的的做用就是迭代出集合。。
value屬性表示須要跌代顯示出來的值。
status屬性,又來保存迭代時的一些狀態值。
注:
1.若是須要引用valueStack中對象棧的值,須要使用這樣的形式。
<s:iterator value="#userList" /> //userList在valueStack被保存在Request中,因此使用#加屬性名
來引用值。
2. 若是集合是action的屬性,例如:action有一個getListMenu()和setListMenu()方法,那麼該listMenu會被當作action的屬性放在對象棧中.
咱們可使用以下的形式來引用這個集合,並用s:iterator來輸出。
<s:iterator value="listMenu" />
3.iterator的value使用定義好的方式,如:
<s:iterator value="{1,2,3,4}" /> //這樣跌代輸出的值就是1.2.3.4這四個值。
2、iterator中輸出具體值,若是,在上面咱們的list中的對象,有兩個屬性,都是String類型,一
個是name,一個是url。
咱們能夠這樣來引用。
1. <s:property value="name" /> //這樣咱們將能夠輸出跌代對象的name屬性值。
2. 若是咱們但願使用<s:url />來將跳轉事後的url進行處理,該如何來作?
<s:url value="%{url}"/> //%{}ognl的表達式,這樣的值可以將url的值進行<s:url/>的處理
在實際上就是轉爲絕對路徑。這樣,咱們就能夠對付一些因跳轉換產生的路徑問題。
緣由:由於<s:iteratotr />之後,當前的對象應該就在ValueStack頂部了,這樣固然的url實際上就是對象的url屬性了
3、使用ognl輸出對應的值。
<s:textfield name="loginName" value="%{#request.loginNames}"/>
使用此表達式,會生成一個文本框,而且,若是request.attribute中有loginNames屬性,將會作爲
些文本框的默認值。
若是隻使用#request.loginNames在struts2的標籤內部,是不會顯示任何值的,注意外面加上
的%{}附號,纔會被強制解析。
若是但願如EL語言同樣直接輸出文件,如在一個<a></a>之間的innerHTML文本爲
#request.loginNames的值,咱們只要使用:<s:property value="#request.loginNames" />使可
以正常使用!
注:
1.${}是EL語言的 %{}這樣的形式是ognl表過式語言的,在struts2的標籤內部,使用%{}這樣的形式
,在標籤外部可使用${}EL語言的方式。若是在struts2的標籤內部使用${}這樣的方式,會出現以
下的錯誤提示:
According to TLD or attribute directive in tag file, attribute value does not accept any expressions
2.不少時候,咱們使用struts2的一些標籤,屬性是須要接受集合的,若是集合是保存在Map棧中,即request,session,param,application等,可使用#變量名的方式,若是獲取的值是在
Action中經過特定的方法來獲取,就須要使用如 value="userList"這樣的方式,#號表示去Map棧中去查找.
struts2中的OGNL用法
User對象屬性獲取
如User中有username和password字段
獲取username屬性<s:property value="user.username" />
獲取password屬性<s:property value="user.password" />
若User中又包含定義了address對象,address對象中包含有addr屬性,則能夠這樣訪問
獲取addr屬性<s:property value="user.address.addr" />
調用值棧中對象的普通方法,user爲值棧中的對象
<s:property value="user.get()" />
調用action中的靜態方法get():
<s:property value="@com.netshuai.action.ManagerAction@get()" />
以上爲調用非值棧中的靜態方法
調用JDK中類的靜態方法
<s:property value="@java.lang.Math@floor(32.56)" />
上例也可寫成<s:property value="@@floor(32.56)" />,省略前面的類則默認使用java.lang.Math類,其餘類不可省略
調用普通類中的靜態屬性
<s:property value="@com.netshuai.model.Address@city" />
address中的city靜態屬性要用public聲明
調用普通類的構造方法,如構造方法爲
public User(String username)
{
this.username=username;
}
調用方法爲<s:property value="new com.netshuai.model.User('hello').username" />,則返回
username值爲hello
獲取List<s:property value="list" />
獲取List中的某一個元素<s:property value="list[0]" />
獲取List的大小<s:property value="list.size" />
獲取Set<s:property value="set" />
沒法獲取Set中的某一個元素,由於Set沒有順序
獲取Map<s:property value="map" />