1.什么是EL表達(dá)式
EL是Expression Language的縮寫,它是jsp內(nèi)置的表達(dá)式語言,從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á)式之全域查找
通過對EL表達(dá)式的初步了解,下面我們通過練習(xí)來掌握EL表達(dá)式的使用,點(diǎn)擊此處
下載案例源代碼,如下所示:
(1)創(chuàng)建一個(gè)web應(yīng)用,Example6,對該應(yīng)用的index.jsp頁面進(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ū)傩裕禐椤眗equest_haha“,然后使用EL表達(dá)式將request_attribute從request域中取出,輸出在瀏覽器端。
(2)將Example6發(fā)布到服務(wù)器端,然后啟動(dòng)服務(wù)器,在瀏覽器端訪問index.jsp頁面,瀏覽器顯示結(jié)果如圖1-1所示:
圖1-1 瀏覽器顯示結(jié)果
由圖1-1可知,使用EL表達(dá)式成功的從request域中取出了數(shù)據(jù)。
(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“的與屬性,但值各不相同?,F(xiàn)在使用EL表達(dá)式向?yàn)g覽器端輸出attribute的值,那么瀏覽器端會(huì)輸出哪個(gè)域的屬性值?
(4)再次在瀏覽器端訪問index.jsp頁面,瀏覽器顯示結(jié)果如圖1-2所示:
圖1-2 瀏覽器顯示結(jié)果
由圖1-2可知,${attribute}表達(dá)式是從pageContext域中取數(shù)據(jù)。
(5)將index.jsp頁面中的向pageContext域中存放數(shù)據(jù)的代碼注釋掉,然后再在瀏覽器端訪問index.jsp,瀏覽器顯示結(jié)果如圖1-3所示:
圖1-3 瀏覽器顯示結(jié)果
由圖1-3可知,el表達(dá)式是從request域中取出的數(shù)據(jù)?,F(xiàn)在再將向request域中存放數(shù)據(jù)的代碼注釋掉,再次在瀏覽器端訪問index.jsp頁面,瀏覽器顯示結(jié)果如圖1-4所示:
圖1-4 瀏覽器顯示結(jié)果
圖1-4中,el表達(dá)式取出的是session域中的屬性值,如果再將向session域存放數(shù)據(jù)的代碼注釋掉,再次訪問index.jsp頁面,瀏覽器端輸出的仍然是“session_haha“,這是因?yàn)閟ession對象還存在,那么它當(dāng)中的域?qū)傩宰匀灰簿痛嬖冢瑢g覽器關(guān)閉,再打開然后再訪問index.jsp,瀏覽器端的輸出結(jié)果如圖1-5所示:
圖1-5 瀏覽器顯示結(jié)果
通過以上對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è)空字符串,即在頁面上什么也不顯示,如圖1-6所示:
圖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)再次對index.jsp頁面進(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所示:
圖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對象,那么也可以使用EL表達(dá)式來訪問javaBean的屬性,因?yàn)镋L表達(dá)式只做讀操作,所以javaBean一定要為屬性提供get方法,而對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.*" %><!—由于在跟頁面中需要使用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的對象,并將屬性賦值,其中address對象是emp對象的一個(gè)屬性,然后將emp對象保存在request域中,再使用el表達(dá)式獲取emp對象。
(4)重新啟動(dòng)服務(wù)器,在瀏覽器端訪問el.jsp頁面,瀏覽器顯示結(jié)果如圖1-8所示:
圖1-8 瀏覽器顯示結(jié)果
現(xiàn)在想獲取該emp對象的address屬性的street屬性,el表達(dá)式該如何寫?
(5)對el.jsp頁面稍作修改,如例1-7所示:
... ...
<h3>使用el獲取request域的emp對象的address屬性的street屬性</h3>
${requestScope.emp.address.street}
... ... |
(6)再次訪問el.jsp頁面,瀏覽器顯示結(jié)果如圖1-9所示:
圖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();
因此我們在前面特意強(qiáng)調(diào),如果域中存放的是javaBean對象,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頁面中使用el表達(dá)式輸出該方法的返回值,如例1-9所示:
此處省略例1-6中的代碼
${emp.hehe } |
(9)重新啟動(dòng)服務(wù)器,訪問index.jsp頁面,瀏覽器顯示結(jié)果如圖1-10所示:
圖1-10 瀏覽器顯示結(jié)果
由圖1-10可知,Employee類中雖然沒有名稱為”hehe”的成員變量,但是提供了get方法,因此hehe就是Employee的屬性,那么在jsp頁面中就能通過el表達(dá)式${emp.hehe}輸出該方法的返回值,進(jìn)一步說明該el表達(dá)式底層就是調(diào)用javaBean的get方法。
3.EL表達(dá)式運(yùn)算符
EL是表達(dá)式語言,它可以進(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ù)、集合的長度是否為0,為0返回true。empty還可以與not或!一起使用。${not empty “”} | true |
本文版權(quán)歸黑馬程序員Java培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!
作者:黑馬程序員Java培訓(xùn)學(xué)院
首發(fā):http://3rdspacecomics.com/special/hmjavaeezly/