使用Struts2的标签库(一)

使用Struts2标签


<%@taglib prefix="s" uri="/struts-tags"%>

<s:abc.../>

Struts2的OGNL表达式语言

(1)OGNL表达式语法:


#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


//返回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里的数据:

debug/>

OGNL中的集合操作

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

{e1,e2,e3 ...}

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

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

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


<s:if test="'foo' in {'foo','bar'}">
包含
s:if>
<s:else>
不包含
s:else>

<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添加:
默认关闭:
使用Struts2的标签库(一)_第1张图片


<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')"/> 
圆周率的值: <s:property value="@java.lang.Math@PI"/>

Lambda(λ)表达式

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

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:
例子:


      <s:set name="age" value="29"/>
      
      <s:if test="#age>60">
        老年人
      s:if>
      
      <s:elseif test="#age>35">
        中年人
      s:elseif>
      
      <s:elseif test="#age>15">
        青年人
      s:elseif>
      <s:else>
        少年
      s:else>

使用Struts2的标签库(一)_第2张图片
(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>

使用Struts2的标签库(一)_第3张图片
②如果为< 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>
            
            <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>>
                    
                    <td><s:property value="key"/>td>
                    
                    <td><s:property value="value"/>td>
                tr>
            s:iterator>
      table>
  body>
html>

使用Struts2的标签库(一)_第4张图片

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

<html>
  <body>
      
      <s:append var="newList">
        <s:param value="{'java','c++','python'}"/>
        <s:param value="{'php','c'}"/>
      s:append>

      <table border="1" width="260">
        
        <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>

使用Struts2的标签库(一)_第5张图片
⑤例子2:

<html>
  <body>
      
      <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">
        
        <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>

使用Struts2的标签库(一)_第6张图片

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

你可能感兴趣的:(Java__Struts2)