一直以来就是浑浑噩噩的去使用这两个,今天总结一下,他们的区别:

首先看定义:

OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。

E L(Expression Language) 目的:为了使JSP写起来更加简单。表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法。它是一种简单的语言,基于可用的命名空间(PageContext 属性)、嵌套属性和对集合、操作符(算术型、关系型和逻辑型)的访问符、映射到 Java 类中静态方法的可扩展函数以及一组隐式对象。

EL 提供了在 JSP脚本编制元素范围外使用运行时表达式的功能。脚本编制元素是指页面中能够用于在 JSP 文件中嵌入 Java 代码的元素。它们通常用于对象操作以及执行那些影响所生成内容的计算。JSP 2.0 将 EL 表达式添加为一种脚本编制元素


请大家仔细阅读,之后,从下面说起:

大家都知道OGNL是EL表达式的一种,但是有疑问了:

<input type="hidden" name="userId" value="${session.userid}">

这样的代码中,使用的是EL表达式取值,既然是取值,OGNL是它的一种,可不可以这样呢:<input type="hidden" name="userId" value="#session.userid">

明显报错,大概意思就是:不认识你写的#session.userid;

分析:我们也知道,在JSP页面中,有些值是从服务器端取的,包括EL和OGNL;但是这里的EL可以取得到,OGNL就不可以?换句话说:OGNL为何不能写在HTML标签之中

本人这样认为:在EL定义中(红色部分),说明了,JSP2.0已经将EL添加进入为编织元素,所以,即使在HTML中,浏览器在处理时,已经知道这部分是动态代码,是要去服务器中取值的;这部分被认为是嵌套在html中的JSP代码,和<%%>之中的代码没有区别的; 假设在JSP1.0之中,EL照样报错!

          但是,你写OGNL表达式的时候,浏览器显然不认识!报错!同样的道理,你在struts2的标签之中使用的时候,就不会报错,因为浏览器此时认识标签(导入);OGNL就是这样,看上去,他的使用范围小了些!