首頁(yè)技術(shù)文章正文

JAVA培訓(xùn)之EL表達(dá)式

更新時(shí)間:2017-04-16 來源:黑馬程序員Java培訓(xùn)學(xué)院 瀏覽量:


1.什么是EL表達(dá)式

EL是Expression Language的縮寫,它是jsp內(nèi)置的表達(dá)式語(yǔ)言,從jsp2.0開始,就不讓再使用java腳本,而是使用el表達(dá)式或動(dòng)態(tài)標(biāo)簽來代替java腳本。EL表達(dá)式的格式如下:
${表達(dá)式}
EL表達(dá)式代替的是java腳本中的<%= …%>,也就是說EL表達(dá)式也是向?yàn)g覽器端輸出數(shù)據(jù)。例如${1+2}會(huì)向?yàn)g覽器端輸出3。

2.EL表達(dá)式的使用

    2.1EL表達(dá)式之全域查找
通過對(duì)EL表達(dá)式的初步了解,下面我們通過練習(xí)來掌握EL表達(dá)式的使用,點(diǎn)擊此處 1494485866319_001.jpg下載案例源代碼,如下所示:
(1)創(chuàng)建一個(gè)web應(yīng)用,Example6,對(duì)該應(yīng)用的index.jsp頁(yè)面進(jìn)行編輯,如例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“的域?qū)傩?,值為”request_haha“,然后使用EL表達(dá)式將request_attribute從request域中取出,輸出在瀏覽器端。
(2)將Example6發(fā)布到服務(wù)器端,然后啟動(dòng)服務(wù)器,在瀏覽器端訪問index.jsp頁(yè)面,瀏覽器顯示結(jié)果如圖1-1所示:

1494486771877_002.jpg

圖1-1 瀏覽器顯示結(jié)果
由圖1-1可知,使用EL表達(dá)式成功的從request域中取出了數(shù)據(jù)。
(3)再次修改index.jsp頁(yè)面,如例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“的與屬性,但值各不相同?,F(xiàn)在使用EL表達(dá)式向?yàn)g覽器端輸出attribute的值,那么瀏覽器端會(huì)輸出哪個(gè)域的屬性值?
(4)再次在瀏覽器端訪問index.jsp頁(yè)面,瀏覽器顯示結(jié)果如圖1-2所示:

1494485992914_003.jpg

圖1-2 瀏覽器顯示結(jié)果
由圖1-2可知,${attribute}表達(dá)式是從pageContext域中取數(shù)據(jù)。
(5)將index.jsp頁(yè)面中的向pageContext域中存放數(shù)據(jù)的代碼注釋掉,然后再在瀏覽器端訪問index.jsp,瀏覽器顯示結(jié)果如圖1-3所示:

1494486021321_004.png

圖1-3 瀏覽器顯示結(jié)果
由圖1-3可知,el表達(dá)式是從request域中取出的數(shù)據(jù)?,F(xiàn)在再將向request域中存放數(shù)據(jù)的代碼注釋掉,再次在瀏覽器端訪問index.jsp頁(yè)面,瀏覽器顯示結(jié)果如圖1-4所示:

1494486278543_005.jpg

圖1-4 瀏覽器顯示結(jié)果
圖1-4中,el表達(dá)式取出的是session域中的屬性值,如果再將向session域存放數(shù)據(jù)的代碼注釋掉,再次訪問index.jsp頁(yè)面,瀏覽器端輸出的仍然是“session_haha“,這是因?yàn)閟ession對(duì)象還存在,那么它當(dāng)中的域?qū)傩宰匀灰簿痛嬖?,將瀏覽器關(guān)閉,再打開然后再訪問index.jsp,瀏覽器端的輸出結(jié)果如圖1-5所示:

1494486306606_005.jpg

圖1-5 瀏覽器顯示結(jié)果
通過以上對(duì)jsp四大域的操作,可以發(fā)現(xiàn)使用EL表達(dá)式獲取數(shù)據(jù)是依次從jsp的四大域中獲取,即全域查找,次序是page域,request域,session域最后是application域,如果page域中存在,就返回并結(jié)束查找,如果沒有,就去request域中查找,找到就返回并結(jié)束查找,如果request域中也沒有,那么就繼續(xù)去session域中查找,以此類推,最后查找到application域。如果這四個(gè)域中都沒有,那么EL表達(dá)式就返回一個(gè)空字符串,即在頁(yè)面上什么也不顯示,如圖1-6所示:

1494486330528_006.jpg

圖1-6 瀏覽器顯示結(jié)果
    2.2EL表達(dá)式之獲取指定域中的數(shù)據(jù)
