Struts 2控制标签
1)if/elseif/else
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<%@taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>s:if标签测试</title>
</head>
<body>
<!-- 在Stack Context中定义一个age属性,其值为29 -->
<s:set name="age" value="29"/>
<!-- 如果Stack Context中的age属性大于60 -->
<s:if test="#age>60">
老年人
</s:if>
<!-- 如果Stack Context中的age属性大于35 -->
<s:elseif test="#age>35">
中年人
</s:elseif>
<!-- 如果Stack Context中的age属性大于15 -->
<s:elseif test="#age>15">
青年人
</s:elseif>
<s:else>
少年
</s:else>
</body>
</html>
2)iterator
iterator主要是对集合进行迭代的,这里的集合可以是List、Set和数组,也可以是MAP集合。
<s:iterator .../>标签有下面的三个属性:
value----指定被迭代的集合,通常是有OGNL表达式确定的,如果没有指定value,则使用ValueStack栈顶的集合。
id-----指定集合中元素的id
status----判断当前迭代元素的属性
<s:iterator value="{'Struts 2权威指南',
'轻量级Java EE企业应用实战','疯狂Ajax讲义'}" id="name">
<tr>
<td><s:property value="#st.count"/><s:property value="name"/></td>
</tr>
</s:iterator>
status实例包括如下几个方法:
- int getCount():返回当前迭代了几个元素
- int getIndex():泛化当前迭代的索引
- boolean isEven() /bolean isOdd():返回当前迭代元素是否为偶数(奇数)
- boolean isFirst() /boolean isLast():返回当前迭代元素是否是第一个(最后一个)元素
<s:iterator value="{'Struts 2权威指南','轻量级Java EE企业应用实战',
'疯狂Ajax讲义'}" id="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>
3)append 标签
append标签用于将多个集合对象拼接起来,组成一个新的集合。 <s:append />标签需要一个id属性,该属性确定拼接后生成的新集合的名称。
<s:append />可以接受多个<s:param />,每个标签为一个集合。
<s:append id="newList">
<s:param value="{'Struts 2权威指南','轻量级Java EE企业应用实战','疯狂Ajax讲义'}" />
<s:param value="{'http://www.leegang.org','http://www.crazyit.org'}" />
</s:append>
<table border="1" width="260">
<!-- 使用iterator迭代newList集合 -->
<s:iterator value="#newList" status="st" id="ele">
<tr>
<td><s:property value="#st.count"/></td>
<td><s:property value="ele"/></td>
</tr>
</s:iterator>
上例中是对list的拼接,也可以对map进行拼接,下面举例map与list的拼接:
<s:append id="newList">
<s:param value="#{'疯狂Java讲义':'李刚','轻量级Java EE企业应用实战':'李刚','疯狂Ajax讲义':'李刚'}" />
<s:param value="#{'http://www.leegang.org','http://www.crazyit.org'}" />
</s:append>
<table border="1" width="280">
<!-- 使用iterator迭代newList集合 -->
<s:iterator value="#newList" 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>
</tr>
</s:iterator>
这里只使用了<s:property>输出,value=key和value,这样竟然可以输出,为啥呢?
经过查资料得知,java里的map key与value是一一对应的
4)generator 标签
generator标签是将一个字符串转化成一个list集合。在该标签体内,整个临时生成的集合位于ValueStack的顶端,但是一旦标签结束,该集合将被移出ValueStack。
有如下的属性:
- count:生成集合中的元素个数
- separator:(必填属性)指定用于解析字符串的分隔符
- val:(必填属性)指定被解析的字符串
- converter:将一个字符串解析成对象集合
- var:将生成的Iterator对象放入StackContext(Stack Context(map):stack上下文,它包含一些列对象,包括request/session/attr/application map等)以及request范围中。也可以替换为id。
<table border="1" width="240">
<!-- 使用generator标签将指定字符串解析成List集合
在generator标签内,得到的List集合位于ValueStack顶端 -->
<s:generator val="'Struts 2权威指南,轻量级Java EE企业应用实战,疯狂Ajax讲义'" separator=",">
<!-- 没有指定迭代哪个集合,直接迭代ValueStack顶端的集合 -->
<s:iterator status="st">
<tr <s:if test="#st.odd">style="background-color:#bbbbbb"</s:if>>
<td><s:property/></td>
</tr>
</s:iterator>
</s:generator>
</table>
这里只使用了<s:property>输出,并没有指定id,介是为啥呢?原因是s:property:得到'value'的属性,如果value没提供,默认为堆栈顶端的元素。
指定count则设置了集合中最多只能包含count个元素;如果指定了var属性,就可以将生成的集合放入Struts 2的stack Context中。
<body>
<!-- 使用generator将一个字符串解析成一个集合,指定了id和count属性 -->
<s:generator val="'Struts 2权威指南,轻量级Java EE企业应用实战
,疯狂Ajax讲义'" separator="," var="books" count="2"/>
<table border="1" width="300">
<!-- 迭代输出Stack Congtext中的books集合 -->
<s:iterator value="#books">
<tr>
<td><s:property/></td>
</tr>
</s:iterator>
</table>
${requestScope.books}
</body>
5)merge 标签
merge也是将多个几个拼接起来,但是merge和append有区别:
假设有三个集合A={a,b,c};B={A,B,C};C={1,2,3}
append的结果是:{a,b,c,A,B,C,1,2,3}
merge的结果是:{a,A,1,b,B,2,c,C,3}
merge是交叉合并的
6)subset 标签
属性有:
- count:子集中的元素个数;若不设定此值,默认为取得源集合的所有元素
- source:指定源集合;若不指定,默认取得ValueStack(ValueStack是值栈 存放表单中的值)栈顶的集合
- start:指定自己从源集合的第几个元素开始截取;默认为第一个(从0开始)
- decider:指定由开发者选中该元素
- var:将生成的Iterator设置为page范围的属性。
<table border="1" width="300">
<!-- 使用subset标签截取目标集合的4个元素,从第2个元素开始截取 -->
<s:subset source="{'疯狂Java讲义','Struts 2权威指南',
'轻量级Java EE企业应用实战','疯狂Ajax讲义',
'疯狂XML讲义'}"
start="1" count="4">
<!-- 使用iterator标签来迭代目标集合,因为没有指定value属性值,
故迭代ValueStack栈顶的集合 -->
<s:iterator status="st">
<!-- 根据当前迭代元素的索引是否为奇数决定是否使用CSS样式 -->
<tr <s:if test="#st.odd">style="background-color:#bbbbbb"</s:if>>
<td><s:property/></td>
</tr>
</s:iterator>
</s:subset>
</table>
Struts 2还允许开发者决定截取标准,如果开发者需要实现自己的截取标准,则需要实现一个Decider类,Decider类需要实现SubsetIteratorFilter.Decider接口,实现该类时,需要实现一个boolean decide(Object element)方法,若返回为真,则表明元素被选入子集。
package lee;
import org.apache.struts2.util.SubsetIteratorFilter;
//用户自定义的Decider类,实现了SubsetIteratorFilter.Decider接口
public class MyDecider
implements SubsetIteratorFilter.Decider
{
//实现Decider接口必须实现的decide方法,
//该方法决定集合中的元素是否被选入子集
public boolean decide(Object element)
throws Exception
{
String str = (String)element;
//如果集合元素(字符串)中包含Java子串,即可被选入子集
return str.indexOf("Java") > 0;
}
}
jsp调用
<body>
<!-- 定义一个Decider Bean -->
<s:bean var="mydecider" name="lee.MyDecider"/>
<!-- 使用自定义的Decider实例来截取目标集合,生成子集
指定var属性,将生成的Itertor放入Stack Context中 -->
<s:subset source="{'疯狂Java讲义','Struts 2权威指南','轻量级Java EE企业应用实战','疯狂Ajax讲义','疯狂XML讲义'}" decider="#mydecider" var="newList"/>
直接输出page范围的newList属性:<br/>
${pageScope.newList}
<table border="1" width="300">
<!-- 迭代page范围内的newList属性 -->
<s:iterator status="st" value="#attr.newList">
<tr <s:if test="#st.odd">style="background-color:#bbbbbb"</s:if>>
<td><s:property/></td>
</tr>
</s:iterator>
</table>
</body>
7)sort 标签
sort标签用于对指定的集合元素进行排序,但是必须要提供自己的排序规则,即需要实现自己的Comparator,自己的Comparator需要实现java.util.Comparator接口。
sort标签的属性有:
- comparator:必填属性,指定进行排序的Comparator实例
- source:指定源集合;若不指定,默认取得ValueStack(ValueStack是值栈 存放表单中的值)栈顶的集合(必须要在source标签体内)
- var:将生成的Iterator设置为page范围的属性。
package lee;
import java.util.Comparator;
public class MyComparator implements Comparator
{
//决定两个元素大小的方法
public int compare(Object element1, Object element2)
{
//根据元素字符串长度来决定大小
return element1.toString().length()
- element2.toString().length();
}
}
jsp应用:
<body>
<!-- 定义一个Comparator实例 -->
<s:bean var="mycomparator" name="lee.MyComparator"/>
<!-- 使用自定义的排序规则对目标集合进行排序 -->
<s:sort source="{'轻量级Java EE企业应用实战',
'疯狂Ajax讲义','Struts 2权威指南',
'疯狂XML讲义'}"
comparator="#mycomparator"
var="sortedList"/>
输出page范围的sortedList属性:<br/>
${pageScope.sortedList}
<table border="1" width="300">
<!-- 迭代page范围内的sortedList属性 -->
<s:iterator status="st" value="#attr.sortedList">
<tr <s:if test="#st.odd">style="background-color:#bbbbbb"</s:if>>
<td><s:property/></td>
</tr>
</s:iterator>
</table>
</body>