在jsp中,经常要使用到jsp表达式<%=变量或者表达式%>来输出声明的变量已经页面传递的参数,可是当变量很多时,大量书写这样的表达式就会显得很累赘。而EL表达式就很好的解决了这个问题,它可以将表达式简化。
EL表达式的语法:${参数名或表达式}
例如,我们需要获取Servlet返回过来的session的值,EL表达式的写法:
<p> EL表达式获取到的name的值为:${name}</p>
它的等同于jsp表达式:
<p> jsp表达式获取到的name的值为:<%=session.getAttribute%></p>
实现的效果是相同的:
那么问题来了,jsp表达式在获取值的时候指定了从哪取值(例如session),那EL表达式呢?如果我们在当前jsp页面中声明一个名称同为name的参数, EL表达式获取的是当前页中的name,还是依旧获取session中的name呢?
<c:set var="name" value="root" scope="page"></c:set>
这个时候就要了解一下jsp的作用域
了。
在Web中共有4个作用域,它们分别是page(当前页)、request(该请求)、session(session中)和application(全局范围内)。
而EL标签可以对这4个作用域的参数进行访问。当使用EL表达式去获取一个参数时,
EL表达式会依次从page、request、session和application中查找,若没有参数,则返回nul。
例如刚才那个问题,当session和page中都声明了名为name的参数,那么EL表达式会先从page中查找name,在page中找到name之后取得它的值,就不再继续查找了。所以EL表达式获取到的,是当前page中的name。
除了可以获取参数的值之外,EL表达式还支持使用一些简单的运算符进行运算操作。
EL表达式的运算符大致可分为:算术运算符、逻辑运算符、关系运算符、其他运算符等。
- 算术运算符: +、-、*、/、mod
- 逻辑运算符: &&(and)、||(or)、!(not);
- 关系运算符:(eq)、!=(ne)、<(lt)、>(gt)、<=(le)、>=(ge);
- 其他运算符: Empty运算符、条件运算符、“()”运算符、“[]”运算符;
这些运算符的使用方式也很简单,在EL表达式中和在其他地方使用是大相径庭的。
<c:set var="child1" value="17" scope="page"></c:set>
<c:set var="child2" value="15" scope="page"></c:set>
<c:choose>
<c:when test="${child1>16 }">
<c:out value="child1 ${child1 }岁了,已经长大了"></c:out>
</c:when>
<c:otherwise>
<c:out value="child1 ${child1 }岁,还是小孩子"></c:out>
</c:otherwise>
</c:choose>
<p>child2 今年${child2 }岁,明年就${child2+1}岁了</p>
虽然EL表达式给编码带来了便利,但是有些特殊的情况下,不能使用EL表达式的时候,就需要禁用EL表达式。
禁用当前页的EL表达式,在页面中加入这一句代码,将isELIgnore属性值改为“true”
:
<%@page isELIgnored="true" %>
禁用个别EL表达式:通常情况下在一个应用中要么全部允许EL标签,要么都不允许,因此很少出现页面部分使用,另一部分又不使用的情况。若要实现此功能,只需在要禁用的表达式的“$”符号前加上一个反斜杠,也就是我们常用的“转义字符”
。如“\${child2 }”
。