一、什麼是EL 表達式
全稱:Expression Language,一種寫法很是簡介的表達式。語法 簡單易懂,便於使用。表達式語言的靈感來自於ECMAScript 和
XPath 表達式語言
二、EL 表達式的做用
做用:讓jsp 書寫起來更加的方便。簡化在jsp 中獲取做用域或者請求數據的寫法。也會搭配Jstl 來進行使用。
三、使用EL 表達式
語法結構:${expression},提供.和[ ]兩種運算符來存取數據。css
使用:
a) 使用EL 表達式獲取請求數據
i. 獲取用戶請求數據
ii. 獲取請求頭數據
iii. 獲取Cookie 數據
b) 使用EL 表達式獲取做用域數據
i. 獲取做用域數據
ii. 做用域查找順序
iii. 獲取指定做用域中的數據
c) 使用EL 表達式進行運算express
i. 算術運算
ii. 關係運算
iii. 邏輯運算數組
d) EL 表達式空值判斷emptycookie
使用過程註解:session
傳統方式獲取做用域 :
缺點一:導入包
缺點二:須要強轉
缺點三:獲取數據的代碼過於麻煩
解決:使用EL表達式獲取做用域對象
使用EL 表單大師獲取做用域對象:
做用:獲取做用域對象中的數據。
注意:該表達式 只會獲取的是 pageContext,request,Session,application 四個對象中的數據,其餘數據局一律不理會。
找到了獲取返回,找不到什麼都不現實,也不報錯。
語法:
${表達式}
表達式:
獲取請求數據:
request對象存儲了請求數據-----> param.鍵名 返回值
request對象存儲了請求數據-----> paramValues.鍵名 返回的是數組
經過serAttribute 方法存儲到做用域的對象中的數據
${鍵名 } 返回鍵名所對應的值。
注意:
若是存儲的是普通字符串則直接返回
若是存儲的是對象,則返回的是對象
獲取對象中的數據:
普通對象:
${鍵名.屬性值.屬性值....}
集合:
list集合---->${鍵名[角標]} 由於lisi 存儲方式爲數組,因此取值須要以數組下標值方式取
map集合----->${鍵名.map集合存儲的鍵名}app
傳統方式獲取做用域和EL 表達式獲取做用的對比:jsp
<!-- 傳統方式獲取 做用域對象 --> <h3>EL 表達式學習:使用傳統方式獲取數據</h3> <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().getCity() %></b><br> <b><%=((HashMap)request.getAttribute("map")).get("c") %></b><br> <b><%=((HashMap<String,User>)request.getAttribute("map2")).get("a1").getAddr().getCity() %></b>
<% String str2 = "哈哈哈"; %> <!-- EL 表達式獲取做用域對象 --> <hr> <h3>EL 表達式學習:使用EL 表達式 獲取數據</h3> <b>${param.uname}</b><br> <b>${paramValues.fav[1] }</b><br> <b>${str}</b><br /> <b>${user.addr.town }</b><br> <b>${list[2] }</b><br> <b>${list2[0].addr.city }</b><br> <b>${map.c }</b><br> <b>${map2.a1.addr.city }</b><br> <!-- 找不到,由於不在四個對象中 --> <b>--${str2 }</b>
做用域查找順序:
默認查找順序:
pageContext-----> request----->session------->application
注意:
每次查找都是從小到大進行查找,找到了則獲取,找不到了繼續查取。
指定做用域查找:
做用域+Scope.鍵名 pageContext寫法(特殊):pageScope.鍵名
${pageScope.hello }--${requestScope.hello }--${sessionScope.hello }---${applicationScope.hello }
學習
<h3>EL 的做用域查找順序 </h3> <% pageContext.setAttribute("hello", "hello pageContext"); request.setAttribute("hello", "hello request"); session.setAttribute("hello", "hello session"); application.setAttribute("hello", "hello application"); %> <%--指定做用域查找 做用域+Scope.鍵名 ,pageContext寫法:pageScope.鍵名 --%> <b>${pageScope.hello }--${requestScope.hello }--${sessionScope.hello }---${applicationScope.hello }</b>
El 表達式的邏輯運算:
${邏輯表達式} && || !
${算術表達式} + - * /code
${ 關係表達式} >,<,>=, !=,%對象
特殊:三目運算符.......
注意:
+ 表示 加法 運算,不表示字符鏈接,使用EL 表達式進行字符鏈接會報錯
${a+b } 去四個做用域中找 a 和b 對應的值,作邏輯運算
${1+"2" } "2",底層自動把"2" 轉成 int 類型,作邏輯運算
${1 + 2 }---${4<1 }----${4%3 }----${sex==1?'男':'女'}----${1+"2" }
El的空值判斷:
${empty 鍵名}
做用:判斷鍵名對應的值 是否存有數據
<!-- EL 的控制判斷 --> <h3>EL 表達式的空值 </h3> ${empty s }---${empty s1 }---${empty s2 }----${empty s3 } <!-- User() 的屬性有默認值,非空,因此falses -->
請求頭數據:
${header } 返回全部請求頭數據
${header["鍵名"]} 返回指定鍵名的請求頭數據
${headerValues["鍵名"]} 返回指定的鍵名(同鍵不一樣值) 的值的數組;
獲取cookie數據:
${cookie} 返回了存儲全部cookie對象的map 集合
${cookie.JSESSIONID.value} -----${cookie.JSESSIONID.name}
返回cookie 的值 和name
<h3>EL 獲取請求頭數據和cookie 數據</h3> ${header }<br> <!-- 拿某一個數據 --> ${header["cookie"] }---${headerValues["accept-language"][0] } <hr> ${cookie }---- ${cookie.JSESSIONID.value} -----${cookie.JSESSIONID.name}