EL表达式基础

基本介绍

EL 全名为Expression Language。
EL表达式是JSP 2.0(JavaEE1.4)规范中的一门技术 。因此,若想正确解析EL表达式,需使用支持Servlet2.4/JSP2.0技术的WEB服务器。

注意:有些Tomcat服务器如不能使用EL表达式
(1)升级成tomcat6
(2)在JSP中加入<%@ page isELIgnored=”false” %>

功能

获取数据

EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象、获取数据。(某个web域 中的对象,访问javabean的属性、访问list集合、访问map集合、访问数组)1. 使用EL表达式获取

  • 数据语法:“${标识符}”
  • EL表达式语句在执行时,会调用pageContext.findAttribute方法,用标识符为关键字,分别从page、request、session、application四个域中查找相应的对象,找到则返回相应对象,找不到则返回”” (注意,不是null,而是空字符串)。
  • 示例:${user}
  • EL表达式也可以很轻松获取JavaBean的属性,或获取数组、Collection、Map类型集合的数据,如下例所示

    • ${user.address.city}
    • ${user.list[0]}:访问有序集合某个位置的元素
    • ${map.key} : 获得map集合中指定key的值
  • 结合JSTL的foreach标签,使用EL表达式也可以很轻松迭代各种类型的数组或集合,示例:

    • 迭代数组
    • 迭代collection类型集合
    • 迭代map类型集合

执行运算

利用EL表达式可以在JSP页面中执行一些基本的关系运算、逻辑运算和算术运算,以在JSP页面中完成一些简单的逻辑运算。${user==null}

  • 算术运算符

    算术运算符 说 明 范 例 结 果
    + ${ 17 + 5 } 22
    - ${ 17 - 5 } 12
    * ${ 17 * 5 } 85
    /或div ${ 17 / 5 }或 ${ 17 div 5 } 3
    %或mod 取余 ${ 17 % 5 }或${ 17 mod 5 } 2
  • 关系运算符

    关系运算符 说 明 范 例 结 果
    = = 或 eq 等于 ${ 5 = = 5 } 或 ${ 5 eq 5 } true
    != 或 ne 不等于 ${ 5 != 5 } 或 ${ 5 ne 5 } false
    < 或 lt 小于 ${ 3 < 5 }或 ${ 3 lt 5 } true
    > 或 gt 大于 ${ 3 > 5 }或 ${ 3 gt 5 } false
    <= 或 le 小于等于 ${ 3 <= 5 }或 ${ 3 le 5 } true
    >= 或 ge 大于等于 ${ 3 >= 5 }或 ${ 3 ge 5 } false
  • 逻辑运算符

    逻辑运算符 说 明 范 例 结 果
    && 或 and 交集 ${ A && B } 或 ${ A and B } true / false
    ||或or 并集 ${ A||B } 或 ${ A or B } true / falsetrue / false
    ! 或 not ${ !A } 或 ${ not A } true / false
  • 其他重要运算符

    • Empty 运算符
      Empty 运算符主要用来判断值是否为null 或空的,例如:
      ${ empty param.name }
      接下来说明Empty 运算符的规则:

      • 假若A 为null 时,回传true
      • 否则,假若A 为空String 时,回传true
      • 否则,假若A 为空Array 时,回传true
      • 否则,假若A 为空Map 时,回传true
      • 否则,假若A 为空Collection 时,回传true
      • 否则,回传false
    • 条件运算符
      所谓条件运算符如下:
      ${ A ? B : C}
      意思是说,当A 为true 时,执行B;而A 为false 时,则执行C。

    • ( ) 括号运算符
      括号运算符主要用来改变执行优先权,例如:${ A * (B+C) }
      至于运算符的优先权,如下所示(由高至低,由左至右):

      • []、.
      • ( )
      • -(负)、not、!、empty
      • *、/、div、%、mod
      • +、- (减)
      • <、>、<=、>=、lt、gt、le、ge
      • = =、!=、eq、ne
      • &&、and

