JavaWeb学习——表达式语言
EL表达式
一、EL简介
JSP2.0最重要的特性之一就是表达式语言(EL),JSP用户可以使用它来访问应用程序数据。受ECMAScript和XPath表达式语言的启发,EL也设计成可以轻易编写免脚本的JSP页面。即页面中不使用任何JSP声明、表达式或者scriptlets。
二、EL语法
EL语法结构: ${ expression }
它也常用来连接两个表达式。对于一系列的表达式,他们的取值将是从左到右进行,计算结果的类型为String,并且连接在一起。例如:${ 1+2 }${ 2+3}的结果是35。
1. [ ]和 . 运算符
EL表达式可以返回任意类型的值。如果EL表达式的结果是一个带有属性的对象,则可以利用[ ]或者 . 运算符来访问该属性。这两个运算符类似;“ [ ] ”比较规范,而“ . ”比较快捷。
为了访问对象的属性,可以使用以下任意一种形式:
${ object["propertyName"] }
${ object.propertyName }
但是,如果propertyName不是有效的Java变量名,只能用[ ]运算符。否则将会导致异常。
如果对象的属性能返回带有属性的另一个对象,则即可以使用“ [ ] ”,也可以用“ . ”运算符来访问第二个对象的属性。例如:
${ pageContext ["request"] ["servletPath"] }
${ pageContext ["request"].servletPath }
${ pageContext.request.servletPath }
${ pageContext.request ["request"]}
2. 取值规则
EL表达式的取值是从左到右进行的。对于expr-a[expr-b]形式的表达式,其EL表达式的取值方法如下:
(1)先计算expr-a得到value-a。
(2)如果value-a为null,则返回null。
(3)然后计算expr-b得到value-b。
(4)如果value-b为null,则返回null。
(5)如果value-a为java.util.Map,则会查看value-b是否为Map中的一个key。若是,则返回value-a.get(value-b),若不是则返回null。
(6)如果value-a为java.util.List,或者假如它是一个array,则要进行以下处理:
a. 强制value-b为int,如果失败,则抛出异常。
b. 如果value-a.get(value-b)抛出IndexOutOfBoundsException,或者假如Array.get(value-a, value-b)抛出ArrayIndexOutOfBoundsException,则返回null。
c.否则,若value-a是一个List,则返回value-a.get(value-b);若value-a是一个array,则返回Array.get(value-a, value-b)。
(7)如果value-a不是一个Map、List或者array,那么,value-a必须是一个JavaBean。在这种情况下,必须强制value-b为String。如果value-b是value-a的一个可读属性,则要调用该属性的getter方法,从中返回值。如果getter方法抛出异常,该表达式就是无效的,否则,该表达式有效。
三、EL隐式对象
在JSP页面中,可以利用JSP脚本来访问JSP隐式对象。但是,在免脚本的JSP页面中,则不可能访问这些隐式对象,EL允许提供一组它自己的隐式对象来访问不同的对象。EL隐式对象如下表:
对象 | 描述 |
pageContext | 这是当前JSP的java.servlet.jsp.pageContext |
initParam | 这是一个包含所有环境初始化参数,并用参数名作为key的Map |
param |
这是一个包含所有请求参数,并用参数名作为key的Map。每个key的值就是指定名称的第一个参数值。 因此,如果两个请求参数同名,则只有第一个能利用param获取值。 要想访问同名参数的所有参数值,就得用params代替。 |
paramValues |
这是一个包含所有请求参数,并用参数名作为key的Map。每个key的值就是一个字符串数组,其中包含了指定参数名称的所有参数值。 就算该参数只有一个值,它也任然会返回一个带有一个元素的数组。 |
header |
这是一个包含请求标题,并用标题名作为key的Map,每个key的值就是指定标题名称的第一个标题。 换句话说,如果一个标题的值不止一个,则只返回第一个值。 要想获得多个值的标题,得用headerValues代替。 |
headerValues |
这是一个包含请求标题,并用标题名作为key的Map,每个key的值就是一个字符串数组,其中包含了指定标题名称的所有参数值。 就算该标题只有一个值,它也任然会返回一个带有一个元素的数组。 |
cookie | 这是一个包含当前请求对象中所有Cookie对象的Map。Cookie名称就是key名称,并且每个key都映射到一个Cookie对象。 |
applicationScope | 这是一个包含了ServletContext对象中所有属性的Map,并用属性名作为key。 |
sessionScope | 这是一个包含HttpSession对象中所有属性的Map,并用属性名作为key。 |
requestScope | 这是一个Map,其中包含了当前HttpServletRequest对象中所有属性,并用属性名称作为key。 |
pageScope | 这是一个Map,其中包含了全页面范围内的所有属性。属性名称就是Map的key。 |
1. pageContext
pageContext 对象表示当前JSP页面的javax.servlet.jsp.PageContext。它包含了所有JSP隐式对象。
例如,可以使用以下任意一种表达式来获取当前的ServletRequest:
${ pageContext.request }
${ pageContext ["request"] }
对请求参数的访问比对其他隐式对象更加频繁;因此,它提供了param和paramValues两个隐式对象。
2. initParam
隐式对象initParam用于获取上下文参数的值。例如,为了获取名为password的上下文参数值,可以使用以下表达式:
${ initParam.password } 或者 ${ initParam ["password"] }
3. param
隐式对象param用于获取请求参数。这个对象表示一个包含所有请求参数的Map。例如,要获取userName参数,可以使用以下表达式:
${ param.userName } 或者 ${ param ["password"] }
4. paramValues
利用隐式对象paramValues可以获取一个请求参数的多个值。这个对象表示一个包含所有请求参数,并以参数名称作为key的Map。每个key的值是一个字符串数组,其中包含了指定参数名称的所有值。例如,为了获得selectedOptions参数的第一个值和第二个值,可以使用以下表达式:
${ paramValues.selectedOptions[0] } ${ paramValues.selectedOptions[1] }
5. header
隐式对象header表示一个包含所有请求标题的Map。
隐式对象headerValues表示一个包含所有请求head,并以header名称作为key的Map。
6. cookie
隐式对象cookie可以用来获取一个cookie。例如,获取名为jesessionid的cookie值:
${ cookie.jesessionid.value }
7. applicationScope、sessionScope、requestScope和pageScope
隐式对象applicationScope用于获取应用程序范围级变量的值。假如有一个应用程序范围级变量myVar,就可以利用以下表达式来获取这个属性:
${ applicationScope.myVar }
sessionScope、requestScope和pageScope与applicationScope相似。只是范围分别为session、request和page。
四、使用其他EL运算符
1. 算数运算符
+、-、*、/和div、%和mod
2. 逻辑运算符
&&和and、||和or、!和not
3. 关系运算符
==和eq、!=和ne、>和gt、>=和ge、<和lt、<=和le、? :
4. empty
empty运算符来检查某个值是否为null或者empty。例如:${ empty X }
如果X为null,或者X是一个长度为0的字符串,那么,该表达式返回TRUE。如果X是一个空Map、空数组或者空集合,它也将返回TRUE,否则,将返回false。
五、配置EL
1. 实现免脚本的JSP页面
<jsp-config> <jsp-property-group> <url-pattern>*.jsp</url-pattern> <scripting-invalid>true</scripting-invalid> </jsp-property-group> </jsp-config>
2. 禁用EL计算
//第一种 <%@ page isELIgnored="true" %>
//第二种
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<el-ignored>true</el-ignored>
</jsp-property-group>
</jsp-config>
--- 天若有情天亦老,人间正道是沧桑 ---