使用Struts2的标签库(一)

使用Struts2标签

<!-- 导入Struts2标签库 -->
<%@taglib prefix="s" uri="/struts-tags"%>
<!-- 使用以s作为前缀的标签 -->
<s:abc.../>

Struts2的OGNL表达式语言

(1)OGNL表达式语法:

<!-- 返回bar.getFoo().getBlah() -->
#bar.foo.blah

(2)如果需要访问的属性属于根对象,则可以直接访问该属性,比如blah。
(3)例子:Stack Context中包括两个根实例:animal和person,这两个实例中包含“name”属性,而且animal实例还有一个“species”属性,而person实例还有一个“salary”属性,其中animal实例是栈顶元素,而person实例在其后面。

//返回animal.getSpecies()方法返回值
species
//返回person.getSalary()方法返回值
salary
//因为Struts2先找到animal实例,返回animal.getName()方法的返回值
name
//直接取得person实例的name属性
#person.name
<!-- -------------------分割线-------------------- -->
<!-- 通过索引访问Stack Context-->
//返回animal.getName()方法的返回值,因为从第一个开始找,就会先找到animal实例
[0].name
//返回person.getName()方法的返回值,因为从第二个开始找,就会先找到animal实例
[1].name
<!-- -------------------分割线-------------------- -->
//取得ValueStack中的bar属性,Context根对象是ValueStack
${bar}

(4)注意:
①OGNL的Stack Context是整个OGNL计算、求值的Context,而ValueStack只是StackContext内的“根”对象而已。
②访问Stack Context里的命名对象需要在对象名之前添加#前缀。
③当访问OGNL的Stack Context里“根”对象的属性时,可以省略对象名。
(5)查看Value Stack和Stack Context里的数据:

<s:debug/>

OGNL中的集合操作

(1)直接创建List类型集合的语法:

{e1,e2,e3 ...}

(2)直接生成Map类型集合的语法:

#{key1:value1,key2:value2,...}

(3)OGNL的两个运算符:in 和 not in。
in:判断某个元素是否在指定集合中。
not in:判断某个元素是否不在指定集合中。

<!-- 如果指定集合中包含foo元素 -->
<s:if test="'foo' in {'foo','bar'}">
包含
</s:if>
<s:else>
不包含
</s:else>
<!-- 如果指定集合中不包含foo元素 -->
<s:if test="'foo' not in {'foo','bar'}">
不包含
</s:if>
<s:else>
包含
</s:else>

(4)取得集合子集的三个操作符:
?:取出所有符合选择逻辑的元素。
^:取出符合选择逻辑的第一个元素。
$:取出符合选择逻辑的最后一个元素。
示例:
①直接在集合后紧跟.{}运算符表明用于取出该集合的子集;
②在{}内使用?表明取出所有符合选择逻辑的元素,而#this代表集合里元素。
③下面代码:取出person的所有性别为male的relatives(亲戚)集合。

