struts2的s:iterator 標籤 詳解

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" />

相關文章
相關標籤/搜索