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标签库之核心标签

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

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

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

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

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

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

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

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

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

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

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

  7. Web---JSTL(Java标准标签库)-Core核心标签库、I18N国际化、函数库

    前面为JSTL中的常用EL函数,后面的为具体演示实例! JSTL简介: JSTL(Java Standard Tag Library) –Java标准标签库. SUN公司制定的一套标准标签库的规范. ...

  8. JSP标准标签库(JSTL)--XML标签库 x

    ³在开发中XML解析的操作是非常烦琐的,幸运的是在JSTL中专门提供了用于XML解析的操作,这样用户就可以不用费力的去研究SAX或DOM等操作的使用,就可以轻松的进行XML文件的解析处理.  XML标 ...

  9. JSP标准标签库(JSTL)--核心标签库 c

    核心标签库是JSTL中最重要的部分,可以完成输出,判断,迭代等操作 功能分类: 1. 基本标签: <c:out>:输出属性内容 <c:set>:设置属性内容 <c:rem ...

  10. html标签,格式控制标签,内容容器标签,超链接标签,图片标签,表格

    打开DREAMWEAVER,新建HTML,如下图: body的属性: bgcolor 页面背景色 background  背景壁纸.图片 text  文字颜色 topmargin  上边距 leftm ...

随机推荐

  1. GPS部标监控平台的架构设计(七)-压力测试

    部标监控平台的压力测试是部标检测流程的最后一个检测环节,也是最难的,很多送检的企业平台都是卡壳在这一个环节.企业平台面临的问题如下: 1.对于压力测试的具体指标要求理解含糊,只知道是模拟一万辆车终端进 ...

  2. recovery编译问题汇总

    1.修改支持USB大容量存储 (1).首先需要查看手机lun位置 手机链接电脑,打开cmd命令行,依次输入以下命令: adb shell find /sys -name "lun" ...

  3. truncate,delete,drop的异同点

    说明:本文摘自oracle技术用户讨论组 truncate,delete,drop的异同点  注意:这里说的delete是指不带where子句的delete语句    相同点:truncate和不带w ...

  4. 关于内存泄露分析插件 MAT 的用法

    关于内存泄露分析插件 MAT 的用法,建议大家有时间看一下,下面的文章 http://www.blogjava.net/rosen/archive/2010/05/21/321575.html htt ...

  5. PHP执行系统命令

    <?phpexec("ping www.baidu.com -n 1",$output,$status);var_dump($output);var_dump($status ...

  6. Codeforces Round #381 (Div. 1) A. Alyona and mex 构造

    A. Alyona and mex 题目连接: http://codeforces.com/contest/739/problem/A Description Alyona's mother want ...

  7. android自定义view属性

    第一种 /MainActivity/res/values/attrs.xml <?xml version="1.0" encoding="utf-8"?& ...

  8. Codeforces Round #FF (Div. 1) A. DZY Loves Sequences

    题目链接: http://www.codeforces.com/contest/446/problem/A 题解: dp1[x]表示以x结尾的最大严格升序连续串,dp2[x]表示以x开头的最大严格升序 ...

  9. DzzOffice1.0 Beta2 全新安装图文教程及界面简单了解

    本文说明:本文档用于帮助您全新安装完整的 DzzOffice Beta版软件.DzzOffice 是一款开源的云存储与应用管理工具,主要用于企业管理阿里云.亚马逊等云存储等空间,把空间可视化分配给成员 ...

  10. iOS开发:记录开发中遇到的编译或运行异常以及解决方案

    1.部署到真机异常 dyld`dyld_fatal_error: ->  0x120015088 <+0>: brk    #0x3 dyld: Library not loaded ...