person.relatives.{? #this.gender == 'male'}

访问静态成员

(1)在struts.xml添加:
默认关闭:
这里写图片描述

<!-- 设置允许OGNL允许访问静态成员 -->
<constant name="struts.ognl.allowStaticMethodAccess" value="true"/>

(2)OGNL访问静态成员:

@className@staticField
@className@staticMethod(val...)

JSP页面访问静态Field和静态方法:

访问系统环境变量: <s:property value="@java.lang.System@getenv('JAVA_HOME')"/> <br/>
圆周率的值: <s:property value="@java.lang.Math@PI"/>

Lambda(λ)表达式

例子:求斐波那契数列的第11个元素值。

<s:property value="#fib =: [#this==0 ? 0 : #this==1 ? 1 : #fib(#this-2)+#fib(#this-1)], #fib(11)"/>

控制标签

(1)9个控制标签:
if:用于控制选择输出的标签。
elseif/elseIf:与if标签结合使用,用于控制选择输出的标签。
else:与if标签结合使用,用于控制选择输出的标签。
append:用于将多个集合拼接成一个新的集合。
generator:它是一个字符串解析器,用于将一个字符串解析成一个集合。
iterator:这是一个迭代器,用于将集合迭代输出。
merge:用于将多个集合拼接成一个新的集合。(与append不同)
sort:对集合进行排序。
subset:截取集合的部分元素,形成新的子集合。

(2)if/elseif/else:
例子:

<!-- 在Stack Context中定义一个age属性,其值为29 -->
      <s:set name="age" value="29"/>
      <!-- 如果Stack Context中的age属性大于60 -->
      <s:if test="#age>60">
        老年人
      </s:if>
      <!-- 如果Stack Context中的age属性大于35 -->
      <s:elseif test="#age>35">
        中年人
      </s:elseif>
      <!-- 如果Stack Context中的age属性大于15 -->
      <s:elseif test="#age>15">
        青年人
      </s:elseif>
      <s:else>
        少年
      </s:else>

这里写图片描述
(3)iterator标签
①属性:
value:可选属性,指定被迭代的集合,如果没有指定,则使用ValueStack栈顶的集合。
id:可选属性,指定集合元素的ID。
status:指定迭代时的IteratorStatus实例。
例子:

<table border="1" width="200">
     <s:iterator value="{'java','c++',python}" id="name">
        <tr>
            <td><s:property value="#st.count"/>
            <s:property value="name"/></td>
        </tr>
     </s:iterator>
</table>

这里写图片描述
②如果为< s:iterator…/>标签指定status属性,即每次迭代时都会有一个IteratorStatus实例,该实例包含以下几个方法:
int getCount():返回当前迭代了几个元素。
int getIndex():返回当前迭代元素的索引。
boolean isEven():返回当前被迭代元素的索引是否是偶数。
boolean isFirst():返回当前被迭代元素是否是第一个元素。
boolean isLast():返回当前被迭代元素是否是最后一个元素。
boolean isOdd():返回当前被迭代元素的索引是否是奇数。
例子:

<html>
  <body>
      <table border="1" width="300">
        <s:iterator value="{'java','c++','python'}" id="name"  status="st">
            <tr <s:if test="#st.odd">style="background-color:#bbbbbb"</s:if>>
                <td><s:property value="name"/></td>
            </tr>
        </s:iterator>
      </table>

      <table border="1" width="350">
            <tr>
                <th>书名</th>
                <th>作者</th>
            </tr>
            <!-- 对指定的Map对象进行迭代输出,并指定status属性 -->
            <s:iterator value="#{'java':'slow','c++':'slow','python':'slow'}" id="score" status="st">
                <!-- 根据当前被迭代元素的索引是否为奇数来决定是否使用背景色 -->
                <tr <s:if test="#st.odd">style="background-color:#bbbbbb"</s:if>>
                    <!-- 输出Map对象里Entry的key -->
                    <td><s:property value="key"/></td>
                    <!-- 输出Map对象里Entry的value -->
                    <td><s:property value="value"/></td>
                </tr>
            </s:iterator>
      </table>
  </body>
</html>

这里写图片描述

(4)append标签
①< s:append…/>标签需要指定一个var属性,该属性确定拼接生成的新集合的名字。
②该集合被放入Stack Context中。
③< s:append…/>标签可以接受多个< s:param…/>子标签,每个子标签指定一个集合。
④例子1:

<html>
  <body>
      <!-- 使用append标签将两个集合拼接成新的集合,新集合的名字是newList,新集合放入Stack Cintext中 -->
      <s:append var="newList">
        <s:param value="{'java','c++','python'}"/>
        <s:param value="{'php','c'}"/>
      </s:append>

      <table border="1" width="260">
        <!-- 使用iterator迭代newList集合 -->
        <s:iterator value="#newList" status="st" id="ele">
            <tr>
            <td><s:property value="#st.count"/></td>
            <td><s:property value="ele"/></td>
            </tr>
        </s:iterator>
      </table>
  </body>
</html>

这里写图片描述
⑤例子2:

<html>
  <body>
      <!-- 使用append标签将两个集合拼接成新的集合,新集合的名字是newList,新集合放入Stack Cintext中 -->
      <s:append var="newList">
        <s:param value="#{'java':'slow','c++':'slow','python':'slow'}"/>
        <s:param value="#{'php','c'}"/>
      </s:append>

      <table border="1" width="280">
        <!-- 使用iterator迭代newList集合 -->
        <s:iterator value="#newList" status="st">
            <tr>
            <td><s:property value="key"/></td>
            <td><s:property value="value"/></td>
            </tr>
        </s:iterator>
      </table>
  </body>
</html>

这里写图片描述

(5)generator标签
将指定字符串按指定分隔符分隔成多个子串。有以下属性:
cout:可选,指定生成集合中元素的总数。
separator:必填,指定用于解析字符串的分隔符。
val:必填,指定被解析的字符串。
converter:可选,可以将一个字符串解析成对象集合。
var:可选,将生成的iterator对象放入Stack Context中。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值