教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

JAVA培訓之EL表達式

更新時間:2016年09月29日16時23分 來源:傳智播客JAVA培訓學院 瀏覽次數:


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://fskzgqt.cn/javaee
0 分享到:
和我們在線交談!