1. OGNL表达式

来源:互联网 发布:如何得网游数据库信息 编辑:程序博客网 时间:2024/04/29 10:06

1. OGNL表达式

 

 

只有给user.xxx传值,它才会自动构造,想初始化model,第一是可以自己NEW,第二就是传递参数进去,但这时候必须保持参数为空的构造方法在model

 

F:访问值栈中的action的普通属性: username = <s:property value="username"/>

Username—是OGNL表达式

B:Private String username(包括get,set)

 

F:访问值栈中对象的普通属性(get set方法)<s:property value="user.age"/> | <s:property value="user['age']"/> | <s:property value="user[\"age\"]"/> | wrong:

B:private User user(包括get,set)

 

F:访问值栈中对象的普通属性(get set方法): <s:property value="cat.friend.name"/>

B:Action中有个private Cat cat, Cat中有个private Dog friend

 

 

其他:

普通方法

F: 访问值栈中对象的普通方法:<s:property value="password.length()"/>

F: 访问值栈中对象的普通方法:<s:property value="cat.miaomiao()" /

F: 访问值栈中action的普通方法:<s:property value="m()" />

 

静态方法

Struts.xml中 

<constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>

F: 访问静态方法:<s:property value="@com.bjsxt.struts2.ognl.S@s()"/>

F: 访问静态属性:<s:property value="@com.bjsxt.struts2.ognl.S@STR"/>

F: 访问Math类的静态方法:<s:property value="@@max(2,3)" />

 

构造方法

F: 访问普通类的构造方法:<s:property value="new com.bjsxt.struts2.ognl.User(8)"/>

 

访问LIST

访问List:<s:property value="users"/>

访问List中某个元素:<s:property value="users[1]"/>

访问List中元素某个属性的集合:<s:property value="users.{age}"/>

访问List中元素某个属性的集合中的特定值:<s:property value="users.{age}[0]"/> | <s:property value="users[0].age"/>

访问Set:<s:property value="dogs"/>

访问Set中某个元素:<s:property value="dogs[1]"/>//无法访问,因为Set无序

访问Map:<s:property value="dogMap"/>

访问Map中某个元素:<s:property value="dogMap.dog101"/> | <s:property value="dogMap['dog101']"/> | <s:property value="dogMap[\"dog101\"]"/>

访问Map中所有的key:<s:property value="dogMap.keys"/>

访问Map中所有的value:<s:property value="dogMap.values"/>

访问容器的大小:<s:property value="dogMap.size()"/> | <s:property value="users.size"/>

 

投影

实际就是过滤,把符合条件的过滤出来。

投影(过滤)<s:property value="users.{?#this.age==1}[0]"/>

遍历USERS集合,然后取出来集合里面age==1的第一个元素

投影:<s:property value="users.{^#this.age>1}.{age}"/>

^表示开头的,取出开头age>1的那个userage

投影:<s:property value="users.{$#this.age>1}.{age}"/>

$表示结尾的,取出结尾age>1的那个userage

投影:<s:property value="users.{$#this.age>1}.{age} == null"/>

 

投影: []:<s:property value="[0].username"/>

表示访问的Stack(就是DEBUG里面的值栈)从上到下的最顶上的元素一直到栈底所有的元素

 

 

 

2. 常用Struts2-tags 

Docs\docs\ generic-tag-reference.html//文档路径

 

property: <s:property value="username"/> 

由于value的值是一个Object类型的表达式,所以会把它转换成OGNL表达式输出值.

property 取值为字符串: <s:property value=" 'username' "/>

property 设定默认值: <s:property value="admin" default="管理员"/>

property 设定HTML: <s:property value="'<hr/>'" escape="false"/>

 

 

