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