全国咨询/投诉热线:400-618-4000

JAVA培训之EL表达式

更新时间:2016年09月29日16时23分 来源:传智播客JAVA培训学院 浏览次数:


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

javaee

python

web

ui

cloud

test

c

netmarket

pm

Linux

movies

robot

uids

北京校区

    14天免费试学

    基础班入门课程限时免费

    申请试学名额

    15天免费试学

    基础班入门课程限时免费

    申请试学名额

    15天免费试学

    基础班入门课程限时免费

    申请试学名额

    15天免费试学

    基础班入门课程限时免费

    申请试学名额

    20天免费试学

    基础班入门课程限时免费

    申请试学名额

    8天免费试学

    基础班入门课程限时免费

    申请试学名额

    20天免费试学

    基础班入门课程限时免费

    申请试学名额

    5天免费试学

    基础班入门课程限时免费

    申请试学名额

    0天免费试学

    基础班入门课程限时免费

    申请试学名额

    12天免费试学

    基础班入门课程限时免费

    申请试学名额

    5天免费试学

    基础班入门课程限时免费

    申请试学名额

    5天免费试学

    基础班入门课程限时免费

    申请试学名额

    10天免费试学

    基础班入门课程限时免费

    申请试学名额