<%@taglib prefix="s" uri="/struts-tags"%>
<s:abc.../>
(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/>
(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'}
<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"/>
例子:求斐波那契数列的第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>
(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>
<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>
(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>
<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>
(5)generator标签
将指定字符串按指定分隔符分隔成多个子串。有以下属性:
cout:可选,指定生成集合中元素的总数。
separator:必填,指定用于解析字符串的分隔符。
val:必填,指定被解析的字符串。
converter:可选,可以将一个字符串解析成对象集合。
var:可选,将生成的iterator对象放入Stack Context中。