全国咨询热线:400-618-4000

JAVA培训之EL表达式

创建时间:2016年09月29日16时23分


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.itcast.cn/javaee