1:if,elsefi, else标签
简单示例:
<%
int length = 15;
request.setAttribute("len", length);
%>
<s:if test="#request['len'] >= 20">
输入的值大于等于20
</s:if>
<s:elseif test="#request['len'] >= 15">
输入的值大于等于15
</s:elseif>
<s:else>
输入的值小于15
</s:else>
输出情况:
输入的值大于等于15
2:iterator标签
*用来处理循环,可以用它遍历数组,Set和List等集合对象,这个标签还支持在ActionContext中保持一个保存遍历状态的对象,通过这个变量可以得到当前循环的各种信息。
*它在遍历一组对象的时候,它把正在循环的对象放在值栈的栈顶,所以可以直接使用这个对象的方法或者属性。
*属性信息
*value:用来指明访问的是哪个对象。
*status:这个属性在ActionContext中保存一个对象,用来返回当前循环的各种信息,可以返回的信息如下:
*count:集合含有多少个对象
*index:正在循环的这一项的索引
*even:当前遍历到的对象是不是处于列表的偶数索引位置
*odd:当前遍历到的对象是不是处于列表的奇数索引位置
*first:正在循环的是不是第一个
*last:正在循环的是不是最后一个
*begin, end,step:指明了如果使用索引来进行循环时的开始、结束和步长。
*var:变量名称,用来引用存放到值栈的被循环的对象
简单示例1:实现类似于for循环的功能
<s:iterator var="i" begin="1" end="10" step="1">
<s:property value="#i"/>
</s:iterator>
简单示例2:实现类似于while循环的功能
<%
List strList = new ArrayList();
for(int i = 0; i < 10; i++) {
strList.add("str" + i);
}
request.setAttribute("strList", strList);
%>
<s:iterator var="str" value="#request['strList']">
<s:property value="#str"/>
</s:iterator>
输出结果:
str0 str1 str2 str3 str4 str5 str6 str7 str8 str9
简单示例3:访问复杂对象
<%
List userList = new ArrayList();
User user1 = new User();
user1.setAge(20);
user1.setName("zhangsan");
User user2 = new User();
user2.setAge(30);
user2.setName("lisi");
userList.add(user1);
userList.add(user2);
request.setAttribute("users", userList);
%>
<s:iterator var="user" value="#request.users">
user.name=<s:property value="name"/>,
user.age=<s:property value="age"/><br/>
</s:iterator>
输出结果:
user.name=zhangsan, user.age=20
user.name=lisi, user.age=30
简单示例4:使用status属性
如果想输出当前循环的索引,或者是想要把循环输出的数据用表格来展示,并按照奇数行和偶数行来设置不同的背景色,也就是用户熟悉的波浪纹或者斑马纹的效果。
就要使用status属性。<s:property>引用status属性名称的时候前面要加#号
<%
List userList = new ArrayList();
User user1 = new User();
user1.setAge(20);
user1.setName("zhangsan");
User user2 = new User();
user2.setAge(30);
user2.setName("lisi");
userList.add(user1);
userList.add(user2);
request.setAttribute("users", userList);
%>
<s:iterator var="user" value="#request.users" status="state">
索引=<s:property value="#state.index"/>,
user.name=<s:property value="name"/>,
user.age=<s:property value="age"/><br/>
</s:iterator>
输出结果:
索引=0, user.name=zhangsan, user.age=20
索引=1, user.name=lisi, user.age=30
实现斑马纹与波浪纹效果:
<%
List userList = new ArrayList();
User user1 = new User();
user1.setAge(20);
user1.setName("zhangsan");
User user2 = new User();
user2.setAge(30);
user2.setName("lisi");
User user3 = new User();
user3.setAge(30);
user3.setName("wangwu");
User user4 = new User();
user4.setAge(30);
user4.setName("maliu");
userList.add(user1);
userList.add(user2);
userList.add(user3);
userList.add(user4);
request.setAttribute("users", userList);
%>
<table border="1">
<tr>
<td colspan=4 align="center">用户列表</td>
</tr>
<tr>
<td>索引</td>
<td>用户姓名</td>
<td>用户年龄</td>
<td>操作</td>
</tr>
<s:iterator var="user" value="#request.users" status="state">
<tr
<s:if test="#state.even">
bgcolor="#EFF8FF"
</s:if>
<s:else>
bgcolor="#B4CFF1"
</s:else>
>
<td><s:property value="#state.index"/></td>
<td><s:property value="name"/></td>
<td><s:property value="age" /></td>
<td><a href="">修改</a> <a href="">删除</a></td>
</tr>
</s:iterator>
</table>
输出结果:
3:append与param便签
*append标签用于把几个已经存在的集合组合成一个大集合,param标签与它连用,用来指定组合哪些集合
简单示例:
<s:set var="list1" value="{1, 2, 3}" />
<s:set var="list2" value="{4, 5, 6}" />
<s:append var="list3">
<s:param value="#list1" />
<s:param value="#list2" />
</s:append>
<s:iterator value="#list3">
<s:property/>
</s:iterator>
输出结果:
1 2 3 4 5 6
param标签的value属性指定了被组合的集合
4:generator标签
*功能是用来切分字符串,并把切分的结果组成一个集合
*属性
*val:指定被切分的字符串
*separator:指定切分字符串用的分隔符,必须指定,比如要用","来切分字符串"a, b, c, d",最终的结果为包含a, b, c, d四个字符串的集合。
*count: 返回集合的最大长度
*converter: 用于设置自定义的Converter,必须是org.apache.Struts2.util.IteratorGenerator.Converter接口的实现类
*var:指定变量名称,用来访问放到值栈中的集合。
简单示例1:
<s:generator val="%{'aaa,bbb,ccc,ddd,eee'}" separator=",">
<s:iterator>
<s:property /><br/>
</s:iterator>
</s:generator>
输出结果:
aaa
bbb
ccc
ddd
eee
简单示例2:
Generate an iterator with count attribute<br>
<s:generator val="%{'aaa,bbb,ccc,ddd,eee'}" count="3" separator=",">
<s:iterator>
<s:property /><br/>
</s:iterator>
</s:generator>
输出结果:
Generate an iterator with count attribute
aaa
bbb
ccc
count=3表示只取集合中的三个元素,即只有3个元素是有效的。
5:merge标签
*用来把几个已经存在的集合组合成一个大集合,与append标签的作用类似,只是原来集合中出现的各个元素出现在大集合中的顺序不同。
<s:set value="{1, 2, 3}" var="list1"/>
<s:set value="{4, 5, 6}" var="list2"/>
<s:merge var="list3">
<s:param value="#list1" />
<s:param value="#list2" />
</s:merge>
<s:iterator value="#list3">
<s:property/>
</s:iterator>
输出结果为:
1 4 2 5 3 6
6:sort标签
*利用设置的比较器,来对指定的集合进行排序
*主要属性
*comparator: 用来指定对集合排序使用的比较器的实例
*source: 需要排序的集合
*var:变量名称,把集合排序后的结果存放到pagecontext中的key值
实例1:包含基本数据类型的集合排序示例
*首先准备比较器,实现java.util.Comparator接口,实现对整形数据进行升序排序
package com.capinfotech.util;
import java.util.Comparator;
public class IntegerComparator implements Comparator<Integer> {
@Override
public int compare(Integer o1, Integer o2) {
int a = Integer.parseInt(o1.toString());
int b = Integer.parseInt(o2.toString());
if(a > b) {
return 1;
} else if(a < b) {
return -1;
}
return 0;
}
}
页面:
<s:set value="{10, 9, 8, 7, 6, 5, 4, 3, 2, 1}" var="list1" />
<s:bean name="com.capinfotech.util.IntegerComparator" id="integerComparator" />
<s:sort comparator="integerComparator" source="#list1">
<s:iterator>
<s:property/>
</s:iterator>
</s:sort>
输出结果:
1 2 3 4 5 6 7 8 9 10
实例2:包含复杂数据类型的集合排序示例
对包含user的数据集合排序,首先定义一个排序器,根据年龄来排序:
package com.capinfotech.util;
import java.util.Comparator;
import com.capinfotech.model.User;
public class UserComparator implements Comparator<User> {
@Override
public int compare(User user1, User user2) {
if(user1.getAge().intValue() > user2.getAge().intValue()) {
return 1;
} else if(user1.getAge().intValue() < user2.getAge().intValue()) {
return -1;
}
return 0;
}
}
页面:
<%
List userList = new ArrayList();
User user1 = new User();
user1.setAge(40);
user1.setName("zhangsan");
User user2 = new User();
user2.setAge(30);
user2.setName("lisi");
User user3 = new User();
user3.setAge(20);
user3.setName("wangwu");
User user4 = new User();
user4.setAge(10);
user4.setName("maliu");
userList.add(user1);
userList.add(user2);
userList.add(user3);
userList.add(user4);
request.setAttribute("users", userList);
%>
<s:bean name="com.capinfotech.util.UserComparator" id="userComparator" />
<s:sort comparator="userComparator" source="#request.users">
<s:iterator>
<s:property/><br>
</s:iterator>
</s:sort>
输出结果:
name:maliu, age:10
name:wangwu, age:20
name:lisi, age:30
name:zhangsan, age:40
6:subset标签
用于获取指定集合的子集合
属性:
*count: 用于指定子集合中元素的个数
*decider:用于指定实现过滤条件的对象,这个对象会按照过滤条件--检测源集合中的元素是否应该被放入到子集合中,指定过滤条件的类需要实现
org.apache.Struts2.util.SubsetIteratorFilter.Decider接口
*var:变量名称,就是将子集合保存在当前页的上下文pageContext中所指定的key值,以后可以通过该key值来访问。
*source:用于指定源集合
*start:用于指定从原集合的第几个元素开始截取,0代表第一个元素
简单示例1:
<s:set value="{1, 2, 3, 4, 5}" var="list" />
<s:subset source="#list" count="2" start="2">
<s:iterator>
<s:property/>
</s:iterator>
</s:subset>
输出结果:
3 4
简单示例2,使用decider来截取
*首先定义一个decider,
package com.capinfotech.util;
import org.apache.struts2.util.SubsetIteratorFilter.Decider;
public class StringLengthDecider implements Decider {
@Override
public boolean decide(Object element) throws Exception {
String value = element.toString();
if(value.length() == 1) { //如果字符串的长度为1,返回true
return true;
}
return false;
}
}
*页面:
<s:bean name="com.capinfotech.util.StringLengthDecider" var="stringLengthDecider"/>
<s:set value="{'1', '2', '33', '4', '55', '6'}" var="list" />
<s:subset source="#list" start="1" decider="stringLengthDecider">
<s:iterator>
<s:property/>
</s:iterator>
</s:subset>
输出结果:
2 4 6