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>