JSP的EL表达式的使用

JSP2.0最重要的特性之一就是表达式语言EL (Expression Language ),由于受到ECMAScript和XPath表达式语言的启发,EL也被设计成可以轻松地编写免脚本的JSP页面。使用EL表达式,JSP页面可以不再使用任何的JSP声明、脚本和表达式,就可以轻松地访问应用程序的
数据,这使得JSP页面写起来更加简单。在许多Java Web应用程序中,EL还是会和JSTL配合使用。

一.EL表达式的主要作用:

获取数据。EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的Web作用域中检索Java对象,获取数据,包括访问JavaBean的属性、List集合、Map集合、数组等。
执行运算。利用EL表达式可以在JSP页面中执行一些基本的关系运算、逻辑运算和算术运算,以在JSP页面中完成一些简单的逻辑操作。
获取Web开发常用对。EL表达式定义了一些隐式对象,利用这些隐式对象,开发人员可以很轻松获得对Web常用对象的引用,从而获得这些对象中的数据。
1.1.${expression}
EL表达式以${开头,并以}结束。EL表达式的结构如下:

  1. ${expression}

例如,表达式X+Y,可以写成:

  1. ${x+y}

它也常用来连接两个表达式。对于一系列的表达式,它们的取值将是从左到右进行,计算结果的类型为String,并且连接在一起。
${表示是一个EL表达式的开头,如果需要的只是文本${,则需要在它前面加一个转义符,如\${。

1.2.[]和.运算符
EL表达式可以返回任意类型的值。如果EL表达式的结果是一个带有属性的对象,以利用[]或者.运算符来访问其属性,即通过getter方法获取其属性。[]和.运算符类似, 访问对象的属性,可以使用以下任意一种形式:

  1. ${object["propertyName"]}
  2. ${object.propertyName}

如果propertyName不是有效的Java变量名,则只能使用[]运算符。例如,访问隐式对象标题中的HTTP的host:

  1. ${header["host”]}
  2. ${header.host}

但是,要想访问accept-language标题,只能使用[]运算符,因为accept-language不是一个合法的Java变量名。如果用.运算符访问它,将会导致异常。

1.3.取值规则
EL表达式的取值是从左到右进行的。对于expr-a[expr-b]形式的表达式,其EL表达式的取值方法如下:

  • (1)先计算expr-a得到value-a 。
  • (2)如果value-a为null,则返回null
  • (3)然后计算expr-b得到value-b 。
  • (4)如果value一为null,则返回null 。
  • (5)如果value-a为java.uitl.List,则要进行以下处理:
  • a.强制value-b为int,如果不是,则抛出异常。
  • b.如果value-a.get(value-b)抛出IndexOutBoundsException,则返回null 。
  • c.返回value-a.get(value-b)的值。
  • (6)如果value-a为java.util.Map,则会查看value-b是否为Map中的一个key。如果是,则返回value-a.get(value-b),如果不是,则返回null。
  • (7)如果value-a不是一个集合,那么,value-a必须是一个JavaBean。在这种情况下,必须强制value-b为String类型。如果value-b是value-a的一个可读属性,则会调用该属性的getter方法返回值。如果getter方法抛出异常,则该表达式就是无效的。

1.4.访问JavaBean
EL最常用来访问JavaBean的属性,利用「l和.运算符都可以访问JavaBean的属性,示例代码如下:

  1. ${beanName["propertyName"]}
  2. ${beanName.propertyName}

如果JavaBean的属性是一个带属性的对象,那么同样也可以利用口或.运算符来访问第二个对象的属性。例如有一个employee对象,employee对象有一个dept对象,dept对象有一个name属性。示例代码如下

  1. ${employee .dept.name}

二.EL表达式的运算符
2.1.算术运算符有5种:

  1. 加法(+)
  2. 减法(一)
  3. 乘法(*)
  4. 除法(/)
  5. 取余/取模(%和mod )
  6. 运算符是按优先级顺序排列的:
  7. *、/、%、mod优先级相同,+、一优先级相同。*、/、%、mod优先级高于+ 、-
  8. 2.2.逻辑运算符有3种:
  9. 和(&&和and)
  10. 或(||和or)
  11. 非(!和not )

2.3.关系运算符有如下几种:

  1. 等于(==和eq)
  2. 不等于(!=和ne)
  3. 大于(>和gt)
  4. 大于或等于(>=和ge)
  5. 小于(<和lt )》小于或等于(<=和le )

关系运算符返回的是Boolean值,例如,表达式${1==2}返回false,${2 < 3} 返回true 。
EL关系运算符的语法如下:

  1. ${satement?A:B}

如果statement的计算结果为true,那么该表达式的输出结果是A,不然是B 例如,下面EL表达式可以判断用户是否登录。

  1. ${sessionScope.user.username==null?'‘您己经登录”:”您还没有登录”}

2.4.empty运算符
empty运算符用来检查作用域中是否有该变量存在,然后再判断该变量是否为null或者空字符串。示例代码如下:

  1. ${empty username}

1) empty首选判断JSP的作用域中是否有username变量,如果没有,则表达式返回true.
2) empty判断username变量是否为null或者一个长度为0的空字符串,如果是,则表达式返回true;如果username是一个空的集合或者数组,则表达式也返回true。否则表达式将返回false。

三.EL表达式的隐式对象
在JSP页面中,可以利用JSP脚本访问JSP的对象。在EL中,提供了11个隐式对象用来访问Web开发中常用的JSP对象并获取数据。表列出了EL表达式的隐式对象。

隐式对象 描述
pageContext JSP页面的上下文对象。它可以访问JSP隐式对象,如请求、响应、会话、输出、servletContext等
param 一个包含所有请求参数,并用参数名作为key的Map。每个key的值就是指定名称的第一个参数值,表达式${param.name}相当于request.getParameter (name)
paramValue 一个包含所有请求参数,并用参数名作为key的Map。每个key的值是一个字符串数组,其中包含了指定参数名称的所有参数值。它与param隐式对象非常类似,但它检索一个字符串数组而不是单个值。表达式${paramvalues, name}相当于request.getParamterValues(name)
header 包含请求标题,并用标题名作为key的Map。每个key的值就是指定标题名称的第一个标题值。表达式$ {header.name}相当于request.getHeader(name)
headerValues 包含请求标题,并用标题名作为key的Map。每个key的值就是一个字符串数组,其中包含了指定标题名称的所有参数值。它与head隐式对象非常类似,但它检索一个字符串数组而不是单个值。表达式$ {headerUalues. name}相当request.getHeaderValues(name)
cookie 包含了当前请求对象中所有Cookie对象的Map 。 Cookie名称就是key名称,每个key都映射到一个Cookie对象。表达式${cookie. name .value}返回带有特定名称的第一个Cookie值
initParam 包含所有环境初始化参数,并用参数名作为key的Map。表达式${initParam. name}相当于ServletContext.getInitparameter (name)
pageScope 这是一个Map,其中包含了页面域内的所有属性(Attribute ) 。属性名称就是Map的lcey。表达式$ {pageScope.name}相当于pageContext.getAmibute(“name”)
requestScope 这是一个Map,其中包含了请求域内的所有属性(Aaribute ) 。属性名称就是Map的key。表达式${ requestScope.name}相当于request.getAttribute(“name”)
sessionScope 这是一个Map,其中包含了会话域内的所有属性(Attribute ) 。属性名称就是Map的key。表达式${ sessionScope.name}相当于session.getAttribute(“name”)
applicationScope 这是一个Map,其中包含了应用程序上下文域内的所有属性(Amibute ) 。属性名称就是Map的key。表达式${ applicationScope.name}相当于appiication.getAttribute(“name”)

3.1.pageScope, requestScope, sessionScope和applicationScope
在JSP中,经常通过JSP的page, request, session和application 4个作用域对象获取存储在其中的属性值。而这4个对象用来取值的getAttribute(“name”)方法并不是一个标准的getter方法,其无法通过EL的对象获取存储的属性值。所以EL表达式提供了4个scope隐式对象,用于获取4个作用域中所存储的属性值,对应的4个作用域中的取值方法为getAttribute(“name”)。4个作用域的范围从小到大依次为:pageScope, requestScope, sessionScope和applicationScope。假设4个作用域中都存在有名称为username的属性,则可以使用以下表达式:

  1. ${pageScope .username}
  2. ${requestScope .username}
  3. ${sessionScope .username}
  4. ${applicationScope.username}

EL表达式也支持默认访问,即省略scope对象,直接访问username变量,默认范围为从小到大取值。

  1. ${username}

即首先取pageScope 中的username,如果为null,则取requestScope中的username,依次类推。