EL

3、  EL

 

1.  EL 簡介

* 什麼是 EL?
1. EL(Expression Language,即:表達式語言),是一種簡單的語言,提供了在 JSP 中簡化 JSP 表達式的方法
2. 目的是爲了儘可能減小 JSP 頁面中的 Java 代碼,使得 JSP 頁面的處理程序編寫起來更加簡潔,便於開發和維護
3. 全部 EL 表達式的格式都是以 「${}」 表示
4. 注意:<%@ page isELIgnored="true" %> 表示是否禁用 EL 語言,TRUE 表示禁止,FALSE 表示不由止。JSP2.0 中是默認的啓用 EL 語言的
5. 全局禁用 EL 表達式,在 web.xml 中進行以下配置:
<jsp-config>
  <jsp-property-group>
    <url-pattern>*.jsp</url-pattern>
    <el-ignored>true</el-ignored>
  </jsp-property-group>
</jsp-config>

* EL 表達式提供 「.「 和 「[ ]「 兩種運算符來存取數據
1. 注意:當要存取的屬性名稱中包含一些特殊字符,如 . 或 - 等非字母或數字的符號,就必定要使用 「[ ]「 ,如:
${user.My-Name} 應當改成 ${user["My-Name"]}
2. 若是要動態取值時,就能夠用 「[ ]「 來作,而 「.「 沒法作到動態取值,如:
${requestScope.list[i]} 中的 i 是一個變量

* EL 表達式獲取變量數據的方式
1. JSP 四大做用域對象在 EL 表達式中屬性(範圍)名稱:
1)pageContext:pageScope
2)request:requestScope
3)session:sessionScope
4)application:applicationScope
2. 當 EL 表達式中的變量沒有給定做用域範圍時,則默認在 page 範圍查找,而後依次在 request、session、application 範圍查找
a.假如途中找到了變量,就直接回傳,再也不繼續找下去,可是假如所有的範圍都沒有找到時,就回傳 ""
b.咱們會發現 EL 在查找未給定範圍的變量的查詢順序是根據做用域從小到大進行查找

* EL 表達式中的邏輯運算
  1. ${邏輯表達式}:&&,||,!
  2. ${算數表達式}:+,-,*,/
  3. ${關係表達式}:>,<,==,>=,<=,!=,%
  4. ${A?B:C}:三目運算
5. ${empty 變量名}:EL 表達式的空值判斷,判斷指定變量是否存有數據
  6. 注意:"+" 表示加法運算,不表明字符鏈接,在 EL 表達式中使用 "+" 進行字符鏈接會報錯

 

2.  EL 表達式中的 11 個隱式對象

* 1. 對於什麼是隱式對象,在介紹 JSP 的九大內置對象中也說到過,隱式對象就是開發者能夠直接使用它們而不用顯式聲明

1)pageContext 對象:JSP 頁面的上下文。它能夠用於訪問 JSP 隱式對象,如請求、響應、會話、輸出、servletContext 等
a.如:${pageContext.response} 返回頁面的響應對象

2)pageScope 對象:將當前 JSP 頁面範圍的變量名稱映射到其值
a.如:使用 ${pageScope.objectName} 訪問當前 JSP 頁面範圍的對象
b.如:使用 ${pageScope.objectName.attributeName} 訪問當前 JSP 頁面範圍的對象的屬性值

3)requestScope 對象:將請求範圍的變量名稱映射到其值
a.如:使用 ${requestScope.objectName} 訪問一個 JSP 請求範圍的對象
b.如:使用 ${requestScope.objectName.attributeName} 訪問一個 JSP 請求範圍的對象的屬性值

4)sessionScope 對象:將會話範圍的變量名稱映射到其值
a.如:${sessionScope.objectName}
b.如:${sessionScope.objectName.attributeName}

5)applicationScope 對象:將應用程序範圍的變量名稱映射到其值

6)param 對象:將請求參數名稱映射到單個字符串
a.底層經過調用 ServletRequest.getParameter(String name) 方法得到
b.表達式 ${param.name} 至關於 request.getParameter(name);

7)paramValues 對象:將請求參數名稱映射到一個 String 類型的數組
a.底層經過調用 ServletRequest.getParamterValues(String name) 方法得到
b.表達式 ${paramvalues.name} 至關於 request.getParamterValues(name);

8)header 對象:將請求頭名稱映射到單個字符串
a.底層經過調用 ServletRequest.getHeader(String name) 方法得到
b.表達式 ${header.name} 至關於 request.getHeader(name);

9)headerValues 對象:將請求頭名稱映射到一個枚舉集合
a.底層經過調用 ServletRequest.getHeaders(String name) 方法得到
b.表達式 ${headerValues.name} 至關於 request.getHeaders(name);

10)cookie 對象:將 cookie 名稱映射到單個 cookie 對象
a.向服務器發出的客戶端請求能夠得到一個或多個 cookie
b.表達式 ${cookie.name.value} 返回帶有特定名稱的第一個 cookie 值
c.若是請求包含多個同名的 cookie,則應該使用 ${headerValues.name} 表達式

11)initParam 對象:將上下文初始化參數名稱映射到單個值
a.底層經過調用 ServletContext.getInitparameter(String name) 方法得到
b.表達式 ${initParam.name} 至關於 request.getInitparameter(name);

 

3.  EL 表達式實例

<%@ page language="java" import="java.util.*,com.ncdx.pojo.*" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8" isELIgnored="true" %>

<!-- 使用傳統方式獲取做用域對象的數據 
           缺點1:要導入包
           缺點2:須要強轉
           缺點3:獲取數據的代碼過於麻煩 -->
<b><%=request.getParameter("uname")%></b><br/>
<b><%=request.getAttribute("str")%></b><br/>
<b><%=((User)request.getAttribute("user")).getAddr().getTown()%></b><br/>
<b><%=((ArrayList)request.getAttribute("list")).get(2)%></b><br/>
<b><%=((ArrayList<User>)request.getAttribute("list2")).get(0).getAddr().getPre()%></b><br/>
<b><%=((HashMap<String, String>)request.getAttribute("map")).get("a")%></b><br/>
<b><%=((HashMap<String, User>)request.getAttribute("map2")).get("b").getAddr().getCity()%></b><br/>
 

<hr/>
<!-- 使用 EL 表達式獲取做用域對象的數據 -->
<b>${param.uname}</b><br/>
<b>${requestScope.str}</b><br/>
<b>${requestScope.user.addr.town}</b><br/>
<b>${requestScope.list[2]}</b><br/>
<b>${requestScope.list2[0].addr.pre}</b><br/>
<b>${requestScope.map.a}</b><br/>
<b>${requestScope.map2.b.addr.city}</b><br/>


<hr/>
<!-- EL 的做用域查找順序 -->
<%
     pageContext.setAttribute("hello", "hello pageContext");
     request.setAttribute("hello", "hello request");
     session.setAttribute("hello", "hello session");
     application.setAttribute("hello", "hello application");
%>
${hello} ${pageScope.hello} ---> ${requestScope.hello} --> ${sessionScope.hello} --> ${applicationScope.hello} <hr/> <!-- EL 獲取請求頭數據 和 Cookie 數據 --> ${header} <br/> ${headerValues["accept-language"][0]} } <br/> ${cookie} <br/> ${cookie.JSESSIONID} <br/> ${cookie.JSESSIONID.name} <br/> ${cookie.JSESSIONID.value}
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息