从EL和OGNL的区别联想到值栈的原理

EL表达式和OGNL表示的区别主要体现在两个方面

一,取值方式

  OGNL表达式:需要配合struts2的jstl标签进行使用,取值方式为,非map类型的值为,用key值 或key值点属性名来取,map类型需要在key值前加#

  EL表达式:不需要配合其他标签,直接就可以使用,用${存入的key值}的方式来取,全页面都可以用包括<head>标签体内

二,从何处取值

  这里我们先说EL,众所周知,web项目有四个作用域page,request,session.application,而EL表达式之所以相比较OGNL表达式来讲不用写作用域的原因是EL表达式会自动从这四个作用域先后查找key值,找到就返回,找不到就向下一个作用域查,直到最后找到返回value值或者找不到返回null

  而OGNL则在struts2的值栈中取值,那么,struts2的值栈是什么?这是我们在学习struts2时的一个重点,值栈是什么,简单的说,值栈是一块内存空间,是struts2框架特有的一种存储数据的数据结构。既然是数据结构,那么我们来看一下这个结构是什么样子,值栈分为root区和ContextMap区,其中,root区中存入的是当前访问的Action对象,还有struts2标签处理的临时结果对象 以及自定义。ContextMap区的底层数据类型就是一个map,键分别是,request,session,application,parameters,自定义,注意,此处的request和session还有application和web项目中普遍意义上的作用域是重合,就像是值栈提供了进入这些作用域的一个入口。而值栈的作用更像是扩展了web项目中的request作用域的大小,和存储方式,为什么说是request作用域呢,因为值栈的作用范围是在一次请求内有效。

  现在我们来总结一下值栈的特点:1,分为root区和ContextMap区

  ·                 2,生命周期是一次请求内有效

                 3,自动将当前action对象存入root区

那么,EL和OGNL表达式是区别也明了了,表面上来看只是使用方式的不同,但其本质上却是取值位置的不同,OGNL表达式绑定了struts2框架,取值是从值栈中去的,而EL则只能从四个作用域中取值。

posted @ 2017-11-16 23:04  yyf264  阅读(114)  评论(0)    收藏  举报