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>
时间: 2024-11-09 08:31:27

struts2学习笔记之十二(控制标签)的相关文章

【web开发学习笔记】Struts-Tags学习笔记1 - 通用标签和控制标签

通用标签和控制标签 第一部分:代码 //前端 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030" /> <title>Insert title here</title> </head> <body> 访问属性 <a href="<%=contextP

SaltStack 学习笔记 - 第十二篇: SaltStack Web 界面

SaltStack 有自身的用python开发的web界面halite,好处是基于python,可以跟salt的api无缝配合,确定就比较明显,需要个性化对web界面进行定制的会比较麻烦,如果喜欢体验该界面的可以参考下面的文章  http://rfyiamcool.blog.51cto.com/1030776/1275443/ 我是运用另一个python+php来进行web开发,具体需要的工具有在我的另一篇文章里面介绍过,这里再重新进行整个开发介绍 首先介绍php 跟python通信的工具 pp

【Unity 3D】学习笔记四十二:粒子特效

粒子特效 粒子特效的原理是将若干粒子无规则的组合在一起,来模拟火焰,爆炸,水滴,雾气等效果.要使用粒子特效首先要创建,在hierarchy视图中点击create--particle system即可 粒子发射器 粒子发射器是用于设定粒子的发射属性,比如说粒子的大小,数量和速度等.在创建完粒子对象后,在右侧inspector视图中便可以看到所有的粒子属性: emit:是否是使用粒子发射器. min size:粒子最小尺寸. max size:粒子最大尺寸. min energy:粒子的最小生命周期

马哥学习笔记三十二——计算机及操作系统原理

缓存方式: 直接映射 N路关联 缓存策略: write through:通写 write back:回写 进程类别: 交互式进程(IO密集型) 批处理进程(CPU密集型) 实时进程(Real-time) CPU: 时间片长,优先级低IO:时间片短,优先级高 Linux优先级:priority 实时优先级: 1-99,数字越小,优先级越低 静态优先级:100-139,数据越小,优先级越高 实时优先级比静态优先级高 nice值:调整静态优先级   -20,19:100,139   0:120 ps

【Unity 3D】学习笔记三十二:游戏元素——游戏光源

游戏光源 在3D游戏中,光源是一个非常具有特色的游戏组件.用来提升游戏画面质感的.如果没有加入光源,游戏场景可能就会显得很昏暗.在unity中提供了三种不同的光源类型:点光源,聚光灯,平行光. 点光源 顾名思义,点光源是从一个点向周围散发出光的光源,就像电灯一样.创建点光源在hierarchy视图中点击create--point light: 创建完以后,点击点光源对象,在右侧inspector视图中可以看到点光源的所有信息: type:光源的类型.有point(点光源),directional

《Javascript权威指南》学习笔记之十二:数组、多维数组和符合数组(哈希映射)

Array(数组)是JavaScript中较为复杂的数据类型,同Java.C#.VB等程序语言的数组相比,Javascript数组中的元素不必为相同的数据类型,可以在数组每个元素上混合使用数字.日期.字符串.Object,甚至添加一个嵌套数组. 一.创建数组 1.var arr1 = new Array(); /var  arr2 = new Array(length); /var arr3 = new Array(element1,element2...); var arr4 = [eleme

汇编入门学习笔记 (十二)—— int指令、port

疯狂的暑假学习之  汇编入门学习笔记 (十二)--  int指令.port 參考: <汇编语言> 王爽 第13.14章 一.int指令 1. int指令引发的中断 int n指令,相当于引发一个n号中断. 运行过程相当于: (1)取中断类型吗n. (2)标志寄存器入栈:设置IF=0,TF=0. (3)CS.IP入栈 (4)(IP)=(n*4),(CS)=(n*4+2) 样例1:编写.安装中断7ch.实现求一个word型数据的平方,用ax存放这个数据. assume cs:code code s

Android学习笔记(十二)——使用意图传递数据的几种方式

使用意图传递数据的几种方式 点此获取完整代码 我们除了要从活动返回数据,也常常要传递数据给活动.对此我们可以使用Intent对象将这些数据传递给目标活动. 1.创建一个名为PassingData的项目,在activity_main.xml文件中添加一个Button: <Button android:id="@+id/btn_SecondActivity" android:layout_width="fill_parent" android:layout_hei

汇编入门学习笔记 (十二)—— int指令、端口

疯狂的暑假学习之  汇编入门学习笔记 (十二)--  int指令.端口 参考: <汇编语言> 王爽 第13.14章 一.int指令 1. int指令引发的中断 int n指令,相当于引发一个n号中断. 执行过程相当于: (1)取中断类型吗n. (2)标志寄存器入栈:设置IF=0,TF=0. (3)CS,IP入栈 (4)(IP)=(n*4),(CS)=(n*4+2) 例子1:编写.安装中断7ch,实现求一个word型数据的平方,用ax存放这个数据. assume cs:code code seg