struts2学习笔记之十二(控制标签)

  在struts2的文件包中,有关于标签的具体使用方法,但是却需注意的是,官方文档某些地方描述是不准确,需要自己根据实际验证。
  官方文档所在位置,struts-2.3.16.1/docs/WW/docs/home.html,进入网页后选择Guide,然后就可以看到Tag Developers Guide,在这里就可以查阅tag的使用了。

java领域MVC框架

  • 主要实现控制器(StrutsPrepareAndExecuteFilter + Action )
  • 提供大量的标签库,可以简化view的开发

Struts2标签分类

  • UI标签

    用于生成HTML元素的标签

  • 非UI标签

    用于数据访问,逻辑控制等

  • Ajax标签

    所有的标签都在struts-tags里面

OGNL

Object Graph Navigation Language,对象图表达式语言
  • EL

    1、表达式语言,做数据访问语言,并不是编程语言,所以很简单
    2、提供了11个内置对象。    pageContext,pageScope,requestScope,sessionScope,applicationScope,param,paramValues,header,headerValues,cookie,initParam(获取Web应用的配置参数)

  • OGNL

    1、既然要访问数据,必须有个东西装数据,OGNL的装数据的东西(一个容器)“Stack Context(ONGL Context)”

    2、上述Stack Context中的每一个对象,都应该有一个名字。
    访问:#对象名
    例:OGNL Context中有3个对象,foo,bar,test
    #bar.abc —-访问bar对象的getAbc()方法的返回值
    #test.xyz.abc —-访问test对象的getXyz().getAbc()

    3、OGNL Context
    有一个根对象(root),访问root对象的属性时可以省略对象名
    例:OGNL Context中有3个对象,foo(root对象),bar,test
    abc.xyz.def —-访问foo.getAbc().getXyz().getDef()
    4、OGNL Context 中的内容application,session,value stack(root),request,parameters(搜索请求参数),attr(searches page,request,session,then application scope)
    例:

    <s:property value="#session.mySessionPropKey" />
    <s:property value="#session['mySessionPropKey']" />
    <s:property value="#request.myRequestPropKey">

    5、OGNL可以直接创建List对象
    例:
    {ele1,ele2,….}
    6、OGNL可以直接创建Map对象
    例:
    #{key1:value1,key2:value2,….}
    7、OGNL可以直接获取子集合
    例:
    person.cats.{? #this.age > 2}
    —–获取person所养的猫中age大于2的所有猫的集合
    person.cats.{^ #this.age > 2}
    —–获取person所养的猫中age大于2的第一个猫
    person.cats.{$ #this.age > 2}
    —–获取person所养的猫中age大于2的最后一个猫
    8、OGNL支持访问直接调用静态方法
    注意:使用这个功能需要开启常量,struts.ognl.allowStaticMethodAccess设置为true(默认为false)
    使用方式:

    • 类名@静态Field
    • 类名@静态方法(参数值)

    注意:struts2会帮助我们将对象放入相应的容器中(上述的范围)

控制标签(Control Tag)

  • if
    <s:if test=""></s:if>
  • else
    <s:else test=""></s:else>
  • elseif
    <s:elseif test=""></s:elseif>
  • append
    合并两个或两个以上的集合(与merge功能类似)
  • generator
    按照某种规则,把一个字符串分解成一个集合
  • iterator
    迭代元素
  • merge
    合并集合
  • sort
    必须指定一个比较器
  • subset
    截取一个子集合

if\elseif\else

  • 属性:test
      注意:else没有属性
  • 实例
    <s:if test="#age>60"><h3>老年人</h3></s:if>
    <s:elseif test="#age>30"><h3>中年人</h3></s:elseif>
    <s:elseif test="#age>18"><h3>青年人</h3></s:elseif>
    <s:elseif test="#age>8"><h3>少年人</h3></s:elseif>
    <s:else>儿童</s:else>

iterator

  • 属性:var,value,status,begin,end
  • 实例

1、迭代所有元素

<h2>Iterator标签 测试</h2>
    <ul>
        <s:iterator var="it" value='{"zhang","wang","tian","li"}'>
            <li>
                ${it}
                <s:property value="#it"/>
            </li>
        </s:iterator>
    </ul>
    <!-- 经过debug发现iterator变量it放在了Stack Context中 -->
    <s:debug/>

2、迭代指定部分

 获取第四,第五,第六个元素<br/>
    <ul>
        <s:iterator var="it" value='{"zhang","wang","tian","li","zhao","qian","sun","zhou"}' begin="3" end="5">
            <li>
                ${it}
                <s:property value="#it"/>
            </li>
        </s:iterator>
    </ul>

3、使用status

  • getCount()
  • getIndex()
  • isFirst()
  • isLast()
  • isOdd() —-奇数行
  • isEven()
 打印奇数元素<br/>
    <ul>
        <s:iterator var="it" value='{"zhang","wang","tian","li","zhao","qian","sun","zhou"}' status="st">
            <s:if test="#st.odd">
                <li>
                    <s:property value="#it"/>
                </li>
            </s:if>
        </s:iterator>
    </ul>

4、迭代Map

<table width="300" border="1">
        <s:iterator value="#{'java':99,'C++':90,'C':65,'Python':87,'Ruby':89}" var="entry">
            <tr>
                <td>
                    ${entry.key}
                </td>
                <td>
                    ${entry.value}
                </td>
            </tr>
        </s:iterator>
    </table>

merge和append

  • merge
    属性:var
    <s:merge var="newList"><s:param value=""/>...</s:merge>
  • append
    属性:var
    <s:append var="newList"><s:param value=""/>...</s:append>
  • 实例
    <!-- 定义两个集合list1和list2 -->
    <s:set var="list1" value='{"zhao","qian","sun","li"}'/>
    <s:set var="list2" value='{"zhou","wu","zheng","wang"}'/>
    list1:<s:property value="#list1"/><br/>
    list2:<s:property value="#list2"/><br/>
              使用append合并list1和list2之后<br/>
    <s:append var="append">
        <s:param value="#list1"/>
        <s:param value="#list2"/>
    </s:append>
    <s:iterator var="it" value="#append">
        ${it},
    </s:iterator>
    <br/>
    <h3>append只是单纯的将list2接到list1之后重新组成一个集合</h3>
    使用append合并list1和list2之后<br/>
    <s:merge var="merge">
        <s:param value="#list1"/>
        <s:param value="#list2"/>
    </s:merge>
    <s:iterator var="it" value="#merge">
        ${it},
    </s:iterator>
    <br/>
    <h3>merge从list1和list2依次取一个元素添加到新集合了,这样也就打乱了原有的顺序</h3>

generator

  • 属性:var,val,separator
    注意:是val,不是value。
    应用:读取到一个字符串之后,可以使用这个代替split方法达到分割的目的
  • 实例
    <!--注意:在val的取值中,外层是双引号,内层是一个单引号,如果缺少,输出有问题-->
    <s:generator var="newList" val="'abc:xys:sdfs:df'" separator=":"/>
    <ul>
        <s:iterator var="it" value="#newList">
            <li>
                <s:property value="#it"/>
            </li>
        </s:iterator>
    </ul>

subset

  • 属性:var,source,start,count
    注意:var被放到了page Context中,因此用Iterator访问时要使用#attr.varname
  • 实例
<s:subset var="newList" source='{"as","dasg","ew","ew"}' start="2" count="2"/>
    <ul>
        <!--使用#attr.newList访问-->
        <s:iterator var="it" value="#attr.newList">
            <li>
                <s:property value="#it"/>
            </li>
        </s:iterator>
    </ul>

sort

  • 属性:var,source,comparator
    注意:必须指定比较器comparator,所以需要和bean标签一起使用,var的存储位置是page Context,因此必须使用#attr.varName访问
  • 实例
<!-- 创建比较器对象 -->
    <s:bean var="comparator" name="org.struts2.util.MyComparator"/>
    <!-- 定义一个列表 -->
    <s:set var="list" value="{'java','c++','ruby','python','vb','c#'}" />
        排序之前:<s:property value="#list"/>
    <s:sort var="nl" source="#list" comparator="#comparator"/>
        <br/>
        排序之后:<s:property value="#attr.nl"/>
        <s:iterator var="it" value="#attr.nl">  
            <s:property value="#it"/>
        </s:iterator>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值