Struts2学习之标签库

标签分类

Struts2把所有标签都定义在一个s标签库中,虽然Struts2把所有的标签都定义在URI为 /struts-tags空间下,但我们依然可以对Struts2标签进行简单的分类。从大的范围来说,Struts2可以将标签按下图所示,分为三大类:

Struts2学习之标签库

我们接下来的文章将按照这个分类进行总结

使用标签

说到使用标签,在我的这篇《 JSP自定义标签学习笔记 》文章中进行了非常详细的总结。

控制标签

这篇文章先对Struts2标签中的非用户界面标签库进行总结。下面就先来说说控制标签。

控制标签可以完成流程控制,如分支、循环等,也可以完成对集合的合并、排序等操作。主要的控制有如下几个:

  • if...elseif... 标签
    由于 if...elseif... 标签后都可以指定一个boolean表达式,所以 if...elseif... 标签可接受一个test属性,该属性确定执行判断的boolean表达式。具体用法如下:
    <s:if test="100 in {100,200,300}">
       包含
    </s:if>
    <s:else>
       不包含
    </s:else>
  • iterator 标签
    iterator 标签主要用于对集合(List、Set、数组和Map)进行迭代。使用 iterator 标签对集合进行迭代输出时,可以指定以下三个属性:
    属性名 描述 是否可选
    value 用于指定被迭代的集合;如果没有指定value属性,则使用ValueStack栈顶的集合 可选
    id 用于指定集合里元素的ID 可选
    status 用于指定迭代时的IteratorStatus实例,通过该实例即可判断当前迭代元素的属性,例如是否为最后一个,以及当前迭代元素的索引 可选
    <!--List-->
    <s:set name="varList" value="{'www.jellythink.com', 'www.google.com', 'www.facebook.com'}"/>
    <s:iterator value="#varList" id="website" status="st">
       当前已经输出了<s:property value="#st.getCount()"/>个<br/>
       <s:property value="website"/><br/>
    </s:iterator>
    
    <!--Map-->
    <s:set name="varMap" value="#{'谷歌':'www.jellythink.com', '脸书':'www.facebook.com', '果冻想':'www.jellythink.com'}" />
    <s:iterator value="#varMap" id="website" status="st">
       第<s:property value="#st.getCount()"/>组
     <s:property value="key"/>=<s:property value="value"/><br/>
    </s:iterator>

    <s:iterator.../> 标签指定status属性,即每次迭代时都会有一个IteratorStatus实例,该实例包含以下几个方法:

    1. int getCount() :返回当前迭代了几个元素
    2. int getIndex() :返回当前迭代元素的索引
    3. boolean isEven() :返回当前迭代元素的索引是否是偶数
    4. boolean isOdd() :返回当前迭代元素的索引是否是奇数
    5. boolean isFirst() :返回当前迭代元素是否是第一个元素
    6. boolean isLast() :返回当前迭代元素是否是最后一个元素
  • append 标签
    append 标签用于将多个集合对象拼接起来,组成一个新的集合。通过这种拼接,从而允许通过一个 <s:iterator.../> 标签就可以完成对多个集合的迭代。
    使用 append 标签时需要指定一个var属性,该属性确定拼接生成的新集合的名字,该新集合被放入Stack Context中。
    <s:set name="varList" value="{'www.jellythink.com', 'www.google.com', 'www.facebook.com'}"/>
    <s:set name="varList2" value="{'www.xiaomi.com', 'www.qq.com'}"/>
    <s:append var="newCollection">
        <s:param value="#varList" />
        <s:param value="#varList2"/>
    </s:append>
  • generator 标签
    generator 标签可以将指定字符串按指定分隔符分隔成多个子串,临时生成的多个子串可以使用iterator标签来迭代输出。在该标签的标签体内,整个临时生成的集合将位于ValueStack的顶端,但一旦该标签结束,该集合将被移出ValueStack。使用 generator 标签时可以指定如下几个属性:
    属性名 描述 是否可选
    count 指定生成集合中元素的总数 可选
    separator 指定用于解析字符串的分隔符 必填
    val 指定被解析的字符串 必填
    converter 该属性指定一个转换器,该转换器负责将集合中的每个字符串转换成对象,通过该转换器可以将一个字符串解析成对象的集合。该属性值必须是一个 org.apache.Struts2.util.IteratorGenerator.Converter 对象 可选
    var 如果指定了该属性,则将生成的Iterator对象放入Stack Context中 可选
    <s:generator val="'www.google.com,www.jellythink.com,www.baidu.com'" separator=",">
        <s:iterator id="website">
            <s:property value="website" /><br/>
        </s:iterator>
    </s:generator>
  • merge 标签
    merge 标签和 append 标签看起来非常类似,也是用于将多个集合拼接成一个集合,但它采用的拼接方式与append的拼接方式有所不同,比如现在有三个集合,每个集合有三个元素,分别使用append和merge方式进行拼接,产生的新集合将有所区别。

    使用append方式拼接,则新集合的元素顺序为:

    1. 第一个集合中的第一个元素
    2. 第一个集合中的第二个元素
    3. 第一个集合中的第三个元素
    4. 第二个集合中的第一个元素
    5. 第二个集合中的第二个元素
    6. 第二个集合中的第三个元素
    7. 第三个集合中的第一个元素
    8. 第三个集合中的第二个元素
    9. 第三个集合中的第三个元素

    使用merge方式拼接,则新集合的元素顺序为:

    1. 第一个集合中的第一个元素
    2. 第二个集合中的第一个元素
    3. 第三个集合中的第一个元素
    4. 第一个集合中的第二个元素
    5. 第二个集合中的第二个元素
    6. 第三个集合中的第二个元素
    7. 第一个集合中的第三个元素
    8. 第二个集合中的第三个元素
    9. 第三个集合中的第三个元素

    从上面可以看出来,采用append和merge方式合并集合时,新集合中集合元素完全相同,只是新集合中集合元素的顺序有所不同。

  • subset 标签

    用于取得集合的子集,具体使用请参见相关文档。

  • sort 标签

    sort 标签用于对指定的集合元素进行排序,进行排序时,必须提供自定义的排序规则,即实现自己的Comparator,自定义的 Comparator 需要实现 java.util.Comparator 接口。使用 sort 标签时可指定如下几个属性:

    属性名 描述 是否可选
    comparator 指定进行排序的Comparator 必填
    source 指定被排序的集合;如果不指定该属性,则对ValueStack栈顶的集合进行排序 可选
    var 如果指定了该属性,则将生成的Iterator对象设置成page范围的属性,不放入Stack Context中 可选

