1.什么是EL表达式
EL是Expression Language的缩写,它是jsp内置的表达式语言,从jsp2.0开始,就不让再使用java脚本,而是使用el表达式或动态标签来代替java脚本。EL表达式的格式如下:
${表达式}
EL表达式代替的是java脚本中的<%= …%>,也就是说EL表达式也是向浏览器端输出数据。例如${1+2}会向浏览器端输出3。
2.EL表达式的使用
2.1EL表达式之全域查找
通过对EL表达式的初步了解,下面我们通过练习来掌握EL表达式的使用,点击此处
下载案例源代码,如下所示:
(1)创建一个web应用,Example6,对该应用的index.jsp页面进行编辑,如例1-1所示:
例1-1 index.jsp
<body>
This is my JSP page. <br>
<%
request.setAttribute("request_attribute", "request_haha");
%>
${request_attribute }
</body> |
例1-1中,首先向request域中存放名字为“request_attribute“的域属性,值为”request_haha“,然后使用EL表达式将request_attribute从request域中取出,输出在浏览器端。
(2)将Example6发布到服务器端,然后启动服务器,在浏览器端访问index.jsp页面,浏览器显示结果如图1-1所示:
图1-1 浏览器显示结果
由图1-1可知,使用EL表达式成功的从request域中取出了数据。
(3)再次修改index.jsp页面,如例1-2所示:
例1-2 index.jsp
<body>
This is my JSP page. <br>
<%
pageContext.setAttribute("attribute", "pageContext_haha");
session.setAttribute("attribute", "session_haha");
application.setAttribute("attribute", "application_haha");
request.setAttribute("attribute", "request_haha");
%>
${attribute }
</body> |
例1-2中,在jsp的四大域中都存放了名字为“attribute“的与属性,但值各不相同。现在使用EL表达式向浏览器端输出attribute的值,那么浏览器端会输出哪个域的属性值?
(4)再次在浏览器端访问index.jsp页面,浏览器显示结果如图1-2所示:
图1-2 浏览器显示结果
由图1-2可知,${attribute}表达式是从pageContext域中取数据。
(5)将index.jsp页面中的向pageContext域中存放数据的代码注释掉,然后再在浏览器端访问index.jsp,浏览器显示结果如图1-3所示:
图1-3 浏览器显示结果
由图1-3可知,el表达式是从request域中取出的数据。现在再将向request域中存放数据的代码注释掉,再次在浏览器端访问index.jsp页面,浏览器显示结果如图1-4所示:
图1-4 浏览器显示结果
图1-4中,el表达式取出的是session域中的属性值,如果再将向session域存放数据的代码注释掉,再次访问index.jsp页面,浏览器端输出的仍然是“session_haha“,这是因为session对象还存在,那么它当中的域属性自然也就存在,将浏览器关闭,再打开然后再访问index.jsp,浏览器端的输出结果如图1-5所示:
图1-5 浏览器显示结果
通过以上对jsp四大域的操作,可以发现使用EL表达式获取数据是依次从jsp的四大域中获取,即全域查找,次序是page域,request域,session域最后是application域,如果page域中存在,就返回并结束查找,如果没有,就去request域中查找,找到就返回并结束查找,如果request域中也没有,那么就继续去session域中查找,以此类推,最后查找到application域。如果这四个域中都没有,那么EL表达式就返回一个空字符串,即在页面上什么也不显示,如图1-6所示:
图1-6 浏览器显示结果
2.2EL表达式之获取指定域中的数据
在2.1小节中,我们学习了使用EL表达式进行全域查找,但是进行全域查找必然会影响效率,因此现在我们来学习使用EL表达式从指定域中获取数据,具体如下:
(1)再次对index.jsp页面进行修改,如例1-3所示:
<body>
This is my JSP page. <br>
<%
request.setAttribute("attribute", "request_haha");
pageContext.setAttribute("attribute", "pageContext_haha");
session.setAttribute("attribute", "session_haha");
application.setAttribute("attribute", "application_haha");
%>
<p>全域查找:${attribute }</p>
<p>从page域中查找:${pageScope.attribute }</p>
<p>从request域中查找:${requestScope.attribute }</p>
<p>从session域中查找: ${sessionScope.attribute }</p>
<p>从application域中查找:${applicationScope.attribute }</p>
</body> |
例1-3中,如果要指定从哪个域中获取数据,一定要在指定的域名称后面加上“Scope“,否则不能从指定的域中获取数据。
(2)在浏览器端访问index.jsp,浏览器显示结果如图1-7所示:
图1-7 浏览器显示结果
其实,使用EL表达式获取jsp四个域中的数据:
- pageScope:${pageScope.name}等同与pageContext.getAttribute(“name”);
- requestScope:${requestScope.name}等同与request.getAttribute(“name”);
- sessionScoep: ${sessionScope.name}等同与session.getAttribute(“name”);
- applicationScope:${applicationScope.name}等同与application.getAttribute(“name”);
2.3EL表达式之javaBean导航
如果在域中保存的是javaBean对象,那么也可以使用EL表达式来访问javaBean的属性,因为EL表达式只做读操作,所以javaBean一定要为属性提供get方法,而对set方法没有要求。使用EL表达式获取javaBean属性就是javaBean导航。
下面通过一个案例来了解EL表达式是如何进行JavaBean导航的,如下所示:
(1)在Example6应用中,新建一个javaBean类,Address,主要代码如例1-4所示:
例1-4 Address.java
public class Address {
private String city;
private String street;
此处省略Address类的成员变量的get/set方法
@Override
public String toString() {
return "Address [city=" + city + ", street=" + street + "]";
}
} |
(2)在Example6应用中,再次新建一个javaBean类,Employee,主要代码如例1-5所示:
例1-5 Employee.java
public class Employee {
private String name;
private double salary;
private Address address;
此处省略Employee类的成员变量的get/set方法
@Override
public String toString() {
return "Employee [name=" + name + ", salary=" + salary + ", address="
+ address + "]";
}
} |
(3)在Example6下的WebRoot目录下新建一个目录el,然后在该目录下新建一个el.jsp文件,主要代码如例1-6所示:
例1-6 el.jsp
<%@ page import="cn.itcast.domain.*" %><!—由于在跟页面中需要使用Address,Employee类,所以这里需要将它们导入-->
<body>
<%
Address address = new Address();
address.setCity("北京");
address.setStreet("西三旗");
Employee emp = new Employee();
emp.setName("李小四");
emp.setSalary(123456);
emp.setAddress(address);
request.setAttribute("emp", emp);
%>
<h3>使用el获取request域的emp</h3>
${requestScope.emp }<br/>
</body> |
例1-6中,创建了Address和Employee的对象,并将属性赋值,其中address对象是emp对象的一个属性,然后将emp对象保存在request域中,再使用el表达式获取emp对象。
(4)重新启动服务器,在浏览器端访问el.jsp页面,浏览器显示结果如图1-8所示:
图1-8 浏览器显示结果
现在想获取该emp对象的address属性的street属性,el表达式该如何写?
(5)对el.jsp页面稍作修改,如例1-7所示:
... ...
<h3>使用el获取request域的emp对象的address属性的street属性</h3>
${requestScope.emp.address.street}
... ... |
(6)再次访问el.jsp页面,浏览器显示结果如图1-9所示:
图1-9 浏览器显示结果
由图1-9可知,使用例1-7所示的el表达式成功的获取到street属性的值,例1-7中的el表达式就是javaBean导航,其底层代码如下:
Employee _emp=(Employee)request.getAttribute("emp");
String street=_emp.getAddress().getStreet();
因此我们在前面特意强调,如果域中存放的是javaBean对象,javaBean一定要为每个属性提供get方法,因为在使用el表达式获取javaBen属性时,底层就是调用属性的get方法。
(7)在Employee类中添加一个get方法,如例1-8所示:
例1-8 getHehe()方法
此处省略例1-5中的代码 public String getHehe() {
return "我去...";
} |
(8)在el.jsp页面中使用el表达式输出该方法的返回值,如例1-9所示:
此处省略例1-6中的代码
${emp.hehe } |
(9)重新启动服务器,访问index.jsp页面,浏览器显示结果如图1-10所示:
图1-10 浏览器显示结果
由图1-10可知,Employee类中虽然没有名称为”hehe”的成员变量,但是提供了get方法,因此hehe就是Employee的属性,那么在jsp页面中就能通过el表达式${emp.hehe}输出该方法的返回值,进一步说明该el表达式底层就是调用javaBean的get方法。
3.EL表达式运算符
EL是表达式语言,它可以进行一些运算,可使用的运算符如表1-1所示:
表1-1 EL表达式运算符
运算符 | 说明 | 范例 | 结果 |
+ | 加 | ${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 | 并且 | ${true&&false}或${true and false} | false |
!或not | 非 | ${!true}或${not true} | false |
||或or | 或者 | ${true||false}或${true or false} | true |
empty | 是否为空 | ${empty “”},可以判断字符串、数据、集合的长度是否为0,为0返回true。empty还可以与not或!一起使用。${not empty “”} | true |
本文版权归黑马程序员Java培训学院所有,欢迎转载,转载请注明作者出处。谢谢!
作者:黑马程序员Java培训学院
首发:http://www.itheima.com/special/hmjavaeezly/