控制标签:用于执行基本的条件流转
1.if/else if/else标签
test属性控制该标签是否显示
<s:set name="dengji" value="85"/>
<s:if test="#dengji>=90">成绩优秀</s:if>
<s:elseif test="#dengji>=80">成绩良好</s:elseif>
<s:elseif test="#dengji>=60">成绩合格</s:elseif>
<s:else>成绩不合格</s:else>
2.iterator/append/merge/generator/subset/sort标签
(1).iterator标签 用于对集合类型的变量进行迭代输出
value:用来指定被迭代输出的集合
id:用来指定集合中元素的ID属性,配合property进行输出
status:用于指定该集合的status的别名,指定后会生成IteratorStatus实例对象,拥有以下方法:
int getCount(); 迭代元素个数
int getIndex(); 迭代元素当前索引
boolean getFirst(); 是否为第一个
boolean getEven(); 是否为偶
boolean getLast(); 是否最后一个
bolean getOdd(); 是否为奇
由于iteratorstatus对象并不是ognl的根对象因此访问需要加上 #
<s:iterator value="{'Java程序设计 案例教程','JSP实践教程','Struts2完全学习手册'}" id="bookname">
<s:property value="bookname" /><br>
</s:iterator>
昨天的存储bookList也可以解决了:
<s:form action="addBookAction" namespace="/Book" method="addBook">
<s:iterator value="new int[3]" status="st">
<s:textfield name="bookList[%{#st.index}].name" label="图书名称"></s:textfield>
<s:textfield name="bookList[%{#st.index}].price" label="图书价格"></s:textfield>
<s:textfield name="bookList[%{#st.index}].num" label="发行数量"></s:textfield>
</s:iterator>
<s:submit value="添加" />
</s:form>
iterator访问Map集合的方法:
注意自定义集合的value需要有#,或value=“map”,map为action内的map对象
<s:iterator value="#{'a':'1','b':'2'}" id="bookname">
<s:property value="bookname"/> <s:property value="key" /> <s:property value="value"/><br>
</s:iterator>
(2).append/merge标签
将多个集合对象连接起来,从而组成一个新的集合
id:用于定义连接后新集合的名字
param:用于指定一个子集合
append生成的新集合按照集合添加顺序输出,而merge标签用于每个集合交互添加后输出
<s:append id="newList_append"> <s:param value="{'1:1','1:3','1:2'}"></s:param> <s:param value="{'2:1','2:2','2:3'}"></s:param> </s:append> <s:merge id="newList_merge"> <s:param value="{'1:1','1:3','1:2'}"></s:param> <s:param value="{'2:1','2:2','2:3'}"></s:param> </s:merge> <h3>迭代输出由append标签产生的新集合</h3> <s:iterator value="#newList_append" status="st"> <ul <s:if test="#st.odd" >style="color:blue;"</s:if>> <li><s:property/></li> </ul> </s:iterator> <h3>迭代输出由merge标签产生的新集合</h3> <s:iterator value="#newList_merge" status="st"> <ul <s:if test="#st.odd" >style="color:blue;"</s:if>> <li><s:property/></li> </ul> </s:iterator>
3.generator标签
用于将一个字符串按照指定分隔符分隔成多个子串,可以通过iterator标签进行迭代输出。
count:可选属性,用于指定所生成集合中元素的总数
val:必选属性,用于指定被解析的字符串
separator:必选属性,用于指定分隔符
converter:可选属性,用于指定转换器,将集合中的每个字符转换成对象,转换器必须一个继承org.apache.struts2.util.IteratorGenerator.Converter的对象。
外部输出两种方式:
<s:generator val="'Java程序设计 案例教程,JSP实践教程,Struts2完全学习手册'" separator="," count="2" id="bookname">
</s:generator>
<s:iterator value="bookname" status="st">
<li><s:property /></li>
</s:iterator>
<s:generator val="'Java程序设计 案例教程,JSP实践教程,Struts2完全学习手册'" separator="," count="2" id="bookname">
</s:generator>
<s:iterator value="#bookname" id="hello" status="st">
<li><s:property value="hello"/></li>
</s:iterator>
内部输出就不需要写value了,当然写也是可以的,剩下的与上面相同
<s:generator val="'Java程序设计 案例教程,JSP实践教程,Struts2完全学习手册'" separator="," count="2" id="bookname">
<s:iterator status="st">
<li><s:property /></li>
</s:iterator>
</s:generator>
经过测试,在内部输出后,该集合为空,用外部输出无返回值。
4.subset标签
用于从一个集合进行截取,从而产生一个新的子集合
count:可选属性,指定子集中元素的个数,默认取得源集合的所有元素
source:可选属性,指定源集合,如果不指定,默认取得valueStack栈顶的集合,一般都会指定
start:可选属性,指定从源集合的第几个元素开始截取,默认从第一个元素(即start=0)开始
decider:可选属性,由开发者自己决定是否选中该元素
<s:subset source="{'aaa','bbb','ccc','ddd'}" count="3" start="1">
<s:iterator status="st">
<li><s:property /></li>
</s:iterator>
</s:subset>
5.sort标签
用于对指定的集合进行排序,但是排序规则要由开发者提供,即实现自己的Comparator实例
comparator:必选属性,用于指定实现排序规则的Comparator实例
source:可选属性,用于指定将要排序的集合。
MyComparator.java
package ch4;
import java.util.Comparator;
public class MyComparator implements Comparator{
@Override
public int compare(Object o1, Object o2) {
// TODO Auto-generated method stub
return o1.toString().length()-o2.toString().length();
}
}
<s:bean id="mycomparator" name="ch4.MyComparator"/>
<s:sort source="{'a','bbb','cc','dddd'}" comparator="#mycomparator">
<s:iterator status="st">
<li><s:property /></li>
</s:iterator>
</s:sort>