Struts2的标签库(三)——控制标签
Struts2的标签库(三)
——控制标签
1.if/elseif/else标签
用于分支控制,取代JSP中的if语句,根据一个boolean(test属性的值)值判断是否进行下一步运算或者输出等。
<s:if>可以单独使用,而<s:elseif>和<s:else>必须和<s:if>结合使用,在一个循环中必须只有一个<s:if>,没有或有几个<s:elseif>,最多有一个<s:else>。
使用例子:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!-- 导入Struts2的标签库 --> <%@ taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <!-- 使用if/elseif/else标签 --> <!-- 在Stack Context中定义一个age属性 ,其值为24--> <s:set name="age" value="24"/> <!-- 如果age的属性小于18,输出少年 --> <s:if test="#age<=18"> 少年 </s:if> <!-- 如果age>18并且age<30,输出青年 --> <s:elseif test="#age>18&&#age<=30"> 青年 </s:elseif> <!-- 如果age>30且age<50,输出中年 --> <s:elseif test="#age>30&&#age<=50"> 中年 </s:elseif> <!-- 其他,输出老年 --> <s:else> 老年 </s:else> </body> </html>
2.iterator标签
用于对集合的迭代,可以是List、Map或者Set集合,也可以是一个数组。
在<s:iterator>标签中可以指定三个属性:
value:可选属性,指定一个集合,如果没有指定这个属性则使用ValueStack栈顶的集合;
id:可选属性,指定集合中元素的ID;
status:可选属性,指定迭代时的IteratorStatus实例,通过该实例可以判断当前迭代元素的属性。如元素的索引等。
在IteratorStatus实例中有如下几个常用的方法:
(1)int getCount():返回当前已迭代元素的数量;
(2)int getIndex():返回当前迭代元素的索引;
(3)boolean isEven():判断当前被迭代的元素索引是否为偶数;
(4)boolean isFirst():判断当前被迭代的元素是否是第一个元素;
(5)boolean isLast():判断当前被迭代的元素是否是最后一个元素;
(6)boolean isOdd():判断当前被迭代的元素索引是否是一个奇数。
示例:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <!-- 使用iterator标签迭代输出List集合 --> <s:iterator value="{'a','b','c','d'}" id="world" > <s:property value="world"/>, </s:iterator> <!-- 使用iterator标签迭代输出List集合,并指定status属性 --> <!-- 当值大于10并且索引数为偶数时,输出此元素 --> <s:iterator value="{1,5,12,4,18,60,19,2}" id="num" status="st" > <s:if test="#st.even&&#num>10"> <s:property value="num"/> </s:if> </s:iterator> </body> </html>
3.append标签
用于把多个集合拼接成一个新的集合,这个新的集合就可以通过一个iterator来迭代了。
在此标签中的属性如下:
var:指定新产生的集合的名字,并把该集合放入Stack Context的顶端,如果不指定此属性则不放入Stack Context中。
在此标签中有子标签<s:param>子标签中的内容就是所要拼接的集合,在一个append标签下允许出现多个<s:param>标签,可以是相同类型的集合拼接,也可以是不同类型的集合拼接。
示例如下:注意当两个不同类型的集合相互拼接时,不同的情况
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <!-- 两个List集合的拼接 --> <s:append var="num"> <s:param value="{1,2,3,4,5}" /> <s:param value="{4,5,6,7,8}" /> </s:append> <!-- 遍历输出此行生成的集合 --> <s:iterator value="#num" id="test1" status="st_1" > <s:if test="#st_1.even"> <s:property value="test1"/> </s:if> </s:iterator> <hr/> <!-- 两个Map集合的拼接 --> <s:append var="student"> <s:param value="#{1:'张三',2:'李四',3:'王五'}" /> <s:param value="#{4:'路人甲',5:'路人乙',6:'路人丙'}" /> </s:append> <s:iterator value="#student" > <s:property value="key"/>:<s:property value="value"/><br/> </s:iterator> <!-- 一个List和一个Map的拼接(一) --> <s:append var="teacher"> <!-- List 这个List实际上是以创建Map的方法创建的,它的key为其中的元素,value为空--> <s:param value="#{1,2,3}" /> <!-- Map --> <s:param value="#{1:'路人甲',2:'路人乙',3:'路人丙'}" /> </s:append> <s:iterator value="#teacher" id="test2" > key=<s:property value="key"/>,value=<s:property value="value"/> </s:iterator> <hr/> <!-- 一个List和一个Map的拼接(二) --> <s:append var="teacher_1"> <!-- List --> <s:param value="{1,2,3}" /> <!-- Map --> <s:param value="#{1:'路人甲',2:'路人乙',3:'路人丙'}" /> </s:append> <s:iterator value="#teacher_1" id="test3" > key=<s:property value="key"/>,value=<s:property value="value"/> </s:iterator> <hr/> <!-- 一个List和一个Map的拼接(三) --> <s:append var="teacher_2"> <!-- List --> <s:param value="{1,2,3}" /> <!-- Map --> <s:param value="#{1:'路人甲',2:'路人乙',3:'路人丙'}" /> </s:append> <s:iterator value="#teacher_2" id="test3" > <s:property value="#test3"/> </s:iterator> </body> </html>
4.generator标签
类似于String中的split()方法,将指定字符串按照指定字符分割成几个子串,这些子串将生成一个集合被临时放在ValueStack顶端,当这个标签结束后,该集合将会被移出ValueStack栈。
generator标签中有如下几个属性:
count:可选属性,指定生成集合中元素的个数。
separator:必须属性,指定用于解析字符串的分隔符。
val:必须属性,指定被解析的字符串。
convertor:可选属性,指定一个转换器,将集合中的每个字符串转换成对象,可以将一个字符串解析成对象集合。
var:可选属性,指定该属性后,生成的Iterator对象将被放在Stack Context顶端。
示例:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <!-- generator标签的使用示例 --> <s:generator separator="," val="'张三,李四,王五'" count="2" var="names" > <s:iterator value="#names" > <s:property/> </s:iterator> </s:generator> </body> </html>
5.merge标签
此标签也是用于集合之间的拼接,但拼接方式与append标签的拼接方式有所不同,我们通过例子来比较使用merge标签和使用append标签拼接集合时的不同之处。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> =====使用append标签拼接集合===== <br/> <s:append var="names_append"> <s:param value="{'A','B','C','D','E'}"/> <s:param value="{'a','b','c','d','e'}"/> </s:append> <s:iterator value="#names_append" id="test_append" > <s:property value="test_append"/>, </s:iterator> <hr/> =====使用merge标签拼接的集合===== <br/> <s:merge var="names_merge"> <s:param value="{'A','B','C','D','E'}"/> <s:param value="{'a','b','c','d','e'}"/> </s:merge> <s:iterator value="#names_merge" id="test_merge" > <s:property value="test_merge"/>, </s:iterator> </body> </html>
使用append标签进行拼接后的结果为:A,B,C,D,E,a,b,c,d,e,
使用merge标签进行拼接后的结果为:A,a,B,b,C,c,D,d,E,e,
6.subset标签
subset标签用于取得集合的子集,该标签有如下几个属性:
count:可选属性,指定子集元素的个数。
source:可选属性,指定那个集合作为被取子集合的集合,默认取ValueStack栈顶的集合。
start:可选属性,指定从第几个元素开始截取,默认为第一个元素,即start值为0。
decider:可选属性,由开发者子集决定是否选中该元素,该属性必须指定一个Decider对象。
var:可选属性,该属性将生成的Iterator对象设置成page属性范围。
在subset标签内,所产生的子集合放在ValueStack的栈顶,该标签结束后,该子集合从ValueStack移除。
(1)使用标准的截取规则(不指定decider属性):
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>subset</title> </head> <body> <!-- 使用subset标签,不指定decider属性 --> 截取源集合的5个元素,从第二个元素开始截取即start属性为1<hr/> <s:subset source="{1,2,3,4,5,6,7,8,9,0}" start="1" count="5" > <s:iterator> <s:property/> </s:iterator> </s:subset><hr/> </body> </html>
(2)实现自己的截取规则(指定decider属性):
1)写一个实现了Decider接口的类,当该类中的decide方法返回值为true时,此元素被放入子集合中
import org.apache.struts2.util.SubsetIteratorFilter.Decider; public class DeciderTest implements Decider{ @Override public boolean decide(Object arg0) throws Exception { String a = (String)arg0; if(a.equals("A")){ return true; }else{ return false; } } }
2)在subset标签中使用decider属性
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>subset - decider</title> </head> <body> <!-- 定义一个Decider Bean --> <s:bean name="myDecider.DeciderTest" var="deciderTest"/> <s:subset source="{'A','B'}" decider="#deciderTest" > <s:iterator> <s:property/> </s:iterator> </s:subset> </body> </html>
7.sort标签
sort标签用于对指定的集合进行排序,进行排序时必须要为其指定规则,,指定规则需要实现Comparator接口。
sort标签有如下几个属性:
comparator:必须属性,指定排序的Comparator实例。
source:可选属性,指定被排序的集合,默认是ValueStack栈顶的集合。
var:可选属性,设置该属性后,将生成的Iterator设置为page范围属性,不放入Stack Context中。
在sort标签内时,其生成的子集合房子ValueStack栈顶,该标签结束后,该标签生成的子集合将会被移出ValueStack。
示例:
(1)必须要有一个类,这个类必须实现Comparator接口。
import java.util.Comparator; public class ComparatorTest implements Comparator{ @Override public int compare(Object o1, Object o2) { // TODO Auto-generated method stub //根据字符串的长度来决定大小 int count = o1.toString().length() - o2.toString().length(); return count; } }
(2)使用sort标签。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>comparator test</title> </head> <body> <!-- 创建一个Comparator实例 --> <s:bean name="myComparator.ComparatorTest" var="mycomparator"/> <s:sort comparator="#mycomparator" source="{'123','1234','','12'}" > <s:iterator> <s:property/> </s:iterator> </s:sort> </body> </html>
Struts2的标签库(三)——控制标签的更多相关文章
- jstl--->Core 核心标签库->流程控制
jstl--->Core 核心标签库->流程控制 -->if.choose.when.otherwise <c:if>条件判断 语法1:没有本体内容 <c:if ...
- JSTL标签库之核心标签
一.JSTL标签库介绍 JSTL标签库的使用是为弥补html标签的不足,规范自定义标签的使用而诞生的.使用JSLT标签的目的就是不希望在jsp页面中出现java逻辑代码 二.JSTL标签库的分类 核心 ...
- javaweb学习总结(二十八)——JSTL标签库之核心标签
一.JSTL标签库介绍 JSTL标签库的使用是为弥补html标签的不足,规范自定义标签的使用而诞生的.使用JSLT标签的目的就是不希望在jsp页面中出现java逻辑代码 二.JSTL标签库的分类 核心 ...
- javaWeb学习总结(9)- JSTL标签库之核心标签
一.JSTL标签库介绍 JSTL标签库的使用是为弥补html标签的不足,规范自定义标签的使用而诞生的.使用JSLT标签的目的就是不希望在jsp页面中出现java逻辑代码 二.JSTL标签库的分类 核心 ...
- 学会怎样使用Jsp 内置标签、jstl标签库及自定义标签
学习jsp不得不学习jsp标签,一般来说,对于一个jsp开发者,可以理解为jsp页面中出现的java代码越少,对jsp的掌握就越好,而替换掉java代码的重要方式就是使用jsp标签. jsp标签的分 ...
- JSTL、JSTL核心标签库——流程处理标签
JSTL环境 JSTL是另一个标准规范,并非在JSP的规范中,所以必须另外下载JSTL实现. 要使用JSTL标签库,必须在JSP网页上使用taglib指示元素定义前置名称与uri参考.例如,引入JST ...
- jsp的标签库和自定义标签
1.jstl标签库 JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能. JSTL支持通用的.结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签. ...
- ThinkPHP内置标签库原理(Cx标签库)
任何一个模板引擎的功能都不可能是为你量身定制的,具有一个良好的可扩展 机制也是模板引擎的另外一个考量,Smarty采用的是插件方法来实现扩展,ThinkTemplate由于采用了标签库技术,比Smar ...
- JavaWeb学习记录(十九)——jstl自定义标签库之传统标签
一.传统标签 (1)JSP引擎将遇到自定义标签时,首先创建标签处理器类的实例对象,然后按照JSP规范定义的通信规则依次调用它的方法. public void setPageContext(PageCo ...
- JSTL标签库中fmt标签,日期,数字的格式化
首先介绍日期的格式化:(不要嫌多哦) JSTL格式化日期(本地化) 类似于数字和货币格式化,本地化环境还会影响生成日期和时间的方式. <%@ page pageEncoding="UT ...
随机推荐
- 夺命雷公狗---微信开发55----微信js-sdk接口开发(2)接口功能介绍之签名算法
我们JS-SDK里面其实有不少的接口 startRecord---录音 stopRecord---停止录音 playVoice---播放 pauseVoice---暂停播放 uploadImage-- ...
- Perl中的匹配(六)
在Perl中,匹配的定界符如果是双斜线//,可以直接使用双斜线完成匹配操作. 如果特定条件下需要改变定界符,如改为{},[]等.需要加入m,m{},m[]等. m%^http://% 默认的模式匹配对 ...
- url传参
1.两种url形式传参index.php/action/function/id/2 这种模式下:$_GET[action]就是function,$_GET[id]就是2
- [转]Delphi多线程编程入门(二)——通过调用API实现多线程
以下是一篇很值得看的关于Delphi多线程编程的文章,内容很全面,建议收藏. 一.入门 ㈠. function CreateThread( lpThreadAttributes: Pointer ...
- Oracle主库归档丢失,备库日志有gap,在不重建备库的情况下,恢复备库
本文主要描述Oracle备库日志与主库日志之间有gap,切主库这部分gap的归档日志已经删除或丢失,如何在不重建备库的情况下,恢复备库. 欢迎转载,请注明作者.出处. 作者:张正 blog:http: ...
- 处理字符串中的换行,将textarea中的带有换行的字符串变为逗号分隔的写法
_setMultipleInputValues: function (param) { //Maybe need to modify here for the new parameter //add ...
- Windows下打包Python的exe可执行文件
参考:http://www.cnblogs.com/Lands-ljk/p/5447723.html
- C#中的托管和非托管
注意!先看左上角声明!我不想误人子弟!但我不怕思考.没有思考就没有错误,互相学习,共同进步! 百度中的“专业人士”回答中出现了这句话(不知道是不是专业人士啊 百度说的)“1.是指托管代码,托管代码(M ...
- HDU 3487:Play with Chain(Splay)
http://acm.hdu.edu.cn/showproblem.php?pid=3487 题意:有两种操作:1.Flip l r ,把 l 到 r 这段区间 reverse.2.Cut a b c ...
- Java transient关键字序列化时使用小记
1. transient的作用及使用方法 我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过 ...