获取web开发常用对象

EL 表达式定义了一些隐式对象,利用这些隐式对象,web开发人员可以很轻松获得对web常用对象的引用,从而获得这些对象中的数据。

语法:${隐式对象名称} :获得对象的引用 **

隐含对象名称 描 述
pageContext 对应于JSP页面中的pageContext对象(注意:取的是pageContext对象。)
pageScope 代表page域中用于保存属性的Map对象
requestScope 代表request域中用于保存属性的Map对象
sessionScope 代表session域中用于保存属性的Map对象
applicationScope 代表application域中用于保存属性的Map对象
param 表示一个保存了所有请求参数的Map对象
paramValues 表示一个保存了所有请求参数的Map对象,它对于某个请求参数,返回的是一个string[]
header 表示一个保存了所有http请求头字段的Map对象
headerValues 同上,返回string[]数组。注意:如果头里面有“-” ,例Accept-Encoding,则要headerValues[“Accept-Encoding”]
cookie 表示一个保存了所有cookie的Map对象
initParam 表示一个保存了所有web应用初始化参数的map对象

调用Java方法

EL表达式允许用户开发自定义EL函数,以在JSP页面中通过EL表达式调用Java类的方法。

  • 示例:${prefix:method(params)}
  • 在EL表达式中调用的只能是Java类的静态方法。
  • 这个Java类的静态方法需要在TLD文件中描述,才可以被EL表达式调用。
  • EL自定义函数用于扩展EL表达式的功能,可以让EL表达式完成普通Java程序代码所能完成的功能。

SUN公司的EL函数库

由于在JSP页面中显示数据时,经常需要对显示的字符串进行处理,SUN公司针对于一些常见处理定义了一套EL函数库供开发者使用。
这些EL函数在JSTL开发包中进行描述,因此在JSP页面中使用SUN公司的EL函数库,需要导入JSTL开发包,并在页面中导入EL函数库,如下所示:
在页面中使用JSTL定义的EL函数:
<%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>

注:以下内容引用自传智播客教育教学视频

fn:toLowerCase

  • fn:toLowerCase函数将一个字符串中包含的所有字符转换为小写形式,并返回转换后的字符串,它接收一个字符串类型的参数,例如
  • fn:toLowerCase(“Www.IT315.org”) 的返回值为字符串“www.it315.org”
  • fn:toLowerCase(“”)的返回值为空字符串

fn:toUpperCase

  • fn:toUpperCase函数将一个字符串中包含的所有字符转换为大写形式,并返回转换后的字符串,它接收一个字符串类型的参数。例如:
  • fn:toUpperCase(“Www.IT315.org”) 的返回值为字符串“WWW.IT315.ORG”
  • fn:toUpperCase(“”)的返回值为空字符串

fn:trim

  • fn:trim函数删除一个字符串的首尾的空格,并返回删除空格后的结果字符串,它接收一个字符串类型的参数。需要注意的是,fn:trim函数不能删除字符串中间位置的空格。
  • 例如,fn:trim(“ www.it315.org “) 的返回值为字符串“www.it 315.org”。

fn:length

  • fn:length函数返回一个集合或数组大小,或返回一个字符串中包含的字符的个数,返回值为int类型。fn:length函数接收一个参数,这个参数可以是<c:forEach>标签的items属性支持的任何类型,包括任意类型的数组、java.util.Collection、java.util.Iterator、java.util.Enumeration、java.util.Map等类的实例对象和字符串。
  • 如果fn:length函数的参数为null或者是元素个数为0的集合或数组对象,则函数返回0;如果参数是空字符串,则函数返回0。

fn:split

  • fn:split函数以指定字符串作为分隔符,将一个字符串分割成字符串数组并返回这个字符串数组。
  • fn:split函数接收两个字符串类型的参数,第一个参数表示要分割的字符串,第二个参数表示作为分隔符的字符串。
  • 例如,fn:split(“www.it315.org”, “.”)[1]的返回值为字符串“it315”。

