/*ognl 是 strut2 特有的表达式,使用 ognl,struts2 就无需将对象手动放值进request等范围,页面(从值栈中)直接传值*/
OGNL
1 <?xml version="1.0" encoding="GB18030" ?> 2 <%@ page language="java" contentType="text/html; charset=GB18030" 3 pageEncoding="GB18030"%> 4 <%@ taglib uri="/struts-tags" prefix="s" %> 5 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 6 <html xmlns="http://www.w3.org/1999/xhtml"> 7 <head> 8 <meta http-equiv="Content-Type" content="text/html; charset=GB18030" /> 9 <title>OGNL表达式语言学习</title> 10 </head> 11 <body> 12 <ol> 13 <li>访问值栈中的action的普通属性: username = <s:property value="username"/> </li> 14 <li>访问值栈中对象的普通属性(get set方法):<s:property value="user.age"/> | <s:property value="user[‘age‘]"/> | <s:property value="user[\"age\"]"/> | wrong: <%--<s:property value="user[age]"/>--%></li> 15 <li>访问值栈中对象的普通属性(get set方法): <s:property value="cat.dog.name"/></li> 16 <li>访问值栈中对象的普通方法:<s:property value="password.length()"/></li> 17 <li>访问值栈中对象的普通方法:<s:property value="cat.miaomiao()" /></li> 18 <li>访问值栈中action的普通方法:<s:property value="m()" /></li> 19 <hr /> 20 <li>访问静态方法:<s:property value="@[email protected]()"/></li> 21 <li>访问静态属性:<s:property value="@[email protected]"/></li> 22 <li>访问Math类的静态方法:<s:property value="@@max(2,3)" /></li> 23 <hr /> 24 <li>访问普通类的构造方法:<s:property value="new com.bjsxt.struts2.ognl.action.User(8)"/></li> 25 <hr /> 26 <li>访问List:<s:property value="users"/></li> 27 <li>访问List中某个元素:<s:property value="users[1]"/></li> 28 <li>访问List中元素某个属性的集合:<s:property value="users.{age}"/></li> 29 <li>访问List中元素某个属性的集合中的特定值:<s:property value="users.{age}[0]"/> | <s:property value="users[0].age"/></li> 30 <li>访问Set:<s:property value="dogs"/></li> 31 <li>访问Set中某个元素:<s:property value="dogs[1]"/></li> 32 <li>访问Map:<s:property value="dogMaps"/></li> 33 <li>访问Map中某个元素:<s:property value="dogMaps.dogMap1"/> | <s:property value="dogMaps[‘dogMap1‘]"/> | <s:property value="dogMaps[\"dogMap1\"]"/></li> 34 <li>访问Map中所有的key:<s:property value="dogMaps.keys"/></li> 35 <li>访问Map中所有的value:<s:property value="dogMaps.values"/></li> 36 <li>访问容器的大小:<s:property value="dogMaps.size()"/> | <s:property value="users.size"/> </li> 37 <hr /> 38 <li>投影(过滤):<s:property value="users.{?#this.age==1}[0]"/></li> 39 <li>投影:<s:property value="users.{^#this.age>1}.{age}"/></li> 40 <li>投影:<s:property value="users.{$#this.age>1}.{age}"/></li> 41 <li>投影:<s:property value="users.{$#this.age>1}.{age} == null"/></li> 42 <hr /> 43 <li>[]:<s:property value="[0].username"/></li> 44 </ol> 45 46 <s:debug></s:debug> 47 </body> 48 </html>
注:
1.因为Set是无序的,访问Set中某个元素,是没有意义的,所以是无法通过下标来取出Set中某个元素
2.访问静态方法,在Struts2.1中 需要在struts.xml中加上 <constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>
3.访问值栈中对象的属性和方法,需要new出这个对象,需要一个无参的构造方法,(如果该类没有构造方法,系统默认有一个构造方法)
4.投影只有 ‘?#‘ ‘^#‘ ‘$#‘ 这三种写法, ‘^#‘表示取集合中第一个元素 ‘$#‘表示取集合中最后一个元素users.{?#this.age==1}[0]
举例分析:users是一个List集合,上式表示:遍历users这个List集合,取出user.age==1 的user 因为可能有多个user满足条件,
所以是一个集合的形式 最后[0] 表示取出满足条件的user集合中的第一个
users.{^#this.age>1}.{age}取出满足age>1 的所有user,这是一个集合,所以取 age属性
也是用集合的方式,选择集合中第一个user,得到一个age集合
5.[] 表示取出 值栈 中的Object,[0] 表示 取出 值栈中的所有的Object(从第一个开始)
[1] 表示取出第二个Object [0].username 表示从上往下依次验证值栈中的Object是否有username这个key 如果有,取出这个key对应的value
另外:如果action之间存在转发(type="chain") 因为这属于一次访问(request)
所以,两个action都会被当做Object 压在 值栈中