参考http://sishuok.com/forum/blogPost/list/4079.html
if、elseif与else标签
1:if标签的功能:
类似于Java程序中的if,用来表达分支判断。
else标签的功能:
类似于Java程序中的else。
elseif标签的功能:
类似于Java程序中的else if。
2:属性:
if标签和elseif标签都只有一个test属性,它本身是一个OGNL表达式,运算结果为一个boolean值,表示是否符合条件,必须设置。
else标签没有属性。
3: 实例
<%@ taglib prefix="s" uri="/struts-tags" %>
<%
int length=15;
request.setAttribute("len",length);
%>
<s:if test="#request['len']>=20">
您输入的值大于等于20
</s:if>
<s:elseif test="#request['len']<=10">
您输入的值小于等于10
</s:elseif>
<s:else>
您输入的值在10与20之间
</s:else>
<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>
<s:if test="#stat.index%2==0">
<td><s:property value="#stat.count"/> </td>
<td style="background-color: red;">
<s:property value="publisher"/>
</td>
</s:if>
<s:else>
<td><s:property value="#stat.count"/> </td>
<td style="background-color: gray;">
<s:property value="publisher"/>
</td>
</s:else>
iterator标签
用于对集合类型的变量进行迭代输出
1:功能:
iterator标签用来处理循环,可以用它遍历数组、Set和List等集合对象。这个标签还支持在ActionContext中保持一个保存遍历状态的对象,通过这个变量可以得到当前循环的各种信息。
iterator标签在遍历一组对象的时候,它把正在循环的对象放在值栈的栈顶,所以可以直接引用这个对象的方法或属性,后面给出示例。
2:属性:
iterator标签的主要属性:
value:用来指明到底循环的是谁,这个属性的值是OGNL表达式,用来访问ActionContext和值栈中需要被循环的对象。
status:这个属性在ActionContext中保存一个对象,用来返回当前循环的各种信息,可以返回的信息有:
l count:集合含有多少个对象。
l index:正在循环的这一项的索引。
l even:当前遍历到的对象是不是处于列表的偶数索引位置。
l odd:当前遍历到的对象是不是处于列表的奇数索引位置。
l first:正在循环的是不是第一个。
l last:正在循环的是不是最后一个。
begin、end、step:指明了如果使用索引来进行循环时的开始、结束和步长。
var:变量名称,用来引用存放到值栈的被循环的对象。
3:示例:
其实在Java中处理循环的时候,主要用的是for循环和while循环,do-while循环的应用相对少一些。接下来用iterator标签来实现类似于Java中循环的功能。
(1)实现类似于for循环的功能
假如现在要求完全使用标签,来实现循环输出1到10的值,该如何实现呢?
很明显,使用iterator标签的begin、end、step和var属性就可以了,示例代码如下:
- 迭代所有元素
<%@ taglib prefix="s" uri="/struts-tags" %>
<s:iterator var="i" begin="1" end="10" step="1">
<s:property value="#i"/>
</s:iterator>
------------------------------------------------等于
<%
for(int i=1;i<=10;i++){
out.println(i);
}
%>
<s:iterator value="{'故人西辞黄鹤楼','烟花三月下扬州'}" var="poem">
<s:property value="poem"/><br>
</s:iterator>
- 迭代指定部分
获取第四,第五,第六个元素<br/>
<ul>
<s:iterator var="it" value='{"zhang","wang","tian","li","zhao","qian","sun","zhou"}' begin="3" end="5">
<li>
${it}
<s:property value="#it"/>
</li>
</s:iterator>
</ul>
- 使用status
getCount()
getIndex()
isFirst()
isLast()
isOdd() —-奇数行
isEven()
打印奇数元素<br/>
<ul>
<s:iterator var="it" value='{"zhang","wang","tian","li","zhao","qian","sun","zhou"}' status="st">
<s:if test="#st.odd">
<li>
<s:property value="#it"/>
</li>
</s:if>
</s:iterator>
</ul>
- 迭代Map
<table width="300" border="1">
<s:iterator value="#{'java':99,'C++':90,'C':65,'Python':87,'Ruby':89}" var="entry">
<tr>
<td>
${entry.key}
</td>
<td>
${entry.value}
</td>
</tr>
</s:iterator>
</table>
merge和append
merge
属性:var
<s:merge var="newList">
<s:param value=""/>
</s:merge>
append
属性:var
<s:append var="newList">
<s:param value=""/>
</s:append>
<!-- 定义两个集合list1和list2 -->
<s:set var="list1" value='{"zhao","qian","sun","li"}'/>
<s:set var="list2" value='{"zhou","wu","zheng","wang"}'/>
list1:<s:property value="#list1"/><br/>
list2:<s:property value="#list2"/><br/>
使用append合并list1和list2之后<br/>
<s:append var="append">
<s:param value="#list1"/>
<s:param value="#list2"/>
</s:append>
<s:iterator var="it" value="#append">
${it},
</s:iterator>
<br/>
<h3>append只是单纯的将list2接到list1之后重新组成一个集合</h3>
使用append合并list1和list2之后<br/>
<s:merge var="merge">
<s:param value="#list1"/>
<s:param value="#list2"/>
</s:merge>
<s:iterator var="it" value="#merge">
${it},
</s:iterator>
<br/>
<h3>merge从list1和list2依次取一个元素添加到新集合了,这样也就打乱了原有的顺序</h3>
generator
属性:var,val,separator
注意:是val,不是value。 val是要分割的字符串,separator是分割符。
应用:读取到一个字符串之后,可以使用这个代替split方法达到分割的目的
实例
<!--注意:在val的取值中,外层是双引号,内层是一个单引号,如果缺少,输出有问题-->
<s:generator var="newList" val="'abc:xys:sdfs:df'" separator=":"/>
<ul>
<s:iterator var="it" value="#newList">
<li>
<s:property value="#it"/>
</li>
</s:iterator>
</ul>
subset
属性:var,source,start,count
介绍:start:开始的位置,count:从开始算起一共多少个元素
注意:var被放到了page Context中,因此用Iterator访问时要使用#attr.varname
实例
<s:subset var="newList" source='{"as","dasg","ew","ew"}' start="2" count="2"/>
<ul>
<!--使用#attr.newList访问-->
<s:iterator var="it" value="#attr.newList">
<li>
<s:property value="#it"/>
</li>
</s:iterator>
</ul>
sort
属性:var,source,comparator
注意:必须指定比较器comparator,所以需要和bean标签一起使用,var的存储位置是page Context,因此必须使用#attr.varName访问
comparator=“排序的方式” soure=“集合名称” var=“属性的名称” 代表的就是Comparator<Person>里面的属性
value="#attr.person" 循环遍历的对象
sort标签对于指定的集合元素进行排序,排序时,必须提供自己的排序规则,即实现自己的Comparator,自己的Comparator需要实现java.util.Comparator接口。
使用sort标签时可指定如下几个属性:
- comparator:必填属性,指定进行排序的Comparator实例。
- source:可选属性,指定被排序的集合。默认对valuestack栈顶的集合进行排序。
- var: 可选,如果指定了改属性,则生成Iterator对象设置成page范围的属性,该属性可以换成ID ,但推荐使用var属性;改属性的作用与subset标签中var属性作用不同!
实例
package action;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.interceptor.RequestAware;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* @ Author : Rain
* @ Classname : People
* @ Date : 2019/3/23 9:14
* @ Description:
*/
public class People extends ActionSupport implements RequestAware {
private String name;
private Integer age;
private List<People> list=new ArrayList<People>();
public List<People> getList() {
return list;
}
public void setList(List<People> list) {
this.list = list;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public People(String name, Integer age) {
super();
this.name = name;
this.age = age;
}
public People(){}
public String execute(){
list.add(new People("AA", 5));
list.add(new People("QQ",11));
list.add(new People("CQ",15));
list.add(new People("SS",13));
list.add(new People("WW",12));
PeopleCompare com=new PeopleCompare();
requetmap.put("com", com);
return "success";
}
private Map<String, Object> requetmap;
@Override
public void setRequest(Map<String, Object> arg0) {
requetmap=arg0;
}
}
package action;
import java.util.Comparator;
/**
* @ Author : Rain
* @ Classname : PeopleCompare
* @ Date : 2019/3/23 9:33
* @ Description:
*/
public class PeopleCompare implements Comparator<People> {
@Override
public int compare(People o1, People o2) {
return o1.getAge().compareTo(o2.getAge());
}
}
<!-- comparator="排序的方式" soure="集合名称" var="属性的名称" 代表的就是Comparator<Person>里面的属性-->
<s:sort comparator="#request.com" source="list" var="pp">
<!-- value="#attr.person" 循环遍历的对象-->
<s:iterator value="#attr.pp" >
${name }--
${age }<br>
</s:iterator>
</s:sort>
<action name="gg" class="action.People">
<!-- result="名称" 当名称是error的时候,代表着对应的是<result name="error"></result>这个信息;exception="异常全类名"-->
<!-- <exception-mapping result="error" exception="java.lang.ArithmeticException">
</exception-mapping>
<result name="error">/context.jsp</result> -->
<result name="success">/Testif.jsp</result>
</action>