set 设定adminName值(默认为request 和 ActionContext:

 <s:set var="adminName" value="username" />

username的值既放到request又放到ActionContext里面

用途:用SET标签给属性特别长的名字换名字

set request取值: <s:property value="#request.adminName" />

set ActionContext取值: <s:property value="#adminName" />

 

set 设定范围: <s:set name="adminPassword" value="password" scope="page"/>

set 从相应范围取值: <%=pageContext.getAttribute("adminPassword") %>

set 设定var,范围为ActionContext: <s:set var="adminPassword" value="password" scope="session"/>

set 使用#取值: <s:property value="#adminPassword"/>

set 从相应范围取值: <s:property value="#session.adminPassword"/>

bean 定义bean,并使用param来设定新的属性值:

<s:bean name="com.bjsxt.struts2.tags.Dog" var =”myDog”>

<s:param name="name" value=" 'pp' "></s:param>

用单引号因为返回值是一个OGNL表达式它找不到,所以用单引号让它变成字符串

<s:property value="name"/>

</s:bean>

生成一个Bean的对象,你在debug里面找不到这个值,因为你没给他加VAR标识。

 

bean 查看debug情况:

<s:bean name="com.bjsxt.struts2.tags.Dog" var="myDog">

<s:param name="name" value="'oudy'"></s:param>

</s:bean>

拿出值:

<s:property value="#myDog.name"/>

 

include 

include _include1.html 包含静态英文文件

<s:include value="/_include1.html"></s:include>

include _include2.html 包含静态中文文件

<s:include value="/_include2.html"></s:include>

目前包含中文获取不到

include _include1.html 包含静态英文文件,说明%用法

<s:set var="incPage" value="%{'/_include1.html'}" />

 

在值栈中直接取:<s:property value="username"/>

在ActionContext中<s:property value="#username"/>

%{}讲里面的内容强制转换成OGNL表达式

<s:include value="%{#incPage}"></s:include>

 

 

 

$ # %的区别

a) $用于i18n和struts配置文件

b) #取得ActionContext的值

c) %将原本的文本属性解析为ognl,对于本来就是ognl的属性不起作用

i. 参考<s:property 和 <s:include

 

 

if elseif else: 

age = <s:property value="#parameters.age[0]" /> <br />

<s:set var="age" value="#parameters.age[0]" />

利用set标签把#parameters.age[0]改成age这样简化代码

<s:if test="#age < 0">wrong age!</s:if>

<s:elseif test="#parameters.age[0] < 20">too young!</s:elseif>

<s:else>yeah!</s:else><br />

 

<s:if test="#parameters.aaa == null">null</s:if>

如果AAA等于NULL 就输出NULL

 

 

遍历集合:<br />

<s:iterator value="{1, 2, 3}" >

<s:property/> |

</s:iterator>

{}里面的值代表一个LIST

 

自定义变量:<br />

<s:iterator value="{'aaa', 'bbb', 'ccc'}" var="x">

Varà把他们都放到x中去了

<s:property value="#x.toUpperCase()"/> |

</s:iterator>

看到var他就放到ActionContext里面了,之后就用#号将他们取出

 

 

使用status:<br />

<s:iterator value="{'aaa', 'bbb', 'ccc'}" status="status">

<s:property/> | 

遍历过的元素总数:<s:property value="#status.count"/> |

 

遍历过的元素索引:<s:property value="#status.index"/> |

 

当前是偶数?:<s:property value="#status.even"/> |

 

当前是奇数?:<s:property value="#status.odd"/> |

 

是第一个元素吗?:<s:property value="#status.first"/> |

 

是最后一个元素吗?:<s:property value="#status.last"/>

 

</s:iterator>

 

 

 

定义Map

必须加#{}

<s:iterator value="#{1:'a', 2:'b', 3:'c'}" >

<s:property value="key"/> | <s:property value="value"/> <br />

</s:iterator>

 

<s:iterator value="#{1:'a', 2:'b', 3:'c'}" var="x">

<s:property value="#x.key"/> | <s:property value="#x.value"/> <br />

</s:iterator>

拿出里面的变量:定义var=’x’

 

 

 

 

总结:

 

1. 值栈中的action的普通属性: username = <s:property value="username"/>

2. ActionContext中的取值username = <s:property value="#username"/>

3. %{}讲里面的内容强制转换成OGNL表达式

0 0