在2.1小節(jié)中,我們學(xué)習(xí)了使用EL表達(dá)式進(jìn)行全域查找,但是進(jìn)行全域查找必然會(huì)影響效率,因此現(xiàn)在我們來學(xué)習(xí)使用EL表達(dá)式從指定域中獲取數(shù)據(jù),具體如下:
(1)再次對(duì)index.jsp頁(yè)面進(jìn)行修改,如例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中,如果要指定從哪個(gè)域中獲取數(shù)據(jù),一定要在指定的域名稱后面加上“Scope“,否則不能從指定的域中獲取數(shù)據(jù)。
(2)在瀏覽器端訪問index.jsp,瀏覽器顯示結(jié)果如圖1-7所示:

1494486358872_007.jpg

圖1-7 瀏覽器顯示結(jié)果
其實(shí),使用EL表達(dá)式獲取jsp四個(gè)域中的數(shù)據(jù):
  • 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表達(dá)式之javaBean導(dǎo)航
如果在域中保存的是javaBean對(duì)象,那么也可以使用EL表達(dá)式來訪問javaBean的屬性,因?yàn)镋L表達(dá)式只做讀操作,所以javaBean一定要為屬性提供get方法,而對(duì)set方法沒有要求。使用EL表達(dá)式獲取javaBean屬性就是javaBean導(dǎo)航。
下面通過一個(gè)案例來了解EL表達(dá)式是如何進(jìn)行JavaBean導(dǎo)航的,如下所示:
(1)在Example6應(yīng)用中,新建一個(gè)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應(yīng)用中,再次新建一個(gè)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目錄下新建一個(gè)目錄el,然后在該目錄下新建一個(gè)el.jsp文件,主要代碼如例1-6所示:
例1-6 el.jsp
<%@ page import="cn.itcast.domain.*" %><!—由于在跟頁(yè)面中需要使用Address,Employee類,所以這里需要將它們導(dǎo)入-->
  <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中,創(chuàng)建了Address和Employee的對(duì)象,并將屬性賦值,其中address對(duì)象是emp對(duì)象的一個(gè)屬性,然后將emp對(duì)象保存在request域中,再使用el表達(dá)式獲取emp對(duì)象。
(4)重新啟動(dòng)服務(wù)器,在瀏覽器端訪問el.jsp頁(yè)面,瀏覽器顯示結(jié)果如圖1-8所示:

1494486394247_008.jpg

圖1-8 瀏覽器顯示結(jié)果
現(xiàn)在想獲取該emp對(duì)象的address屬性的street屬性,el表達(dá)式該如何寫?
(5)對(duì)el.jsp頁(yè)面稍作修改,如例1-7所示:
... ...
<h3>使用el獲取request域的emp對(duì)象的address屬性的street屬性</h3>
${requestScope.emp.address.street}
   ... ...
(6)再次訪問el.jsp頁(yè)面,瀏覽器顯示結(jié)果如圖1-9所示:

1494486420529_009.jpg

圖1-9 瀏覽器顯示結(jié)果
由圖1-9可知,使用例1-7所示的el表達(dá)式成功的獲取到street屬性的值,例1-7中的el表達(dá)式就是javaBean導(dǎo)航,其底層代碼如下:
Employee _emp=(Employee)request.getAttribute("emp");
String street=_emp.getAddress().getStreet();
因此我們?cè)谇懊嫣匾鈴?qiáng)調(diào),如果域中存放的是javaBean對(duì)象,javaBean一定要為每個(gè)屬性提供get方法,因?yàn)樵谑褂胑l表達(dá)式獲取javaBen屬性時(shí),底層就是調(diào)用屬性的get方法。
(7)在Employee類中添加一個(gè)get方法,如例1-8所示:
例1-8 getHehe()方法
此處省略例1-5中的代碼
public String getHehe() {
       return "我去...";
    }
(8)在el.jsp頁(yè)面中使用el表達(dá)式輸出該方法的返回值,如例1-9所示:
此處省略例1-6中的代碼
${emp.hehe }

(9)重新啟動(dòng)服務(wù)器,訪問index.jsp頁(yè)面,瀏覽器顯示結(jié)果如圖1-10所示:

1494486447732_010.jpg


圖1-10 瀏覽器顯示結(jié)果
由圖1-10可知,Employee類中雖然沒有名稱為”hehe”的成員變量,但是提供了get方法,因此hehe就是Employee的屬性,那么在jsp頁(yè)面中就能通過el表達(dá)式${emp.hehe}輸出該方法的返回值,進(jìn)一步說明該el表達(dá)式底層就是調(diào)用javaBean的get方法。

3.EL表達(dá)式運(yùn)算符

EL是表達(dá)式語(yǔ)言,它可以進(jìn)行一些運(yùn)算,可使用的運(yùn)算符如表1-1所示:
表1-1 EL表達(dá)式運(yùn)算符
運(yùn)算符說明范例結(jié)果
+${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 “”},可以判斷字符串、數(shù)據(jù)、集合的長(zhǎng)度是否為0,為0返回true。empty還可以與not或!一起使用。${not empty “”}true
 

本文版權(quán)歸黑馬程序員Java培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!

作者:黑馬程序員Java培訓(xùn)學(xué)院

首發(fā):http://www.pantone-color.com.cn/special/hmjavaeezly/


分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!