Struts 2的标签库(2)——控制标签

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>

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值