以下内容是基于导入struts2-2.3.32.jar包来讲的
1.OGNL
OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整个对象的结构图,实现对象属性类型的转换等功能。它是一个开源项目。 Struts2框架使用OGNL作为默认的表达式语言。
OGNL 有一个上下文(Context)概念,说白了上下文就是一个MAP结构,它实现了 java.utils.Map 的接口。
作用:
1、支持对象方法调用,如xxx.doSomeSpecial();
2、支持类静态的方法调用和值访问,表达式的格式:
@[类全名(包括包路径)]@[方法名 | 值名],例如:
@java.lang.String@format(‘foo %s‘, ‘bar‘)
或@tutorial.MyConstant@APP_NAME;
3、支持赋值操作和表达式串联,如price=100, discount=0.8,
calculatePrice(),这个表达式会返回80;
4、访问OGNL上下文(OGNL context)和ActionContext;
5、操作集合对象。
ognl表达式取值,如果是根元素取值不用带#符号, 非根元素取值要带#号!
知识点:
OGNL中重要的3个符号:#、%、$:
#符号的用途一般有三种。
— 访问非根对象属性,例如#session.msg表达式,由于Struts 2中值栈被视为根对象,所以访问其他非根对象时,需要加#前缀。实际上,#相当于ActionContext. getContext();#session.msg表达式相当于ActionContext.getContext().getSession(). getAttribute("msg") 。
— 用于过滤和投影(projecting)集合,如persons.{?#this.age>25},persons.{?#this.name==‘pla1‘}.{age}[0]。
— 用来构造Map,例如示例中的#{‘foo1‘:‘bar1‘, ‘foo2‘:‘bar2‘}。
2.%符号
3.$符号
$符号主要有两个方面的用途。
— 在国际化资源文件中,引用OGNL表达式,例如国际化资源文件中的代码:reg.agerange=国际化资源信息:年龄必须在${min}同${max}之间。
— 在Struts 2框架的配置文件中引用OGNL表达式。
2.基本使用
A.往根元素设置并获取值:
1 package com.rong.web.test;
2
3 import com.rong.web.entity.User;
4
5 import ognl.Ognl;
6 import ognl.OgnlContext;
7
8 public class OGNLTest {
9
10 public static void main(String[] args) throws Exception{
11 //Ognl上下文OgnlContext实现了 java.util.Map 的接口,具有Map的功能
12 OgnlContext ognlContext = new OgnlContext();
13 ognlContext.put("username", "huge");
14 System.out.println(ognlContext.get("username"));
15
16 User user=new User();
17 user.setId(57);
18 user.setName("rjl");
19 user.setAge(18);
20 //设置上下文根对象
21 ognlContext.setRoot(user);
22 //表达式
23 Object expression1 = Ognl.parseExpression("name");
24 Object expression2 = Ognl.parseExpression("id");
25 Object expression3 = Ognl.parseExpression("age");
26 Object value1 = Ognl.getValue(expression1, ognlContext, ognlContext.getRoot());
27 Object value2 = Ognl.getValue(expression2, ognlContext, ognlContext.getRoot());
28 Object value3 = Ognl.getValue(expression3, ognlContext, ognlContext.getRoot());
29
30 System.out.println(value1.toString()+value2.toString()+value3.toString());
31 }
32 }
B.往非根元素设置并获取值: