JavaEE--EL表達(dá)式(六)

一、EL表達(dá)式

1. EL簡(jiǎn)介:

表達(dá)式語(yǔ)言(Expression Language)簡(jiǎn)稱(chēng)EL,它是JSP2.0中引入的一個(gè)新內(nèi)容。通過(guò)EL可以簡(jiǎn)化在JSP開(kāi)發(fā)中對(duì)對(duì)象的引用,從而規(guī)范頁(yè)面代碼,增加程序的可讀性及可維護(hù)性。

2. EL有以下幾個(gè)特點(diǎn):

EL可以與JSTL結(jié)合使用,也可以與JavaScript語(yǔ)句結(jié)合使用;
EL中會(huì)自動(dòng)進(jìn)行類(lèi)型轉(zhuǎn)換。如果想通過(guò)EL輸入兩個(gè)字符串型數(shù)值的和,可以直接通過(guò)”+”號(hào)進(jìn)行連接,如${num1+num2};
EL不僅可以訪問(wèn)一般變量,還可以訪問(wèn)JavaBean中的屬性以及嵌套屬性和集合對(duì)象;
在EL中可以獲得命名空間(PageContext對(duì)象,它是頁(yè)面中所有其他內(nèi)置對(duì)象的最大范圍的集成對(duì)象,通過(guò)它可以訪問(wèn)其他內(nèi)置對(duì)象);
在使用EL進(jìn)行除法運(yùn)算時(shí),如果除數(shù)為0,則返回?zé)o窮大Infinity,而不是錯(cuò)誤;
在EL中可以訪問(wèn)JSP的作用域(request、session、application以及page);
擴(kuò)展函數(shù)可以與Java類(lèi)的靜態(tài)方法進(jìn)行映射。

3. 與低版本的環(huán)境兼容——禁用EL

目前只要安裝的Web服務(wù)器能夠支持Servlet 2.4/JSP 2.0,就可以在JSP頁(yè)面中直接使用EL。由于在JSP2.0以前版本中沒(méi)有EL,所以JSP為了和以前的規(guī)范兼容,還提供了禁用EL的方法。有以下三種方法:
1)、使用斜杠”\”
只需要在EL的起始標(biāo)記“$”前加上”\”即可;
2)、使用page指令
使用JSP的page指令也可以禁用EL表達(dá)式,語(yǔ)法格式如下;
<%@ page isELIgnored=”布爾值”%> true為禁用EL
3)、在web.xml文件中配置<el-ignored>元素

<jsp-config>  
       <jsp-property-group>  
              <url-pattern>*.jsp</url-pattern>  
              <el-ignored>true</el-ignored>  
       </jsp-property-group>  
</jsp-config> 

二、EL的語(yǔ)法

${  EL exprission }
${  bean.name } 或  ${  bean['name'] }
<%@ page isELIgnored ="true|false" %>

三、EL運(yùn)算符

算術(shù)運(yùn)算符有五個(gè):+、-、*或$、/或div、%或mod
關(guān)系運(yùn)算符有六個(gè):==或eq、!=或ne、<或lt、>或gt、<=或le、>=或ge
邏輯運(yùn)算符有三個(gè):&&或and、||或or、!或not
其它運(yùn)算符有三個(gè):Empty運(yùn)算符、條件運(yùn)算符、()運(yùn)算符

1、通過(guò)EL訪問(wèn)數(shù)據(jù)

??通過(guò)EL提供的”[]”和”.”運(yùn)算符可以訪問(wèn)數(shù)據(jù)。通常情況下這兩個(gè)運(yùn)算符是等價(jià)的,可以相互代替。
??但也不是所有情況下都可以相互代替,例如當(dāng)對(duì)象的屬性名中包含一些特殊的符號(hào)(-或.)時(shí),就只能使用[]來(lái)訪問(wèn)對(duì)喜愛(ài)那個(gè)的屬性。例如{userInfo[user-id]}是正確的,而{userInfo.user-name}是錯(cuò)誤的。
下面給出通過(guò)這兩運(yùn)算符訪問(wèn)數(shù)據(jù)的例子:

1)、獲取數(shù)組元素(只能使用[],不能用.)
<%  
       String[] str = {"一號(hào)" , "二號(hào)" , "三號(hào)" , "四號(hào)" , "五號(hào)"};  
       request.setAttribute("user",str);  
  
%>  
<%  
       String[] str1 =(String[])request.getAttribute("user");  
       for(int i=0; i < str1.length; i++){  
              request.setAttribute("rt",i);  
%>  
       ${rt}: ${user[rt] }<br>  
<% }%> 
2)、List集合元素的獲取(只能使用[],不能用.)
<%  
       List<String> list = newArrayList<String>();  
       list.add("一號(hào)");  
       list.add("二號(hào)");  
       list.add("三號(hào)");  
      session.setAttribute("user",list);  
