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>

--- 天若有情天亦老,人间正道是沧桑 ---

原文地址:https://www.cnblogs.com/cardiolith/p/9453908.html