JavaWeb-EL表达式

EL全称 Expression Language(表达式语言),是jsp2.0最重要的特性之一,可以利用EL表达式来访问应用程序中的数据,来消除jsp页面中的java脚本。

  • el表达式的语法
    expressionx+y {x+y}

  • el中的关键字
    以下是el中的关键字,他们不能用做标识符:
    and,eq,gt,true,instanceof,or,ne,le,false,empty,not,lt,ge,null,div,mod
    后面会对部门关键字做进一步讲述.

  • 运算符 [ ] 和 .
    EL表达式可以返回任意类型的数值。例如EL表达式的结果是一个带有属性的对象,则可以利用 [ ] 和 . 来访问属性值,效果完全一样,只不过 [ ] 比 . 稍微正规一点。

    eg:${object.["propertyName"]} 或 ${object.propertyName}

    但是,要注意一个非常重要的“陷阱”,当属性名称不是有效的java变量名时,就只能用 [] ,而不能用 . 操作。
    eg:获取请求头中host属性的值
    ${header["host"]} 或 ${header.host}这是没问题的。

    但是,当要获取accept-language属性时,就只能用 []。

     ${header["accept-language"]}
    当获取到的结果仍然是一个对象时,还可以继续用 [] 或 . 来获取其中的属性。例如,利用el表达式获取servlet path
    ${pageContext["request"]["servletPath"]}
    ${pageContext.request["servletPath"]}
    ${pageContext.request.servletPath}
    获取HttpSession中的属性

    ${pageCotext.session}
    ${pageContext.session.id}
  • el表达式的取值规则
    el表达式的取值是从左到右进行的,对于expr-a[expr-b]形式的表达式,取值规则入下:
    1)先计算expr-a,得到value-a
    2)如果value-a为null,则返回null
    3)然后计算expr-b,得到value-b
    4)如果value-b为null,则返回null
    5)如果value-a为map,则查看value-b是否是map中的一个key,如果是,则返回value-a.get(value-b),若不是,则返回null
    6)如果value-a为list,或者array,则要进行如下处理
    6.a)强制将value-b转为int,若转换失败,则抛出异常。
    6.b)如果value-a.get(value-b)抛出IndexOutOfBandsException或者Array.get(value-a,value-b)抛出ArrayIndexOutBandsException,则返回null。
    6.c)否则,若value是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方法。

  • EL表达式的隐式对象
    在jsp页面中,可以利用jsp脚本来方法jsp隐式对象。但是在免脚本的jsp页面中,则不可能访问这些隐式对象,EL表达式通过提供一组自己的隐式对象来访问不同的对象。

    EL表达式是隐式对象有:
    *pageContext:它与jsp中的PageContext对象相对应。

    initParam:它包含所有环境初始化参数,并用参数名作为key的map

    *param:它包含所有请求参数,并用参数名作为key的map,每一个key 的值是指定名称的第一个参数值。

    *paramValues:它包含所有请求参数,并用参数名为key的map。每个key的值是一个字符串数组,其中包含了指定参数名称的所有参数值。

    header:这是一个包含请求标题,并用标题名作为key的map。每一个key的值就是指定标题名称的第一个标题。

    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,其中包含了全页面范围的所有属性,属性名称作为key。

下面简单介绍一下这些隐式对象。
1)pageContext
该隐式对象对应于jsp隐式对象中的pageContext,它是最常用的取值入口,因为其中包含了很多其他的与Servlet相关的对象,例如requst、response、out、session、application、config、page、exception等。

我们可以像下面这样来获取request对象

${pageContext.request}、${pageContext["request"]}

获取请求方式或请求中的一个参数

${pageContext.request.method} ${pageContext["request"]["paramName"]}

一次类推……

2)initParam
该对象包含了上下文的初始参数值,即

<context-param>
           <param-name>contextConfigLocation</param-name>
           <param-value>
                 classpath:spring-beans.xml
                 classpath:spring-cxf.xml
           </param-value>
</context-param>

如果要利用initParam来获取这个初始化参数的值,是这样的

${initParam.contextConfigLocation}
${initParam["contextConfigLocation"]}

3)param
该对象用于获取请求参数,如果在一个请求中客户端向服务器提交了用户名和密码信息,那么就可以用下面的形式来获取

${param.username}/${param["password"]}

4)paramValues
利用这个对象可以获取一个请求参数的多个值,例如多个复选框,它的返回值是一个字符串数组,若我们选中了多个用于说明爱好的复选框,则可以用下面的方式来获取这些值

${paramValues.hobby[0]}  //第一个爱好
${paramValues.hobby[1]}  //第二个爱好

5)header
还隐身对象包含请求标题,可以用它来获取所有请求头信息

${header.connection}
${header.host}
${header["accept-language"]}

注意,前面已经说过,如果key不是一个标准的Java变量名,那么只能用[ ]来获取其对应的值,就像accept-language一样。

6)headerValues
同paramValues类似

${headerValues["accept-language"][0]}

7)cookie
利用这个隐式对象可以获取所有cookie的值,例如
获取jsessionid的数据

${cookie.jsessionid.value}
${cookie.jsessionid.path}

获取用户session数据

${cookie.user.name}
${cookie.user.age}

8)applicationScope、sessionScope、requestScope、pageScope
分别用户获取ServletContext、Session、HttpServletRequest和PageContext中的数据。

需要说明的一点是,例如,用el表达式获取name的值${name},这样写,el会先从pageScope范围找key为name的值,若没有,则会按照 requestScope->sessionScope->applicationScope来以此查找。

  • EL表达式的其他运算符

    1.算数运算
    · + 加法
    · - 减法
    · * 乘法
    · / (div) 除法
    · %/mod 取余/取模

    2.逻辑运算符
    · &&/and 和
    · || / or 或
    · ! / not 非

    3.关系运算符
    · == / eq 等于
    · != / ne 不等于
    · >/gt 大于
    · · >=/ge 大于等于
    · <=/lt 小于等于
    · · <=/le 小于或等于

     4.三目运算符
    
    ${statement ? A : B}
        5.empty
        用来检查一个值是否为null或空
        ${empty x} 如果x为null或空(长度为0的字符串),则返回true,否则返回false
  • 在jsp 2.0中配置EL表达式
    1)实现免脚本的jsp页面
    不在jsp中写java脚本在很多项目中已经是硬性标准,但是有些攻城狮们就是不听话,那怎么办呢,强制!向下面这样
web.xml
<jsp-config>
     <jsp-property-group>
         <url-pattern>*.jsp</url-pattern>
         <script-invalid>true</script-invalid>
     </jsp-property-group>
</jsp-config>

这样在所有jsp中就金庸了java脚本,哈哈,够狠!

2)禁用EL
当然,什么事都有特殊情况,禁用EL表达式!这翻脸也太快了吧!
第一种方式,在jsp页面中利用jsp指令完成。

<%@ page isELIgnored="true"%>

第二种方式:
在web.xml中配置,向下面这样。

<jsp-config>
    <jsp_property-group>
        <url-pattern>*.jsp</url-pattern>
        <el-ignored>true</el-ignored>
    </jsp-property-group>
</jsp-config>

你可能感兴趣的:(JavaWeb)