%>  
<%  
       List<String> list1 =(List<String>)session.getAttribute("user");  
       for(int i = 0 ; i < list1.size() ;i++){  
             request.setAttribute("rt",i);  
%>  
       ${rt}: ${user[rt] }<br>  
<%  }%>  

2、在EL中進(jìn)行算術(shù)運(yùn)算

運(yùn)算符 功能 示例 結(jié)果

+   加   ${1+1}  2
-   減   ${1-1}  0
*   乘   ${2*2}  4
/或div   除   ${2/1}或${2 div 1}   2
        ${2/0}或${2 div 0}   Infinity
%或 mod  求余  ${3%2}或${3mod2} 1
        ${3%0}或${3 mod0}    異常:java.lang.ArithmeticException:/by zero

3、在EL中判斷對(duì)象是否為空

??通過(guò)empty運(yùn)算符實(shí)現(xiàn),用來(lái)確定一個(gè)對(duì)象或比那輛是否為null或空,格式如下:

 ${empty expression}
<%request.setAttribute("user" , "");%>  
         <%request.setAttribute("user1"  , null);%>  
         <%request.setAttribute("user2"  , 2);%> 
         ${emptyuser}       //返回值為true  
         ${emptyuser1}     //返回值為true  
         ${emptyuser2}    //返回值為false  

4、在EL中進(jìn)行邏輯關(guān)系運(yùn)算

   在EL中,通過(guò)邏輯運(yùn)算符和關(guān)系運(yùn)算符可以實(shí)現(xiàn)邏輯關(guān)系運(yùn)算。
<%  
       request.setAttribute("userName","張三");  
       request.setAttribute("pwd","123456");  
  
%>  
userName= ${userName }<br>  
pwd= ${pwd }<br>  
\${userName!= "" and (pwd == "asd" )}  
${userName!= "" and (pwd == "asd" )}<br>  
\${userName== "張三" and pwd == "123456" }  
${userName== "張三" and pwd == "123456" }<br>  

5、在EL中進(jìn)行條件運(yùn)算

   在EL中進(jìn)行條件運(yùn)算,唯一的優(yōu)點(diǎn)在于其非常簡(jiǎn)單方便,和Java語(yǔ)言中的用法完全一致,其語(yǔ)法格式如下:
   ${條件表達(dá)式? 表達(dá)式1 : 表達(dá)式2}
   例如:${1==1 ? “對(duì)”: “錯(cuò)“}

6. EL的隱含對(duì)象

查找的范圍從page,request,session,application

隱式對(duì)象 作用
pageContext 對(duì)應(yīng)于JSP頁(yè)面中的pageContext對(duì)象
pageScope 代表page域中用于保存屬性的Map對(duì)象
requestScope 代表request域中用于保存屬性的Map對(duì)象
sessionScope 代表session域中用于保存屬性的Map對(duì)象
applicationScope 代表application域中用于保存屬性的Map對(duì)象
param 表示一個(gè)保存了所有請(qǐng)求參數(shù)的Map對(duì)象
paramValues 表示一個(gè)保存了所有請(qǐng)求參數(shù)的Map對(duì)象,它對(duì)于某個(gè)請(qǐng)求參數(shù), 返回的是一個(gè)string類(lèi)型數(shù)組
header 表示一個(gè)保存了所有http請(qǐng)求頭字段的Map對(duì)象
headerValues 表示一個(gè)保存了所有http請(qǐng)求頭字段的Map對(duì)象,返回string類(lèi)型數(shù)組
cookie 表示一個(gè)保存了所有cookie的Map對(duì)象
initParam 表示一個(gè)保存了所有web應(yīng)用初始化參數(shù)的map對(duì)象
1)pageContext對(duì)象
 EL表達(dá)式中的pageContext隱式對(duì)象與JSP頁(yè)面中的pageContext對(duì)象相對(duì)應(yīng),EL表達(dá)式可以通過(guò)pageContext隱式對(duì)象訪問(wèn)其它JSP隱式對(duì)象,如訪問(wèn)request、response對(duì)象屬性時(shí),可以使用表達(dá)式${pageContext.request.requestURI}

表達(dá)式${pageContext.response.contentType}等。

2)代表特定域?qū)傩缘碾[式對(duì)象

??EL表達(dá)式中的pageScope、requestScope、sessionScope和applicationScope四個(gè)隱式對(duì)象分別用于訪問(wèn)JSP頁(yè)面的page、request、session、application四個(gè)域中的屬性。例如,表達(dá)式{pageScope.userName}返回page作用域中的userName屬性的值,表達(dá)式{sessionScope.bookName}返回session作用域中的bookName屬性的值。
??在EL表達(dá)式中也可以不使用這些隱式對(duì)象來(lái)指定查找域,而是直接引用這些域中的屬性名稱(chēng)。例如,表達(dá)式${userName}就會(huì)在page、request、session、application這四個(gè)作用域內(nèi)按順序依次查找userName屬性,直到找到為止。

3)代表請(qǐng)求參數(shù)的隱式對(duì)象

??EL表達(dá)式中的隱式對(duì)象param和paramValues用于獲取客戶端訪問(wèn)JSP頁(yè)面時(shí)傳遞的請(qǐng)求參數(shù)的值,由于HTTP協(xié)議允許使用一個(gè)請(qǐng)求參數(shù)名出現(xiàn)多次,即一個(gè)請(qǐng)求參數(shù)可能會(huì)有多個(gè)值,所以,EL表達(dá)式提供了param和paramValues這兩個(gè)隱式對(duì)象來(lái)分別獲取請(qǐng)求參數(shù)的某個(gè)值和所有值。
??Param隱式對(duì)象用于返回一個(gè)請(qǐng)求參數(shù)的某個(gè)值,如果同一個(gè)請(qǐng)求參數(shù)有多個(gè)值,則返回第一個(gè)參數(shù)的值。paramValues隱式對(duì)象用于返回一個(gè)請(qǐng)求參數(shù)的所有值,返回結(jié)果為該參數(shù)的所有值組成的字符串?dāng)?shù)組,例如表達(dá)式${paramValues.username[0]}用于返回?cái)?shù)組中第一個(gè)元素的值。

<form action="" method="get" name="form1"  >  
       <input name="user" type="text"value="張三">  
       <input type="submit">  
</form>  
${param.user}  
4)代表HTTP請(qǐng)求消息的隱式對(duì)象

??EL表達(dá)式中的隱式對(duì)象header和headerValues用于獲取客戶端訪問(wèn)JSP頁(yè)面時(shí)傳遞的請(qǐng)求頭字段的值。由于HTTP協(xié)議允許一些請(qǐng)求頭字段出現(xiàn)多次,即一個(gè)請(qǐng)求頭字段可能會(huì)有多個(gè)值,所以,EL表達(dá)式提供了header和headerValues兩個(gè)隱式對(duì)象分別用于獲取請(qǐng)求頭字段的某個(gè)值和所有值。
??header隱式對(duì)象返回一個(gè)請(qǐng)求頭字段的某個(gè)值,如果同一個(gè)請(qǐng)求頭字段有多個(gè)值,則返回第一個(gè)值,例如,使用表達(dá)式${header.referer}可以非常方便的獲取referer請(qǐng)求頭字段的值。headerValues隱式對(duì)象用于返回一個(gè)請(qǐng)求頭字段所有值組成的字符串?dāng)?shù)組。

${header[“connection”]}
5)cookie隱式對(duì)象

??EL表達(dá)式中的隱式對(duì)象cookie是一個(gè)代表所有Cookie信息的Map集合,Map集合中元素的關(guān)鍵字為各個(gè)Cookie的名稱(chēng),值則為對(duì)應(yīng)的Cookie對(duì)象。使用cookie隱式對(duì)象可以訪問(wèn)某個(gè)Cookie對(duì)象,這些Cookie對(duì)象則是通過(guò)調(diào)用HTTPServletRequest.getCookies()方法得到的,如果多個(gè)Cookie共用一個(gè)名稱(chēng),則返回Cookie對(duì)象數(shù)組中的第一個(gè)Cookie對(duì)象。例如,要訪問(wèn)一個(gè)名為userName的Cookie對(duì)象,可以使用表達(dá)式${cookie.userName}。

6)initParam隱式對(duì)象

??EL表達(dá)式中的initParam是一個(gè)代表Web應(yīng)用程序中的所有初始化參數(shù)的Map對(duì)象,每個(gè)初始化參數(shù)的值是ServletContext.getInitParameter(String name)方法返回的字符串。Web應(yīng)用程序的初始化參數(shù)可以通過(guò)兩種方式來(lái)配置,分別是在server.xml文件中配置和在web.xml文件中配置,具體如下:
(1)在server.xml文件中配置Web應(yīng)用程序的初始化參數(shù):
(2)在web.xml文件中配置Web應(yīng)用程序的初始化參數(shù):
在web.xml文件中設(shè)置一個(gè)初始化參數(shù)user:

<context-param>
     <param-name>user</param-name>
      <param-value>張三</param-value>
</context-param>

使用EL獲取該參數(shù):

     ${initParam.user}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容