fn:join

  • fn:join函数以一个字符串作为分隔符,将一个字符串数组中的所有元素合并为一个字符串并返回合并后的结果字符串。fn:join函数接收两个参数,第一个参数是要操作的字符串数组,第二个参数是作为分隔符的字符串。
  • 如果fn:join函数的第二个参数是空字符串,则fn:join函数的返回值直接将元素连接起来。例如:
  • 假设stringArray是保存在Web域中的一个属性,它表示一个值为{“www”,”it315”,”org”}的字符串数组,则fn:join(stringArray, “.”)返回字符串“www.it315.org”
  • fn:join(fn:split(“www,it315,org”, “,”), “.”) 的返回值为字符串“www.it315.org”

fn:indexOf

  • fn:indexOf函数返回指定字符串在一个字符串中第一次出现的索引值,返回值为int类型。fn:indexOf函数接收两个字符串类型的参数,如果第一个参数字符串中包含第二个参数字符串,那么,不管第二个参数字符串在第一个参数字符串中出现几次,fn:indexOf函数总是返回第一次出现的索引值;如果第一个参数中不包含第二个参数,则fn:indexOf函数返回-1。如果第二个参数为空字符串,则fn:indexOf函数总是返回0。例如:
  • fn:indexOf(“www.it315.org”,”t3”) 的返回值为5

fn:contains

  • fn:contains函数检测一个字符串中是否包含指定的字符串,返回值为布尔类型。fn:contains函数在比较两个字符串是否相等时是大小写敏感的。
  • fn:contains函数接收两个字符串类型的参数,如果第一个参数字符串中包含第二个参数字符串,则fn:contains函数返回true,否则返回false。如果第二个参数的值为空字符串,则fn:contains函数总是返回true。实际上,fn:contains(string, substring)等价于fn:indexOf(string, substring) != -1。
  • 忽略大小的EL函数:fn:containsIgnoreCase

fn:startsWith

  • fn:startsWith函数用于检测一个字符串是否是以指定字符串开始的,返回值为布尔类型。
  • fn:startsWith函数接收两个字符串类型的参数,如果第一个参数字符串以第二个参数字符串开始,则函数返回true,否则函数返回false。如果第二个参数为空字符串,则fn:startsWith函数总是返回true。例如:
  • fn:startsWith(“www.it315.org”,”it315”)的返回值为false
  • 与之对应的EL函数:fn:endsWith

fn:replace

  • fn:replace函数将一个字符串中包含的指定子字符串替换为其它的指定字符串,并返回替换后的结果字符串。fn:replace方法接收三个字符串类型的参数,第一个参数表示要操作的源字符串,第二个参数表示源字符串中要被替换的子字符串,第三个参数表示要被替换成的字符串。例如:
  • fn:replace(“www it315 org”, “ “, “.”)的返回值为字符串“www.it315.org”

fn:substring

  • fn:substring函数用于截取一个字符串的子字符串并返回截取到的子字符串。fn:substring函数接收三个参数,第一个参数是用于指定要操作的源字符串,第二个参数是用于指定截取子字符串开始的索引值,第三个参数是用于指定截取子字符串结束的索引值,第二个参数和第三个参数都是int类型,其值都从0开始。例如:
  • fn:substring(“www.it315.org”, 4, 9) 的返回值为字符串“it315”

fn:substringAfter

  • fn:substringAfter函数用于截取并返回一个字符串中的指定子字符串第一次出现之后的子字符串。fn:substringAfter函数接收两个字符串类型的参数,第一个参数表示要操作的源字符串,第二个参数表示指定的子字符串,例如:
  • fn:substringAfter(“www.it315.org”, “.”)的返回值为字符串“it315.org”。
  • 与之对应的EL函数为:fn:substringBefore

发表评论

电子邮件地址不会被公开。 必填项已用*标注