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的标签库(三)——控制标签的更多相关文章

  1. jstl--->Core 核心标签库->流程控制

    jstl--->Core 核心标签库->流程控制 -->if.choose.when.otherwise  <c:if>条件判断 语法1:没有本体内容  <c:if ...

  2. JSTL标签库之核心标签

    一.JSTL标签库介绍 JSTL标签库的使用是为弥补html标签的不足,规范自定义标签的使用而诞生的.使用JSLT标签的目的就是不希望在jsp页面中出现java逻辑代码 二.JSTL标签库的分类 核心 ...

  3. javaweb学习总结(二十八)——JSTL标签库之核心标签

    一.JSTL标签库介绍 JSTL标签库的使用是为弥补html标签的不足,规范自定义标签的使用而诞生的.使用JSLT标签的目的就是不希望在jsp页面中出现java逻辑代码 二.JSTL标签库的分类 核心 ...

  4. javaWeb学习总结(9)- JSTL标签库之核心标签

    一.JSTL标签库介绍 JSTL标签库的使用是为弥补html标签的不足,规范自定义标签的使用而诞生的.使用JSLT标签的目的就是不希望在jsp页面中出现java逻辑代码 二.JSTL标签库的分类 核心 ...

  5. 学会怎样使用Jsp 内置标签、jstl标签库及自定义标签

    学习jsp不得不学习jsp标签,一般来说,对于一个jsp开发者,可以理解为jsp页面中出现的java代码越少,对jsp的掌握就越好,而替换掉java代码的重要方式就是使用jsp标签.  jsp标签的分 ...

  6. JSTL、JSTL核心标签库——流程处理标签

    JSTL环境 JSTL是另一个标准规范,并非在JSP的规范中,所以必须另外下载JSTL实现. 要使用JSTL标签库,必须在JSP网页上使用taglib指示元素定义前置名称与uri参考.例如,引入JST ...

  7. jsp的标签库和自定义标签

    1.jstl标签库 JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能. JSTL支持通用的.结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签. ...

  8. ThinkPHP内置标签库原理(Cx标签库)

    任何一个模板引擎的功能都不可能是为你量身定制的,具有一个良好的可扩展 机制也是模板引擎的另外一个考量,Smarty采用的是插件方法来实现扩展,ThinkTemplate由于采用了标签库技术,比Smar ...

  9. JavaWeb学习记录(十九)——jstl自定义标签库之传统标签

    一.传统标签 (1)JSP引擎将遇到自定义标签时,首先创建标签处理器类的实例对象,然后按照JSP规范定义的通信规则依次调用它的方法. public void setPageContext(PageCo ...

  10. JSTL标签库中fmt标签,日期,数字的格式化

    首先介绍日期的格式化:(不要嫌多哦) JSTL格式化日期(本地化) 类似于数字和货币格式化,本地化环境还会影响生成日期和时间的方式. <%@ page pageEncoding="UT ...

随机推荐

  1. 夺命雷公狗---微信开发55----微信js-sdk接口开发(2)接口功能介绍之签名算法

    我们JS-SDK里面其实有不少的接口 startRecord---录音 stopRecord---停止录音 playVoice---播放 pauseVoice---暂停播放 uploadImage-- ...

  2. Perl中的匹配(六)

    在Perl中,匹配的定界符如果是双斜线//,可以直接使用双斜线完成匹配操作. 如果特定条件下需要改变定界符,如改为{},[]等.需要加入m,m{},m[]等. m%^http://% 默认的模式匹配对 ...

  3. url传参

    1.两种url形式传参index.php/action/function/id/2   这种模式下:$_GET[action]就是function,$_GET[id]就是2

  4. [转]Delphi多线程编程入门(二)——通过调用API实现多线程

    以下是一篇很值得看的关于Delphi多线程编程的文章,内容很全面,建议收藏. 一.入门 ㈠. function CreateThread(    lpThreadAttributes: Pointer ...

  5. Oracle主库归档丢失,备库日志有gap,在不重建备库的情况下,恢复备库

    本文主要描述Oracle备库日志与主库日志之间有gap,切主库这部分gap的归档日志已经删除或丢失,如何在不重建备库的情况下,恢复备库. 欢迎转载,请注明作者.出处. 作者:张正 blog:http: ...

  6. 处理字符串中的换行,将textarea中的带有换行的字符串变为逗号分隔的写法

    _setMultipleInputValues: function (param) { //Maybe need to modify here for the new parameter //add ...

  7. Windows下打包Python的exe可执行文件

    参考:http://www.cnblogs.com/Lands-ljk/p/5447723.html

  8. C#中的托管和非托管

    注意!先看左上角声明!我不想误人子弟!但我不怕思考.没有思考就没有错误,互相学习,共同进步! 百度中的“专业人士”回答中出现了这句话(不知道是不是专业人士啊 百度说的)“1.是指托管代码,托管代码(M ...

  9. 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 ...

  10. Java transient关键字序列化时使用小记

    1. transient的作用及使用方法 我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过 ...