第六章 Expression Language
6-1 EL简介
6-1  EL简介
EL全名为Expression Language,它原本是JSTL 1.0为方便存取数据所自定义的语言。当时EL 只能在JSTL标签中使用,如下:
<c:out value="${ 3 + 7}">
程序执行结果为10。但是你却不能直接在JSP网页中使用:
<p>Hi ! ${ username }</p>
到了JSP 2.0之后,EL已经正式纳入成为标准规范之一。因此,只要是支持Servlet 2.4 / JSP 2.0的Container,就都可以在JSP网页中直接使用EL了。
除了JSP 2.0建议使用EL之外,JavaServer Faces( JSR-127 ) 也考虑将EL纳入规范,由此可知,EL如今已经是一项成熟、标准的技术。
注意
假若您所用的Container只支持Servlet 2.3/JSP 1.2,如:Tomcat 4.1.29,您就不能在
JSP网页中直接使用EL,必须安装支持Servlet 2.4 / JSP 2.0的Container。
6-2 EL语法
EL语法很简单,它最大的特点就是使用上很方便。接下来介绍EL主要的语法结构:${sessionScope.user.sex}
所有EL都是以${ 为起始、以} 为结尾的。上述EL范例的意思是:从Session的范围中,取得用户的性别。假若依照之前JSP Scriptlet的写法如下:
User user = (Attribute("user");
String sex = Sex( );
两者相比较之下,可以发现EL的语法比传统JSP Scriptlet更为方便、简洁。
6-2-1  .与 [ ] 运算符
EL提供 . 和 [ ] 两种运算符来存取数据。下列两者所代表的意思是一样的:${sessionScope.user.sex}
等于
${sessionScope.user["sex"]}
.和[ ] 也可以同时混合使用,如下:
${sessionScope.shoppingCart[0].price}
回传结果为shoppingCart中第一项物品的价格。
不过,以下两种情况,两者会有差异:
(1) 当要存取的属性名称中包含一些特殊字符,如.或–等并非字母或数字的符号,就一定要使用 [ ],例如:
${user.My-Name }
上述是不正确的方式,应当改为:
${user["My-Name"] }
(2) 我们来考虑下列情况:
${sessionScope.user[data]}
此时,data是一个变量,假若data的值为"sex"时,那上述的例子等于${sessionScope.user.sex};假若data的值为"name"时,它就等于${sessionScope.user.name}。因此,如果要动态取值时,就可以用上述的方法来做,但.无法做到动态取值。
接下来,我们更详细地来讨论一些情况,首先假设有一个EL:
${expr-a[expr-b]}
(1) 当expr-a的值为null时,它会回传null。
(2) 当expr-b的值为null时,它会回传null。
(3)当expr-a的值为一Map类型时:
●假若 !ainsKey(value-b)为真,则回传null。
●否则回传(value-b)。
网页float是什么意思(4) 当expr-a的值为List或array类型时:
●将value-b的值强制转型为int,假若不能转型为int时,会产生error。
●然后,假若(value-b)或(value-a, value-b)产生ArrayIndexOutOfBoundsException或IndexOutOfBoundsException时,则回传null。
●假若(value-b)或(value-a, value-b)产生其他的异常时,则会产生
error。
●最后都没有任何异常产生时,回传(value-b)或(value-a, value-b)。
(5) 当expr-a的值为JavaBean对象时:
●将value-b的值强制转型为String。
●假若getter产生异常时,则会产生error。若没有异常产生时,则回传getter的结果。
6-2-2  EL变量
EL存取变量数据的方法很简单,例如:${username}。它的意思是取出某一范围中名称为username 的变量。因为我们并没有指定哪一个范围的username,所以它的默认值会先从Page范围,假如不到,再依序到Request、Session、Application范围。假如途中到username,就直接回传,不再继续下去,但是假如全部的范围都没有到时,就回传null(见表6-1):
表6-1
属性范围在EL中的名称
Page PageScope
Request RequestScope
Session SessionScope
Application ApplicationScope
自动搜索顺序
我们也可以指定要取出哪一个范围的变量(见表6-2):
表6-2
范例说明
${pageScope.username} 取出Page范围的username变量
${requestScope.username} 取出Request范围的username变量
${sessionScope.username} 取出Session范围的username变量
${applicationScope.username} 取出Application范围的username变量其中,pageScope、requestScope、sessionScope和applicationScope都是EL的隐含对象,由它们的名称可以很容易猜出它们所代表的意思,例如:${sessionScope.username}是取出Session 范围的username变量。这种写法是不是比之前JSP的写法:
String username = (String) Attribute("username");
容易、简洁许多。有关EL隐含对象在6-3节中有更详细的介绍。
6-2-3  自动转变类型
EL除了提供方便存取变量的语法之外,它另外一个方便的功能就是:自动转变类型,我们来看下面这个范例:
${unt + 20}
假若窗体传来count的值为10时,那么上面的结果为30。之前没接触过JSP的读者可能会认为上面的例子是理所当然的,但是在JSP 1.2之中不能这样做,原因是从窗体所传来的值,它们的类型一律是String,所以当你接收之后,必须再将它转为其他类型,如:int、float等等,然后才能执行一些数学运算,下面是之前的做法:
String str_count = Parameter("count");
int count = Integer.parseInt(str_count);
count = count + 20;
接下来再详细说明EL类型转换的规则:
(1) 将A转为String类型
●假若A为String时:回传A
●否则,当A为null时:回传 ""
●否则,当A.toString( )产生异常时:错误!
●否则,回传 A.toString( )
(2) 将A转为Number类型的N
●假若A为null或 "" 时:回传0
●假若A为Character时:将A转为 new Short((short)a.charValue( ))
●假若A为Boolean时:错误!
●假若A为Number类型和N一样时:回传A
●假若A为Number时:
·假若N是BigInteger时:
·假若A为BigDecimal时:回传 A.toBigInteger( )
·
否则,回传 BigInteger.valueOf(A.longValue( )) ·假若N是BigDecimal时:
·假若A为BigInteger时:回传 A.toBigDecimal( )
·否则,回传 BigDecimal.valueOf(A.doubleValue( )) ·假若N为Byte时:回传 new Byte(A.byteValue( ))
·假若N为Short时:回传 new Short(A.shortValue( ))
·假若N为Integer时:回传 new Integer(A.intValue( ))

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。