OGNL语言解析

来源:互联网 发布:雷云mac版安装失败 编辑:程序博客网 时间:2024/04/30 17:21

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的实例
此外,根据我的经验,使用Struts的标签来生成数据的时候,这些数据大多数是被放入到Map中的,比如说<s:set>标签产生的数据就是这样子的,此外还有用的比较多的<s:iterater status="stat" var="var" ></s:iterater>产生的var变量和stat变量,都是被放入到Map中的。

总结

很多人在刚刚学习OGNL的时候会一头雾水,不知道什么数据是存放在哪里的,从而在想访问自己想要的数据的时候不知道应该怎么样去写表达式,包括本人最初学习的时候也是这种情况。本篇文章主要是讲解理论,所以这里不会附加很多的例子。总之,要使用OGNL,首先弄清楚数据是存放在哪里的,那么就很容易写出对应的表达式了。


0 0
原创粉丝点击