首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

EL跟OGNL区别

2012-11-07 
EL和OGNL区别取Session中的值???OUT:?c:out value${logininfo.username}/?c:out将value 中的内容输

EL和OGNL区别

取Session中的值?

?

?

OUT:?

<c:out value="${logininfo.username}"/>?

c:out>将value 中的内容输出到当前位置,这里也就是把logininfo 对象的?

username属性值输出到页面当前位置。?

${……}是 JSP2.0 中的Expression Language(EL)的语法。它定义了一个表达式,?

其中的表达式可以是一个常量(如上),也可以 是一个具体的表达语句(如forEach循环体中?

的情况)。典型案例如下:?

? ${logininfo.username}?

这 表明引用logininfo 对象的username 属性。我们可以通过“.”操作符引?

用对象的属性,也可以用“[]”引用对象属性, 如${logininfo}?

与${logininfo.username}达到了同样的效果。?

“[]”引用方式 的意义在于,如果属性名中出现了特殊字符,如“.”或者“-”,?

此时就必须使用“[]”获取属性值以避免语法上的冲突(系统开发时应尽量避免?

这 一现象的出现)。?

与之等同的JSP Script大致如下:?

LoginInfo logininfo =?

(LoginInfo)session.getAttribute(“logininfo”);?

String username = logininfo.getUsername();?

可以看到,EL大大节省了编码量。?

这 里引出的另外一个问题就是,EL 将从哪里找到logininfo 对象,对于?

${logininfo.username}这样的表达式而言, 首先会从当前页面中寻找之前是?

否定义了变量logininfo,如果没有找到则依次到Request、Session、?

Application 范围内寻找,直到找到为止。如果直到最后依然没有找到匹配的?

变量,则返回null.?

如果我们需要指定变量的寻找范围,可以在EL表 达式中指定搜寻范围:?

list="{'name1','name2','name3'}" value="%{'name2'}" />?

上面的代码生成了一个HTML Select对象,可选的内容为: name1,name2,name3,默认值为:name2。?

?

生成Map的语法为:# {key1:value1,key2:value2}.?

<s:select label="label" name="name"?

list="#{'foo':'foovalue', 'bar':'barvalue'}" />?

上面的代码生成了一个HTML Select对象,foo名字表示的内容为:foovalue,bar名字表示的内容为:barvalue。?

?

判断一个对象是否在 List内存在:?

<s:if test="'foo' in {'foo','bar'}">?

muhahaha?

</s:if>?

<s:else>?

boo?

</s:else>?

?

<s:if test="'foo' not in {'foo','bar'}">?

muhahaha?

</s:if>?

<s:else>?

boo?

</s:else>?

?

取得一个List的一部分:?

? ?– ?所有满足选择逻辑的对象?

^ ?- ? 第一个满足选择逻辑的对象?

$ ?- ? 最后一个满足选择逻辑的对象?

例如:?

person.relatives.{? #this.gender == 'male'}?

上述代码取得这个人(person)所有的男性(this.gender==male)的亲 戚(relatives)?

?

?

Lambda 表达式?

?

OGNL支持简单的Lambda表达式语法,使用这些 语法可以建立简单的lambda函数。?

?

例如:?

Fibonacci:?

if n==0 return 0;?

elseif n==1 return 1;?

else return fib(n-2)+fib(n-1);?

fib(0) = 0?

fib(1) = 1?

fib(11) = 89?

?

OGNL的Lambda表达式如何工作呢??

Lambda表达式必须放在方括号 内部,#this表示表达式的参数。例如:?

<s:property value="#fib =:<#this==0 ? 0 : #this==1 ? 1 : #fib(#this-2)+#fib(#this-1)>, #fib(11)" />?

?

#fib =:<#this==0 ? 0 : #this==1 ? 1 : #fib(#this-2)+#fib(#this-1)>定义了一个Lambda表达式,?

#fib(11) 调用了这个表达式。?

?

所以上述代码的输出为:89?

?

在JSP2.1中#被用作了JSP EL(表达式语言)的特殊记好,所以对OGNL的使用可能导致问题,?

一个简单的方法是禁用JSP2.1的EL特性,这需要修改web.xml文 件:?

<jsp-config>?

<jsp-property-group>?

<url-pattern>*.jsp</url-pattern>?

<el-ignored>true</el-ignored>?

</jsp-property-group>?

</jsp-config>

热点排行