1.什么是EL表達式
EL是Expression Language的縮寫,它是jsp內置的表達式語言,從jsp2.0開始,就不讓再使用java腳本,而是使用el表達式或動態(tài)標簽來代替java腳本。EL表達式的格式如下:
${表達式}
EL表達式代替的是java腳本中的<%= …%>,也就是說EL表達式也是向瀏覽器端輸出數據。例如${1+2}會向瀏覽器端輸出3。
2.EL表達式的使用
2.1EL表達式之全域查找
通過對EL表達式的初步了解,下面我們通過練習來掌握EL表達式的使用,點擊此處
下載案例源代碼,如下所示:
(1)創(chuàng)建一個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發(fā)布到服務器端,然后啟動服務器,在瀏覽器端訪問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“的與屬性,但值各不相同?,F在使用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域中取出的數據?,F在再將向request域中存放數據的代碼注釋掉,再次在瀏覽器端訪問index.jsp頁面,瀏覽器顯示結果如圖1-4所示:
圖1-4 瀏覽器顯示結果
圖1-4中,el表達式取出的是session域中的屬性值,如果再將向session域存放數據的代碼注釋掉,再次訪問index.jsp頁面,瀏覽器端輸出的仍然是“session_haha“,這是因為session對象還存在,那么它當中的域屬性自然也就存在,將瀏覽器關閉,再打開然后再訪問index.jsp,瀏覽器端的輸出結果如圖1-5所示:
圖1-5 瀏覽器顯示結果
通過以上對jsp四大域的操作,可以發(fā)現使用EL表達式獲取數據是依次從jsp的四大域中獲取,即全域查找,次序是page域,request域,session域最后是application域,如果page域中存在,就返回并結束查找,如果沒有,就去request域中查找,找到就返回并結束查找,如果request域中也沒有,那么就繼續(xù)去session域中查找,以此類推,最后查找到application域。如果這四個域中都沒有,那么EL表達式就返回一個空字符串,即在頁面上什么也不顯示,如圖1-6所示:
圖1-6 瀏覽器顯示結果
2.2EL表達式之獲取指定域中的數據
在2.1小節(jié)中,我們學習了使用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中,創(chuàng)建了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培訓學院
首發(fā):http://m.ko1818.cn/special/hmjavaeezly/