OGNL(Object Graph Navigation Language),是一种表达式语言。使用这种表达式语言,你可以通过某种表达式语法,存取Java对象树中的任意属性、调用Java对象树的方法、同时能够自动实现必要的类型转化。如果我们把表达式看做是一个带有语义的字符串,那么OGNL无疑成为了这个语义字符串与Java对象之间沟通的桥梁。既然OGNL那么强大,那么让我们一起来研究一下他的API,看看如何使用OGNL.
OGNL的API看起来就是两个简单的静态方法:
public static Object getValue( Object tree, Map context, Object root ) throws OgnlException;
public static void setValue( Object tree, Map context, Object root, Object value ) throws OgnlException
1.OGNL表达式的计算是围绕OGNL上下文进行的。
OGNL上下文实际上就是一个Map对象,由ognl.OgnlContext类表示。它里面可以存放很多个JavaBean对象。它有一个上下文根对象。
上下文中的根对象可以直接使用名来访问或直接使用它的属性名访问它的属性值。否则要加前缀“#key”。
2.Struts2的标签库都是使用OGNL表达式来访问ActionContext中的对象数据的。如:。
3.Struts2将ActionContext设置为OGNL上下文,并将值栈作为OGNL的根对象放置到ActionContext中。
4.值栈(ValueStack) :
可以在值栈中放入、删除、查询对象。访问值栈中的对象不用“#”。
Struts2总是把当前Action实例放置在栈顶。所以在OGNL中引用Action中的属性也可以省略“#”。
5.调用ActionContext的put(key,value)放入的数据,需要使用#访问。
OGNL中重要的3个符号:#、%、$:
“#”主要有三种用途:
访问OGNL上下文和Action上下文,#相当于ActionContext.getContext();下表有几个ActionContext中有用的属性:
名称
作用
例子
parameters
包含当前HTTP
请求参数的Map
#parameters.id[0]
作用相当于
request.getParameter("id")
request
包含当前
HttpServletRequest
的属性
(attribute)的Map
#request.userName相当于
request.getAttribute("userName")
session
包含当前
HttpSession的
属性(attribute)
的Map
#session.userName相当于
session.getAttribute("userName")
application
包含当前应用的
ServletContext
的属性(attribute)
的Map
#application.userName相当于
application.getAttribute("userName")
attr
用于按request >
session > application
顺序访问其属性
(attribute)
#attr.userName相当于
按顺序在以上三个范围(scope)
内读取userName属性,直到找到为止
用于过滤和投影(projecting)集合,如books.{?#this.price<100};
构造Map,如#{'foo1':'bar1', 'foo2':'bar2'}。
"%“符号
%符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值,这个类似js中的eval,很暴力。
"$"符号
$符号主要有两个方面的用途。
— 在国际化资源文件中,引用OGNL表达式,例如国际化资源文件中的代码:reg.agerange=国际化资源信息:年龄必须在${min}同${max}之间。
— 在Struts 2框架的配置文件中引用OGNL表达式,例如:
ListPhotos.action?albumId=${albumId}
下面代码实例对OGNL有更深的了解:
Cat.java
packagecom.oumyye.struts2.ognl;public classCat {privateDog friend;publicDog getFriend() {returnfriend;
}public voidsetFriend(Dog friend) {this.friend =friend;
}publicString miaomiao() {return "miaomiao";
}
}
Dog.java
packagecom.oumyye.struts2.ognl;public classDog {privateString name;publicDog() {
}publicDog(String name) {super();this.name =name;
}publicString getName() {returnname;
}public voidsetName(String name) {this.name =name;
}
@OverridepublicString toString() {return "dog: " +name;
}
}
User.java
packagecom.oumyye.struts2.ognl;public classUser {private int age = 8;publicUser() {
}public User(intage) {super();this.age =age;
}public intgetAge() {returnage;
}public void setAge(intage) {this.age =age;
}
@OverridepublicString toString() {return "user" +age;
}
}
OgnlAction.java
packagecom.oumyye.struts2.ognl;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.HashSet;importjava.util.List;importjava.util.Map;importjava.util.Set;importcom.opensymphony.xwork2.ActionSupport;public class OgnlAction extendsActionSupport {privateCat cat;private Map dogMap = new HashMap();private Set dogs = new HashSet();privateString password;privateUser user;privateString username;private List users = new ArrayList();publicOgnlAction() {
users.add(new User(1));
users.add(new User(2));
users.add(new User(3));
dogs.add(new Dog("dog1"));
dogs.add(new Dog("dog2"));
dogs.add(new Dog("dog3"));
dogMap.put("dog100", new Dog("dog100"));
dogMap.put("dog101", new Dog("dog101"));
dogMap.put("dog102", new Dog("dog102"));
}publicString execute() {returnSUCCESS;
}publicCat getCat() {returncat;
}public MapgetDogMap() {returndogMap;
}public SetgetDogs() {returndogs;
}publicString getPassword() {returnpassword;
}publicUser getUser() {returnuser;
}publicString getUsername() {returnusername;
}public ListgetUsers() {returnusers;
}publicString m() {return "hello";
}public voidsetCat(Cat cat) {this.cat =cat;
}public void setDogMap(MapdogMap) {this.dogMap =dogMap;
}public void setDogs(Setdogs) {this.dogs =dogs;
}public voidsetPassword(String password) {this.password =password;
}public voidsetUser(User user) {this.user =user;
}public voidsetUsername(String username) {this.username =username;
}public void setUsers(Listusers) {this.users =users;
}
}
ognl.jsp
OGNL表达式语言学习- 访问值栈中的action的普通属性: username =
- 访问值栈中对象的普通属性(get set方法): | | | wrong: --%>
- 访问值栈中对象的普通属性(get set方法):
- 访问值栈中对象的普通方法:
- 访问值栈中对象的普通方法:
- 访问值栈中action的普通方法:
- 访问静态方法:
- 访问静态属性:
- 访问Math类的静态方法:
- 访问普通类的构造方法:
- 访问List:
- 访问List中某个元素:
- 访问List中元素某个属性的集合:
- 访问List中元素某个属性的集合中的特定值: |
- 访问Set:
- 访问Set中某个元素:
- 访问Map:
- 访问Map中某个元素: | |
- 访问Map中所有的key:
- 访问Map中所有的value:
- 访问容器的大小: |
- 投影(过滤):
- 投影:1}.{age}"/>
- 投影:1}.{age}"/>
- 投影:1}.{age} == null"/>
- []: