一、 控制标签
1、 if/elseif/else标签
使用原理和一般的一样,只要是在使用的过程中要注意格式,可以直接在jsp页面使用该标签。示例如下:
<s:set var="age" value="70"/>
<s:if test="#age>60">
老年人</s:if>
<s:elseif test="#age>20">
青年人</s:elseif>
<s:else>
小孩
</s:else>
结果会输出老年人。
2、 iterator标签
该标签主要用于对集合进行迭代,类似于java中的迭代器。这里的集合包括List、Set和数组,也可以对Map集合进行迭代。使用该标签进行迭代输出时可以使用三个属性:
(1) value:这是一个可选的属性,value属性用于指定被迭代的集合,被迭代的集合通常使用OGNL表达式指定,如果没有使用该属性,则使用ValueStack栈顶的集合。
(2) var:这是一个可选的属性,指定集合里元素的ID,即相当于集合中每个元素的名称,迭代时通过该ID输出集合里的元素。(3) status:也是一个可选的元素,指定迭代时的IteratorStatus实例,通过该实例可判断当前迭代元素的属性。例如是否为集合中的第奇数个元素,为集合中的第几个元素。
代码示例:
<table border="1" width"200">
<s:iterator value="{'张三','李四' , '小明', '小华'}" var="name" status="st"><br>
<tr>
<td>
<s:property value="#st.count"/>
<s:property value="name"/>
</td>
</tr>
</s:iterator>
</table>
结果:
其中,IteratorStatus实例有如下几个方法:
(1) int getCount():返回当前迭代了几个元素。
(2) int getIndex():返回当前迭代元素的索引。
(3) boolean isEven():返回当前被迭代元素的索引是否为偶数。
(4) boolean isFirst():返回当前别迭代元素的索引是否是第一个元素。
(5) boolean isLast():返回当前被迭代元素的索引是否为最后一个元素。
(6) boolean isOdd():返回当前被迭代元素的索引是否为奇数。
以下代码示例使用iterator标签迭代List对象、Map对象
<table border="1" width="300">
<s:iterator value="{'张三','李四',' 王二麻子',' 小华'}" var="name" status="st">
<tr <s:if test="#st.odd">
style="background-color:#bbbbbb"
</s:if>>
<td><s:property value="name"/></td>
</tr>
</s:iterator>
</table>
<table border="1" width="300">
<tr>
<th>姓名</th>
<th>编号</th>
</tr>
<s:iterator value="#{' 张三 ' : '1 ','李四 ' : '2 ' , '王二麻子 ' : '3 '}" var="score" status="st">
<tr <s:if test="#st.odd">
style="background-color:#bbbbbb"</s:if>>
<td><s:property value="key"/></td>
<td><s:property value="value"/></td>
</s:iterator>
</table>
结果:
上面的代码注意事项:在使用if/elseif/else标签时,if后面的test是固定的,不可更改。
迭代时可以直接使用property标签输出集合中的元素。
3、 append标签
该标签用于将多个集合对象拼接起来,组合成一个新的集合,从而允许通过一个<s:interator.../>标签就完成对多个集合的迭代。使用该标签时需要指定一个var属性,该属性确定拼接生成的新集合的名字,该集合被放入Stack Context。另外,该标签还可以添加<s:param.../>子标签,每个子标签指定一个集合。而<s:append.../>标签则是将<s:param.../>指定的多个集合拼接成一个集合。
代码示例:
<s:append var="newlist">
<s:param value="{' 张三' , '李四 ' , ' 王二麻子'}"/>
<s:param value="{' 小明 ' , ' 小华' , ' 小芳'}"/>
</s:append>
<table border="1" width="300">
<s:iterator value="#newlist" status="st" var="list">
<tr>
<td><s:property value="#st.count"/></td>
<td><s:property value="list"/></td>
</tr>
</s:iterator>
</table>
结果如图:
从运行结果就可以看出两个集合合并成一个集合输出了。
当然还可以使用append将多个Map对象拼接成一个新的Map对象,更甚至将一个Map对象和一个List对象拼接起来。
代码示例:
<s:append var="newlist">
<s:param value="#{' 张三' : ' 1 ' , '李四 ' : ' 2' , ' 王二麻子' : '3 '}"/>
<s:param value="#{'小明 ' , ' 小张 ', ' 小华'}"/>
</s:append>
<table border="1" width="300">
<s:iterator value="#newlist" var="list" status="st">
<tr>
<td><s:property value="key"/> </td>
<td><s:property value="value"/> </td>
</tr>
</s:iterator>
</table>
结果如图:
注意:在使用Map类型集合的时候要在集合前加上“ # ”,该语法格式表示创建一个Map类型的集合,这时OGNL表达式语言。一个List集合类型集合的语法为:{e1,e2,e3}。如果不加上#则不会显示内容。
4、 generator标签
使用该标签可以将指定字符串按指定分隔符分隔成多个子串,临时生成的多个子串可以使用iterator标签迭代输出。使用该标签可以指定如下几个属性:
(1) count:可选属性,指定生成集合中的元素总数,例如分隔后本来是可以有3个的,但设置count为2,那么最后的集合还是为2个。
(2) separator:必填属性,指定用于解析字符串的分隔符
(3) val:必填属性,指定被解析字符串
(4) converter:可选属性,指定一个转换器,该转换器负责将集合中的每个字符串转换成对象,通过转换器可以将一个字符串解析成一个对象。
(5) var:可选属性,指定该属性,则生成的Iterator对象放入Stack Context中
代码示例:
<table border="1" width="300">
<s:generator separator="," val="'你是谁,你在哪,你在干嘛'">
<s:iterator >
<tr>
<td><s:property/></td>
</tr>
</s:iterator>
</s:generator>
</table>
结果:
注意:在separator中的是中文的“ , ”,否则不会进行分隔。通过上示例可以看出,使用Iterator标签和property标签都是可以不需要参数的,直接进行迭代和显示。
5、 merge标签
该标签类似于append标签,用于将多个集合连接成一个集合,但拼接方式有区别。例如集合{1,2,3},{a,b,c}。append拼接后为{1,2,3,a,b,c},merge拼接后的数组为{1,a,2,b,3,c}。
6、 subset标签
该标签用于取得集合的子集,通过org.apache.struts2.util.SubsetIteratorFilter类提供实现,有如下几个属性:
(1) count:可选属性,指定子集中元素的个数,不指定该属性默认取得源集合的全部元素。
(2) source:可选属性,指定源集合,不指定该属性默认取得ValueStack栈顶的集合。
(3) start:可选属性,指定自己从源集合的第几个元素开始截取。默认从第一个开始,即默认值为0
(4) decider:可选属性:指定由开发者自己决定是否选中该元素。
(5) var:可选属性,指定该属性,则将生成的Iterator对象设置成page范围的属性。
代码示例:
<table border="1" width="300">
<s:subset source="{'张三 ' , ' 李四' , ' 王五' , ' 小刘' , ' 小华'}" start="1" count="4">
<s:iterator ><tr><td><s:property/></td></tr></s:iterator>
</s:subset>
</table>
结果:
7、 sort标签
用于对指定的集合元素进行排序,进行排序时必须提供自己的排序规则,实现自己的Comparator,该Comparator需要实现java.util.Comparator接口,使用该标签可指定如下几个属性:
(1) comparator:必填属性,指定进行排序的Comparator实例
(2) source:可选属性,指定被排序的集合,不指定默认对Value Stack栈顶的集合进行排序。
(3) var:可选属性,指定该属性,将生成的Iterator对象设置成page范围的属性,不放入Stack Value中。
代码示例:
定义Comparator的java类
package org.app;
import java.util.Comparator;
public class MyComparator implements Comparator{
public static void main(String[] args) {
// TODO Auto-generated method stub}
@Override
public int compare(Object o1, Object o2) {
// TODO Auto-generated method stub
//根据元素字符串长度来决定大小
return o1.toString().length()-o2.toString().length();
}}
jsp中:
<s:bean name="org.app.MyComparator" var="mycomparator"/>
<s:sort comparator="#mycomparator" source="{'abcdefg' , 'abcde' , 'abc' , 'abcdef'}" var="sortedList">
输出page范围的sortlist属性:<br/>
${pageScope.sortedList }
<table border="1" width="300">
<s:iterator>
<tr>
<td><s:property/> </td>
</tr>
</s:iterator>
</table>
</s:sort>
结果:
从上面例子中可以看出,使用sort标签时要结合java类来实现如何排序。