• 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>

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

  • 相关阅读:
    据说,能找出15个以上的的视力才正常....
    看看用PS来转基因的动物,居然很欢乐!!
    《天引》读书笔记——由新月形面积引发的人类长达2000年的探索。
    练习使用策略模式
    折半查找
    UltraEdit常用配置&搭建Java/C开发环境
    一个操作系统的实现_十分钟完成的操作系统——到这里博客迁移工作圆满结束
    C++中的变量初始化
    LeetCode Range Sum Query
    Peeking Iterator
  • 原文地址:https://www.cnblogs.com/cardiolith/p/9453908.html
Copyright © 2020-2023  润新知