EL表达式

什么是EL表达式

EL,Expression Language,表达式语言,是一种在JSP页面中获取数据的简单方式,通过${变量名}的方式可以获取到值,需要注意的是EL只能从 pageConext、request、session、application 四大域属性空间中获取数据。

使用EL表达式获取数据

下面不能成功取值

<% int sum = 88; %>
<!-- 该值取不出来,因为没有放在四大域属性空间中 -->
${sum }

可以将这个值存放到四大域属性空间中的任意一个中。然后访问其存放时的 key即可。

<% 
    pageContext.setAttribute("name", "monkey1024");
    request.setAttribute("name", "monkey1024");
    session.setAttribute("name", "monkey1024");
    application.setAttribute("name", "monkey1024");
%>
<!-- 可以取出来,因为放进了四大域属性空间中 -->
${name }

EL底层是从最小范围的pageContext依次查找,直到查找到最大范围 application。这期间,只要查找到了,则直接获取,不再去后面的范围中查找了,若最终没有查找到,则什么也不输出。

从指定域中获取数据
从 pageContext 依次查找到 application 域空间,会降低执行效率。若属性确定存放在某个域空间时,则可指定直接从该空间中查找。此时需要借助 EL 的四个域属性空间相关的内置对象。

<% 
    pageContext.setAttribute("name", "page");
    request.setAttribute("name", "request");
    session.setAttribute("name", "session");
    application.setAttribute("name", "application");
%>
<!-- 使用域属性空间相关的内置对象获取数据 -->
${pageScope.name }
${requestScope.name }
${sessionScope.name }
${applicationScope.name }

访问 Bean 的属性
EL 可以通过 ${key .属性}的方式获取到指定对象的属性值。其底层实际调用的是该对象的相应属性的 get 方法。也可以使用${key[“属性”]的方式获取。该方式不常用。

<% 
    Student stu = new Student("张三", 22);
    request.setAttribute("stu", stu);
%>
<!-- 访问 student对象中的属性 -->
${requestScope.stu.name }
${requestScope.stu["name"] }

若要访问一个对象的域属性的值,则可多次使用点号运算符,依次取出相应的属性值。

<%     
    Student stu = new Student("张三", 22);
    School s = new School("小猴子",stu);
    request.setAttribute("s", s);
%>
<!-- 访问 school对象中的student对象中的属性 -->
${requestScope.s.stu.name }

获取数组中的元素
EL 可以通过 ${key[索引]} 的方式获取到指定索引的元素。不过,需要注意的是,若数组中不存在该指定索引的元素,系统并不会抛出数组越界异常。

<%     
    String[] names = {"刘德华","黎明","郭富城","张学友"};
    request.setAttribute("names", names);
%>
<!-- 输出黎明 -->
${names[1] }
<!-- 没有输出也不会报错 -->
${names[50] }

获取 List 中的元素

与获取数组中的元素相同,通过 ${key[索引]} 的方式可以获取 List 中指定索引的元素。若 List 中不存在该指定索引的元素,系统并不会抛出越界异常。

<%     
    Student stu1 = new Student("张三", 22);
    Student stu2 = new Student("李四", 23);
    Student stu3 = new Student("王五", 24);
    List<Student> list = new ArrayList<Student>();
    list.add(stu1);
    list.add(stu2);
    list.add(stu3);
    request.setAttribute("list", list);
%>
<!-- 输出李四 -->
${list[1].name }
<!-- 没有输出也不会报错 -->
${list[50].name }

EL 无法输出 Set 集合中的元素。因为 Set 集合中的元素是无序的,即没有索引的概念,所以无法通过索引获取元素。

获取 Map 中的元素
EL 通过 ${attributeName.mapKey} 的方式可以获取指定 Map 的指定 key 的值。

<%     
    Map<String,String> map = new HashMap<String,String>();
    map.put("name","monkey1024");
    map.put("password","123456");
    request.setAttribute("map", map);
%>
${map.name }
<br>
${map.password }

运算符

EL 表达式可以进行各种运算,其中常用的运算符有:

  1. 算术运算符 + – * / % (不支持++、–)
  2. 关系运算符 == != > >= < <=
  3. 逻辑运算符 ! && || not and or
  4. 三目运算符 ? :
  5. 特殊运算符 empty

&& 或者 and, 例如:${false && false} 或者 ${false and false }
|| 或者 or, 例如:${true || false} 或者 ${true or false }
! 或者 not,例如:${!true} 或者 ${not true }

empty的法为${empty 变量},结果为布尔值。

  • 若变量未定义,则返回值为 true
  • 若变量为 String 类型,且其值为空串,则返回值为 true。
  • 若变量为引用类型,且其值为 null,则返回值为 true。
  • 若变量为集合类型,且其不包含任何元素,则返回值为 true。
<%     
    request.setAttribute("name", "");
    request.setAttribute("student", null);
    request.setAttribute("list", new ArrayList());
%>
<!-- 下面输出结果均为true -->
变量未定义:${empty no }<br>
空字符串:${empty name }<br>
对象是null:${empty student }<br>
集合中没有元素:${empty list }<br>