数据标签

数据标签主要结合OGNL表达式进行数据访问,比如显示一个Action里的属性值,或者生成国际化输出等。数据标签主要包含如下几个:

  • action 标签
    使用 action 标签可以允许在JSP页面中直接调用Action。在使用 action 标签时,可以指定如下几个属性:
    属性名 描述 是否可选
    var 一旦定义了该属性,该Action将被放入ValueStack中 可选
    name 该属性指定该标签调用哪个Action 必填
    namespace 该属性指定标签调用的Action所在的namespace 可选
    executeResult 该属性指定是否要将Action的处理结果页面包含到本页面,默认为false 可选
    ignoreContextParams 指定该页面中的请求参数是否需要传入调用的Action,默认为false,即将本页面的请求参数传入被调用的Action 可选
  • bean 标签
    bean 标签用于创建一个JavaBean实例。创建JavaBean实例时,可以在该标签体内使用 param 标签为该JavaBean实例传入属性。使用 bean 标签时可以指定以下属性:
    属性名 描述 是否可选
    name 指定要实例化的JavaBean的实现类 必填
    var 如果指定了该属性,则该JavaBean实例会被放入Stack Context中,并放入requestScope中 可选

    具体的代码示例请参见 push 标签中的代码。

  • date 标签

    date 标签用于格式化输出一个日期,除此之外, date 标签还可以计算指定日期和当前时刻之间的时差。使用 date 标签时,可以指定以下几个属性:

    属性名 描述 是否可选
    format 根据该属性指定的格式来格式化日期 可选
    nice 用于指定是否输出指定日期和当前时刻之间的时差,默认为false,即不输出时差 可选
    name 指定要格式化的日期值 必填
    var 格式化后的字符串将被放入Stack Context中 可选
  • debug 标签
    debug 标签主要用于调试,它在页面上生成一个超链接,通过该链接可以查看到ValueStack和Stack Context中所有的值信息。
  • include 标签

    include 标签用于将一个JSP页面,或者一个Servlet包含到本页面中,使用时需要指定以下属性:

    属性名 描述 是否可选
    value 该属性指定需要被包含的JSP页面,或者Servlet 必填

    例如下面这段代码包含 regist.jsp :

    <s:include value="regist.jsp">
        <s:param name="name" value="'jelly'" />
        <s:param name="password" value="1234567" />
    </s:include>

    regist.jsp 的代码如下:

    <%=request.getParameter("name") %>
    <%=request.getParameter("password") %>
  • param 标签
    param 标签主要用于为其它标签提供参数,具体请参见下面的 push 标签的示例代码。
  • push 标签

    push 标签用于将某个值放到ValueStack的栈顶。就一个属性值:

    属性名 描述 是否可选
    value 该属性指定需要放到ValueStack栈顶的值 必填
    <s:bean name="com.jellythink.practise.LoginAction" var="p">
        <s:param name="userName" value="jelly" />
        <s:param name="password" value="123456" />
    </s:bean>
    
    <s:push value="#p">
        ValueStack栈顶对象的username属性:<s:property value="name" />
        ValueStack栈顶对象的password属性:<s:property value="password" />
    </s:push>

    只有在push标签内时,被push标签放入ValueStack中的对象才存在;一旦离开了push标签,则刚刚放入的对象将立刻被移出ValueStack。

  • set 标签
    set 标签用于将某个值放入指定范围内。在《 Struts2学习之OGNL表达式 》这篇文章中也有详细的介绍。
  • url 标签

    url 标签用于生成一个URL地址,可以通过 url 标签指定param子元素,从而向指定URL发送请求参数。

  • property 标签

    property 标签输出value属性指定的值,如果没有指定value属性,则默认输出ValueStack栈顶的值。该标签有以下几个属性:

    属性名 描述 是否可选
    default 如果需要输出的属性值为null,则显示default属性指定的值 可选
    escape 指定是否escape HTML代码,默认为true 可选
    value 指定需要输出的属性值,如果没有指定该属性,则默认输出ValueStack栈顶的值 可选

总结

这篇文章对Struts2框架中的标签进行了详细的分类,并非用户界面标签中的控制标签和数据标签进行了详细的分析和总结。对于这种扫盲性质的文章,不求大家对每个标签都能记住,但是至少要做到眼熟,又或能够在实际场景下知道使用某个标签可以提高开发效率,这就足够了,不是么?

年后上班,真的好痛苦,心收不回来。

果冻想,认真玩技术的地方。

2016年2月29日 于呼和浩特。

原文 

https://www.jellythink.com/archives/285

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » Struts2学习之标签库

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址