什么是EL表达式?
表达式语言(Expression Language,EL),EL表达式是用"${}"括起来的脚本,用来更方便的读取对象!
- EL表达式主要用来读取数据,进行内容的显示!
为什么要使用EL表达式?
- 为什么要使用EL表达式,我们先来看一下没有EL表达式是怎么样读取对象数据的吧!
- 在1.jsp中设置了Session属性
<%@ page language="java" contentType="text/html" pageEncoding="UTF-8"%> <html> <head> <title>向session设置一个属性</title> </head> <body> <% //向session设置一个属性 session.setAttribute("name", "aaa"); System.out.println("向session设置了一个属性"); %> </body> </html>
- 在2.jsp中获取Session设置的属性
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title></title> </head> <body> <% String value = (String) session.getAttribute("name"); out.write(value); %> </body> </html>
- 效果:
- 上面看起来,也没有多复杂呀,那我们试试EL表达式的!
- 在2.jsp中读取Session设置的属性
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title></title> </head> <body> ${name} </body> </html>
- 只用了简简单单的几个字母就能输出Session设置的属性了!并且输出在浏览器上!
- 使用EL表达式可以方便地读取对象中的属性、提交的参数、JavaBean、甚至集合!
EL表达式的作用
- 首先来看一下EL表达式的语法吧:
${标识符}
- EL表达式如果找不到相应的对象属性,返回的的空白字符串“”,而不是null,这是EL表达式最大的特点!
获取各类数据
获取域对象的数据
- 上面在例子中,我们已经体验到了获取Session域对象的数据是多么地方便!其实EL表达式可以让我们获取各个域范围的数据
- 在1.jsp中设置ServeltContext属性(也就是application)
<% //向ServletContext设置一个属性 application.setAttribute("name", "aaa"); System.out.println("向application设置了一个属性"); %>
- 在2.jsp中获取application的属性
<% ${name} %>
- 和Session一样,也能获取得到!
- 之前我们来讲ServletContext对象的时候讲过一个方法findAttribute(String name),EL表达式语句在执行的时候会调用该方法,用标识符作为关键字分别从page、request、session、application四个域中查找相应的对象。这也解释了为什么EL表达式可以仅仅通过标识符就能够获取到存进域对象的数据!
- findAttribute()的查找顺序:从小到大,也就是page->request->session->application
获取JavaBean的属性
- 以前在JSP页面获取JavaBean的数据是这样子的:
- 1.jsp页面Session存进一个Person对象,设置age的属性为22
<jsp:useBean id="person" class="domain.Person" scope="session"/> <jsp:setProperty name="person" property="age" value="22"/>
在2.jsp中取出Session的属性
<% Person person = (Person) session.getAttribute("person"); System.out.println(person.getAge()); %>
- 效果如下
- 现在我使用了EL表达式读取数据又会非常方便了
//等同于person.getAge() ${person.age}
- 上面的代码 等同于调用对象的getter方法,内部是通过反射机制完成的!
获取集合的数据
- 集合操作在开发中被广泛地采用,在EL表达式中也很好地支持了集合的操作!可以非常方便地读取Collection和Map集合的内容
- 为了更好地看出EL表达式的强大之处,我们也来对比一下使用EL表达式和不使用EL表达式的区别
- 下面不使用EL表达式输出集合的元素
- 在1.jsp页面中设置session的属性,session属性的值是List集合,List集合装载的又是Person对象
<% List<Person> list = new ArrayList(); Person person1 = new Person(); person1.setUsername("zhongfucheng"); Person person2 = new Person(); person2.setUsername("ouzicheng"); list.add(person1); list.add(person2); session.setAttribute("list",list); %>
- 在2.jsp中获取到session的属性,并输出到页面上
<% List<Person> list = (List) session.getAttribute("list"); out.write(list.get(0).getUsername()+"<br>"); out.write(list.get(1).getUsername()); %>
使用EL表达式又是怎么样的效果呢?我们来看看!
<%--取出list集合的第1个元素(下标从0开始),获取username属性--%> ${list[0].username} <br> <%--取出list集合的第2个元素,获取username属性--%> ${list[1].username}
- 同样也可以有相同的效果:
- 我们再来使用一下Map集合
- 在1.jsp中session属性存储了Map集合,Map集合的关键字是字符串,值是Person对象
<% Map<String, Person> map = new HashMap<>(); Person person1 = new Person(); person1.setUsername("zhongfucheng1"); Person person2 = new Person(); person2.setUsername("ouzicheng1"); map.put("aa",person1); map.put("bb",person2); session.setAttribute("map",map); %>
- 看起来好像取出数据的时候是会有点复杂,但是有了EL表达式也是非常轻松的!
${map.aa.username} <br> ${map.bb.username}
- 效果:
- 如果Map集合存储的关键字是一个数字,就不能使用"."号运算符了,如下所示
- 对于这种情况,我们可以使用"[]"的形式读取Map集合的数据
${map["1"].username} <br> ${map["2"].username}
- EL表达式配合JSTL标签可以很方便的迭代集合,后面讲到JSTL标签的时候会用到!这里就不详细说明了。
EL运算符
- EL表达式支持简单的运算符:加减乘除取摸,逻辑运算符。empty运算符(判断是否为null),三目运算符
- empty运算符可以判断对象是否为null,用作于流程控制!
- 三目运算符简化了if和else语句,简化代码书写
<% List<Person> list = null; %> ${list==null?"list集合为空":"list集合不为空"}
- 效果: