struts统制标签的使用例子
在Struts2中的非UI标签包括控制标签和数据标签,主要的作用是完成流程控制,以及操作Struts的ValueSack。
控制标签有下面几个:
1、if:用于控制选择输出的标签。
2、else if /else if:与if标签结合使用,用于控制选择输出的标签。
3、else:与if标签结合使用,用于控制选择输出的标签。
4、append:用于将多个机会拼接成一个新的集合。
5、generator:他是一个字符串解析器,用于将一个字符串解析成一个集合。
6、iterator:这是一个迭代器,用于将集合迭代输出。
7、merger:用于将多个机会拼接成一个新的集合。但与append的拼接有所不同。
8、sort:这个标签用于对集合进行排序。
9、subse:这个标签用于截取集合的部分元素,形成新的子集合。
Struts标签其实和html标签有点类似因为都是成对存在的
下面给大家示范下怎么使用这些标签的实例:
一、if /else if /else标签,其实是通过条件的判断进行选择输出我们想要的结果和java哪里是一样的。
<s:set name="age" value="29"/> <s:if test="#age>60"> 老人 </s:if> <s:elseif test="#age>35"> 中年人 </s:elseif> <s:slse> 少年 </s:slse>
二、iterator标签,对集合进行迭代输出集合里面的内容,这里的集合包涵有List、Set和数组,也可以对Map集合进行迭代
<%@page pageEncoding="GBK" contentType="text/html; charset=GBK" %> <%@ taglib prefix="s" uri="/struts-tags" %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GBK"/> <title></title> </head> <body> <table border="1" width="20"> <!-- 这里value的值是使用‘’表示字符串的如果在使用的使用的单字符如:1、2、3等a、b、c等分开的字符放到''笔者试验过 包错java.lang.ClassCastException: java.lang.Character cannot be cast to java.lang.String这个大家注意下吧。 --> <s:iterator value="{'aaa','bbb','ccc','ddd','eee','fff','ggg','hhh','iii'}" id="name" status="st"> <tr> <td> <s:property value="name"/> </td> </tr> </s:iterator> </table> </body> </html>
上面的status属性中指的是iterator对象,他可以使用这个迭代器中的一些方法
我给大家列出来吧:
int getCount():返回当前被迭代元素的总个数
int getIndex():返回当前迭代的所以,可以查看那个元素在集合排列中的位置
boolean isEven():返回当前被迭代的是不是偶数
boolean isFirst():返回当前被迭代的是不是第一个元素
boolean isLast():返回当前被迭代的是不是最后一个元素
boolean isOdd():返回当前被迭代的是不是奇数
三、 append标签,将多个集合对象进行拼接,组成一个新的集合。通过拼接从而允许通过一个迭代标签完成多个集合的迭代。
<%@page pageEncoding="GBK" contentType="text/html; charset=GBK" %> <%@ taglib prefix="s" uri="/struts-tags" %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GBK"/> <title></title> </head> <body> <s:append var="newList"> <!-- 下面的两个集合这样就算是拼接的过程 --> <s:param value="{'遮天---辰东','宙魔---西照','盘龙---番茄','吞噬星空---番茄','神墓---辰东'}"/> <s:param value="{'天龙八部','魔兽世界','DNF','魔域','hycollege'}"/> </s:append> <table border="1" width="300"> <!-- 使用上面说的迭代器进行集合数据的迭代显示 --> <s:iterator value="#newList" status="st" id="show"> <tr> <td><s:property value="#st.count"/></td> <td><s:property value="show"/></td> </tr> </s:iterator> </table> </body> </html>
显示结果:
四、generator标签,可以将指定字符串按指定的分隔符分隔成多个字符串,临时生成的多个子串可以使用iterator标签迭代输出。
其实就是通过这标签生成一个新的集合,我个人的理解。
<%@page pageEncoding="GBK" contentType="text/html; charset=GBK" %> <%@ taglib prefix="s" uri="/struts-tags" %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GBK"/> <title></title> </head> <body> <table border="1" width="300"> <!-- separator=","指定分隔符 --> <s:generator separator="," val="'遮天---辰东,宙魔---西照,盘龙---番茄,吞噬星空---番茄,神墓---辰东'"> <!-- 这里没有指定是那个集合,所以直接迭代ValueStack顶端的集合 --> <s:iterator status="st"> <tr><s:property/></tr> </s:iterator> </s:generator> </table> </body> </html>
显示效果图:
如果使用generator标签中使用了count和var属性,其中count表示可以包含的个数,如果是二那就是只能输出两个元素,var等同于我们要迭代的对象集合
<%@page pageEncoding="GBK" contentType="text/html; charset=GBK" %> <%@ taglib prefix="s" uri="/struts-tags" %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GBK"/> <title></title> </head> <body> <!-- separator=","指定分隔符 --> <s:generator separator="," val="'遮天---辰东,宙魔---西照, 盘龙---番茄,吞噬星空---番茄,神墓---辰东'" var="show" count="3"/> <table border="1" width="300"> <s:iterator value="#show"> <tr><s:property/></tr> </s:iterator> </table> </body> </html>
显示效果:
五、merge标签,这个标签的使用和上面的append是差不多的,区别在于他们对两个集合的排列不一样。
append:
比如:有两个集合进行拼接,两个集合都有三个元素
(1)第一个集合中的第一个元素
(2)第一个集合中的第二个元素
(3)第一个集合中的第三个元素
(4)第二个集合中的第一个元素
(5)第二个集合中的第二个元素
(6)第二个集合中的第三个元素
merge:
(1)第一个集合中的第一个元素
(2)第二个集合中的第一个元素
(3)第一个集合中的第二个元素
(4)第二个集合中的第二个元素
(5)第一个集合中的第三个元素
(6)第二个集合中的第三个元素
六、subset标签,用于取得集合的子集,这个标签的底层通过org.apache.struts2.util.Subset IteratorFilter类提供实现。
<%@page pageEncoding="GBK" contentType="text/html; charset=GBK" %> <%@ taglib prefix="s" uri="/struts-tags" %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GBK"/> <title></title> </head> <body> <table border="1" width="300"> <!-- 使用subset标签截取目标集合四个元素,从第二个开始截取 --> <s:subset source="{ '遮天---辰东','宙魔---西照','盘龙---番茄','吞噬星空---番茄','神墓---辰东' }" start="1" count="4"> <!-- 这里没有指定是那个集合,所以直接迭代ValueStack顶端的集合 --> <s:iterator status="st"> <tr> <td><s:property/></td> </tr> </s:iterator> </s:subset> </table> </body> </html>
效果图:
如果要按照自己的条件进行截取,那么在struts2中我们的程序员可以自己定义自己的截取标准,前提示要先实现一个Decider类,这个类要实现SubsetIteratorFilter.Decider接口,必须实现这个接口中的boolean decide(Object element)方法,如果方法返回真,则表明这个元素师符合我们的截取条件的我们就可以选取到。下面看例子吧。
Java类:
import org.apache.struts2.util.SubsetIteratorFilter.Decider; public class MyDecider implements Decider { @Override public boolean decide(Object element) throws Exception { // TODO Auto-generated method stub String str=(String)element; return str.indexOf("---")>0; } }
我在刚才测试这个例子的有发现一个问题还是给大家提出来吧:刚才我在导入Bean的时候把<s:bean var="mydecider" name="text.decider.Decider.MyDecider"/>和<%@ taglib prefix="s" uri="/struts-tags" %>的位置对换老是出问题,具体情况我现在还没有去分析过希望你们知道了告诉我下。谢谢
<%@page pageEncoding="GBK" contentType="text/html; charset=GBK" %> <%@ taglib prefix="s" uri="/struts-tags" %> <!-- 这里导入我们刚才定义的那个类,实例对象是mydecider这个名字 --> <s:bean var="mydecider" name="text.decider.Decider.MyDecider"/> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GBK"/> <title></title> </head> <body> <!-- 使用我们自定义的条件进行数据的截取,只有符合含有"---"就可以看到--> <s:subset source="{ '遮天---辰东','宙魔---西照','盘龙---番茄','吞噬星空---番茄','神墓---辰东' }" decider="#mydecider" var="newList"/> <table border="1" width="300"> <s:iterator status="st" value="#attr.newList"> <tr> <td><s:property/></td> </tr> </s:iterator> </table> </body> </html>
显示效果:
package action; 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(); } }
上面解释。如果两个数值比较的差是大于0那么第一个元素比第二个元素大,等于0相等,小于0,后面的大(这里的大是指在集合中的每个元素的字符串长度大小)
<%@page pageEncoding="GBK" contentType="text/html; charset=GBK" %> <%@ taglib prefix="s" uri="/struts-tags" %> <!-- 这里导入我们刚才定义的那个类,实例对象是mydecider这个名字 --> <s:bean var="mycomparator" name="action.MyComparator"/> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GBK"/> <title></title> </head> <body> <s:sort source="{'遮天---辰东','宙魔---西照','盘龙---番茄','吞噬星空---番茄','神墓---辰东'}" comparator="#mycomparator" var="newList"/> <table border="1" width="300"> <s:iterator status="st" value="#attr.newList"> <tr><td><s:property/></td></tr> </s:iterator></table> </body></html>
效果显示: