Struts2的控制标签,主要用于完成流程控制,以及对ValueStack的控制。数据标签主要用于访问ValueStack中的数据;控制标签可以完成输出流程的控制,例如循环,分支等操作,也可以完成对集合的合并,排序等操作。

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!-- 引入struts2的标签库 -->
<%@ taglib uri="/struts-tags" prefix="s"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

</head>

<body>
<h1>
Struts2控制标签案例
</h1>
<!--
<h3>OGNL中的集合操作</h3>
<h5>OGNL直接生成List类型的集合</h5>

语法格式:{e1,e2,e3,e4,.......}
以上的语法中就直接生成了一个List类型的集合,该集合中包含的元素有:e1,e2,e3,e4,
如果需要更多的集合元素,则元素之间可以使用英文逗号分隔.


<h5>OGNL直接生成Map类型的集合</h5>

语法格式:# {key:value,key1:value1,key2:value2,.....}
以上的语法中就直接生成了一个Map类型的集合,该Mapd对象中的每个key-value对象之间用英文的冒号隔开
,多个元素之间用逗号分隔。


<h5>OGNL提供的对集合的操作符</h5>

OGNL提供了两个元素符:in 和not in
in代表的是:判断某个元素是否在指定的集合中
not in代表的是:某个元素是否不在指定的集合中
除此之外:OGNL还允许通过某个规则取得集合的子集。取得子集的操作符有:
1、? : 取出所有符合选择逻辑的元素
2、^ : 取出符合选择逻辑的第一个元素
3、$ : 取出符合选择逻辑的最后一个元素



<h4>控制标签</h4>

Struts2的控制标签,主要用于完成流程控制,以及对ValueStack的控制。
数据标签主要用于访问ValueStack中的数据;控制标签可以完成输出流程的控制,例如循环,分支等操作
也可以完成对集合的合并,排序等操作。常见的控制标签有:
if :用于控制选择输出的标签
elseif:与if标签结合使用,用于控制选择输出的标签
else :与if标签结合使用,用于控制选择输出的标签
iterator:是一个迭代器,用于将集合迭代输出
sort:用于对集合排序
append:用于将多个集合拼接成一个新的集合
generator:是一个字符串解析器,用于将一个字符串解析成一个新的集合
merge:用于将多个集合拼接成一个新的集合,但与append的拼接方式有所有不同
subset:用于截取集合的部分元素,形成一个新的集合



-->
<h5>
if/elseif/else标签
</h5>

这三个标签都是用于进行分支控制的,它们都是根据一个Boolean表达式的值,来决定是否计算、输出 标签体的内容
test:为boolean表达式 如果为真执行标签体 否则不执行
<s:set name="score" value="80"></s:set>



<s:if test="%{#attr.score>60}">
成绩及格了.....
</s:if>
<s:elseif test="%{#attr.score>35}">
成绩实在是太烂了....
</s:elseif>

<s:else>
成绩以及惨不忍睹.......
</s:else>



上面的if/elseif/else标签组合使用与Java语言中的if/else if/else条件控制结构相似
<s:debug></s:debug>



<h4>
Iterator标签的使用
</h4>


Iterator标签主要用于对集合进行迭代,这里的集合包含List、Set和数组,也可以对Map类型的对象 进行迭代输出
可以指定3个属性: value :这是一个可选属性,value属性指定的就是被迭代的集合,被迭代的集合通常
使用OGNL表达式指定。如果没有指定value属性,则使用ValueStack栈顶的集合
id:这是可选属性,该属性指定了集合里的元素的ID
status:可选属性,该属性指定了迭代时的IteratorStatus实例,通过该实例即可以判定当前 迭代的元素的属性。
例如:是否是最后一个元素,以及当前迭代元素的索引等。 IteratorStatus实例包含以下几个方法: int
getCount()返回当前迭代了几个元素 int getIndex();返回当前元素的索引 boolean
isEven();返回当前迭代的索引是否是偶数 boolean isFirst();返回当前迭代的索引是否是第一个元素 boolean
isLast();返回当前迭代的索引是否是最后一个元素 boolean isOdd();返回当前迭代的索引是否是奇数

var:当前迭代的元素 begin:开始的位置 end:结束的位置 step:跨度

<table border="1px" cellpadding="0" cellspacing="0">

<caption>
图书名称信息
</caption>
<tr>
<th>
图书的名称
</th>
</tr>

<s:iterator var="name"
value="{'HTML入门','Java基础','CSS入门','JavaWeb实战'}" status="st">

<s:if test="#st.odd">
<tr style="background-color: red;">
<td>
<s:property value="name" />
</td>
</tr>
</s:if>
<s:else>
<tr style="background-color: green;">
<td>
<s:property value="name" />
</td>
</tr>
</s:else>


</s:iterator>

</table>




作业实现表格各行换色






<table border="1px" cellpadding="0" cellspacing="0">

<caption>
图书信息
</caption>
<tr>
<th>
图书的名称
</th>
<th>
图书的作者
</th>
</tr>

<s:iterator var="name"
value="#{'HTML入门':'redarmy','Java基础':'lihui','CSS入门':'baobao','JavaWeb实战':'yq'}">
<tr>
<td>
<s:property value="key" />
</td>
<td>
<s:property value="value" />
</td>
</tr>
</s:iterator>

</table>



<h5>
append标签的使用
</h5>


append标签用于将多个对象拼接起来,形成一个新的集合

<h5>
List集合拼接
</h5>
<s:append var="newList">
<s:param value="{'HTML入门','Java基础','CSS入门','JavaWeb实战'}"></s:param>
<s:param value="{'HIbernate教程','Struts2教程'}"></s:param>
</s:append>

<table border="1px" cellpadding="1px" cellspacing="1px">
<caption>
图书信息2
</caption>
<tr>
<th>
图书名称
</th>
</tr>

<s:iterator value="#newList">

<tr>
<td>
<s:property />
</td>

</tr>
</s:iterator>

</table>



<h5>
Map集合的拼接
</h5>

<s:append var="newMap">
<s:param
value="#{'HTML入门':'redarmy','Java基础':'baobao','CSS入门':'李慧','JavaWeb实战':'yq'}"></s:param>
<s:param value="#{'HIbernate教程':'李刚','Struts2教程':'redarmy'}"></s:param>
</s:append>

<table border="1px" cellpadding="1px" cellspacing="1px">
<caption>
图书信息2
</caption>
<tr>
<th>
图书名称
</th>
<th>
图书作者
</th>
</tr>

<s:iterator value="#newMap">

<tr>
<td>
<s:property value="key" />
</td>
<td>
<s:property value="value" />
</td>

</tr>
</s:iterator>

</table>






<h5>
map List集合的拼接
</h5>


<s:append var="newLM">
<s:param
value="#{'HTML入门':'redarmy','Java基础':'baobao','CSS入门':'李慧','JavaWeb实战':'yq'}"></s:param>
<!-- List方式要写成Map的形式 但没有value值 -->
<s:param value="#{'HIbernate教程','Struts2教程'}"></s:param>
</s:append>

<table border="1px" cellpadding="1px" cellspacing="1px">
<caption>
图书信息2
</caption>
<tr>
<th>
图书名称
</th>
<th>
图书作者
</th>
</tr>

<s:iterator value="#newLM">

<tr>
<td>
<s:property value="key" />
</td>
<td>
<s:property value="value" />
</td>

</tr>
</s:iterator>

</table>




<h5>
merge标签
</h5>

merge标签的用法看起来非常像append标签,但是有区别:
<s:append var="ast">
<s:param value="{'html','css','ajax'}"></s:param>
<s:param value="{'java','jsp','servlet'}"></s:param>
<s:param value="{'struts2','mysql','hibernate'}"></s:param>
</s:append>


<s:merge var="mst">
<s:param value="{'html','css','ajax'}"></s:param>
<s:param value="{'java','jsp','servlet'}"></s:param>
<s:param value="{'struts2','mysql','hibernate'}"></s:param>
</s:merge>
<h3>
append标签拼接
</h3>
<s:iterator value="#ast">
<s:property />


</s:iterator>
<h4>
merge标签拼接
</h4>
<s:iterator value="#mst">
<s:property />


</s:iterator>



以上看出:append标签的拼接方式是: 第1个集合中的第一个元素 第1个集合中的第二个元素 第1个集合中的第三个元素
第2个集合中的第一个元素 第2个集合中的第二个元素 第2个集合中的第三个元素 第3个集合中的第一个元素 第3个集合中的第二个元素
第3个集合中的第三个元素 merge标签的拼接方式是: 第1个集合中的第一个元素 第2个集合中的第一个元素 第3个集合中的第一个元素
第1个集合中的第二个元素 第2个集合中的第二个元素 第3个集合中的第二个元素 第1个集合中的第三个元素 第2个集合中的第三个元素
第3个集合中的第三个元素






<h5>
generator标签
</h5>

将制定的字符串按指定的分隔符分隔成多个字串. count:可选属性,指定生成集合中元素的总数
separator:必填属性:指定解析字符串的分隔符 val:必填属性:指定解析字符串
converter:可选属性,转换器,该转换器负责将集合中的每个字符串转换成对象
id:可选属性,如果指明该属性则生成的集合放入到pageContext属性中 注释:generator分隔的字符串
,如果在标签体内,整个临时生成的集合将位于ValueStack的顶端 .但标签结束时,被移出ValueStack。




<table border="1px">
<tr>
<th>
名称
</th>
</tr>
<s:generator val="'this,is,a,doctor'" separator=",">
<!-- 由于在generator标签体内,该集合位于ValueStack的栈顶 ,故此处迭代的就是临时生成的集合 -->
<s:iterator var="bname">
<tr>
<td>
<s:property value="bname" />
</td>
</tr>
</s:iterator>




</s:generator>
</table>
<!-- 通过id标识此解析的集合存入到pageContext中 -->
<s:generator separator="," val="'this,is,a,man'" id="bks"></s:generator>


<h1>
标签体外打印解析的字符串集合
</h1>

<s:iterator value="#attr.bks">
<s:property />


</s:iterator>




<h1>
subset标签
</h1>

subset标签用于取得集合的子集,该标签的底层通过:org.apache.struts2.uitl.SubsetIteratorFilte类提供实现
属性: count:可选属性:代表子集中的元素个数,如果没有指定代表源集合的全部元素
source:可选属性:指定源集合,如果没有指定代表是valueStack的栈顶集合 start:可选属性:从第几元素开始截取
decider:可选属性:指定由开发者自己决定是否选中该元素。 注意事项:
在subset标签内时,subset标签生成的子集位于valueStack的栈顶,如果标签结束,该标签生成的子集
将被移出valueStack栈。


<s:subset source="{'java','test','mybook','txs','lihui'}" start="1"
count="3">
<!-- 由于在subset标签体内,该子集位于ValueStack的栈顶 ,故此处迭代的就是临时生成的集合 -->
<s:iterator>
<s:property />


</s:iterator>
<!-- 注意1代表的是第二元素 -->
</s:subset>







<h5>
实现自己的Decider实例
</h5>
<s:bean name="edu.dc.MyDecider" id="mydecider"></s:bean>
<h6>
通过自己定义的Decider实例来截取目标集合,生成子集
</h6>
<s:subset
source="{'01Java入门','JSP入门','Servlet入门','02Java基础案例','基于Java的经典案例'}"
decider="#mydecider">
<s:iterator>
<s:property />


</s:iterator>
</s:subset>

<h1>
sort标签
</h1>

用于对指定集合元素进行排序,进行排序时,必须提供自己的排序规则,即实现自己的
Comparator,自己的Comparator需要实现java.util.Comparator接口 属性:
comparator:必填属性,指定进行排序的comparator的实例
source:可选属性:指定排序的集合,如果没有指定代表是valueStack的栈顶集合 备注:
在sort标签内时,sort标签生成的子集位于valueStack的栈顶,如果标签结束,该标签生成的子集
将被移出valueStack栈。

<s:bean var="mycomparator" name="edu.dc.MyComparator"></s:bean>
<s:sort comparator="#mycomparator"
source="{'JavaEE','css','JavaHTMl'}">
<s:iterator>
<s:property />


</s:iterator>

</s:sort>






</body>
</html>

/**以上用到的Subset标签用到的bean类如下*/
package edu.dc;

import org.apache.struts2.util.*;

/** 自定定义Decider类,实现SubsetIteratorFilter.Decider */
public class MyDecider implements SubsetIteratorFilter.Decider {

/** 实现Decider接口中的decide方法,该方法决定集合中的元素是否被选入到子集中 */
public boolean decide(Object arg0) throws Exception {
System.out.println("----------------");
/** 把arg0造型为字符串 */
String str = (String) arg0;
/** 如果集合中包含java 那么即可被选入到子集中 */
System.out.println("----------------" + (str.indexOf("Java") > 0));
return (str.indexOf("Java") > 0);
}

}

/**以下是sort标签实例中用到的备案实例*/

package edu.dc;

import java.util.Comparator;

/** 需要实现Comparator接口 */
public class MyComparator implements Comparator<String> {
/**
* 如果该方法返回一个大于0的整数,则第一个元素大于第二元素,如果为0则相同 如果小于零,则第一个元素小于第二元素
*/
public int compare(String o1, String o2) {
/** 根据字符串的长度决定字符串的大小 */
return (o1.length() - o2.length());
}

}