OGNL是Struts中用来在视图层访问数据的一种语言,使用了OGNL,你会发现在视图层访问数据相当方便,这会大大地节省开发的时间,并且只需要很小的代码量,就能访问非常复杂的数据,使得代码维护起来也容易。不过,有点遗憾的是,OGNL目前只能在Struts下使用。
OGNL的数据组成
既然OGNL是访问数据的,那肯定就有存放数据的地方,这个地方就是OGNL Context。OGNL Context由两个部分组成,一部分是Object Stack,你把它想象成栈就可以了,后入的数据会被存放在栈顶部;另外一部分是一个Map,存放键值对。
OGNL访问数据的几个符号
要使用OGNL,那么就常常会跟以下的五个符号打交道:
%、#、.(点号)、[]、{}
- %,显式标明当前内容的是一个OGNL表达式
- #,用来访问Map中的数据
- .(点号),用来调用这个对象的getter方法,并取得返回值
- [],用来跟数字一起使用,[0]表示的是Object Stack的顶部对象
- {},标明当前内部内容的是一个表达式
OGNL的Object Stack
在Object Stack当中,存放的通常是Action接口的实现类对象,因为每当我们请求一次动作,Struts就会把这个动作的实例压入到栈的顶部。举个例子,那用户登录这项功能来说,用户登录时请求了名为LoginAction的动作,那么这个动作的实例就会被存放在Object实例的顶部。在视图层,访问Object Stack中的数据要使用[],我们就可以使用[0].property来访问在Object Stack栈顶部的对象的属性(当然,访问这个属性是调用getter方法来访问的)。当你的请求要经过一条动作链时(action chain),那么所有的动作实例都会被压入栈中,而栈的顶部是最后压入的动作实例,此时,顺序使用[0]访问最后一个动作实例,[1]访问倒数第二个动作的实例。
OGNL的Map
在视图层,访问Map中的数据要使用#。在Map中,为我们内置了一些对象,供我们方便访问:
- parameters,请求参数,这其实就是一个字符串数组
- request,HttpServletRequest的实例
- response,HttpServletResponse的实例
- application,ServletContext的实例
总结
很多人在刚刚学习OGNL的时候会一头雾水,不知道什么数据是存放在哪里的,从而在想访问自己想要的数据的时候不知道应该怎么样去写表达式,包括本人最初学习的时候也是这种情况。本篇文章主要是讲解理论,所以这里不会附加很多的例子。总之,要使用OGNL,首先弄清楚数据是存放在哪里的,那么就很容易写出对应的表达式了。