JSTL和EL 表示式
目錄
5、choose:實現Java語言中if-else if-else語句的功能
1、為什麼需要EL
1、JavaBean在JSP中的侷限
- 在JSP頁面中嵌入大量的Java程式碼
- 獲取JavaBean屬性必須要例項化
- 強制型別轉化
<% Employee employee = (Employee)request.getAttribute("employee"); Computer comp = employee.getComputer(); String manufacturer = comp.getManufacturer(); %>
2、解決辦法
使用EL表示式簡化
${requestScope.employee.computer.manufacturer}
2、EL表示式簡介
1、什麼是EL
- Expression Language(表示式語言)
2、EL的功能
- 替代JSP頁面中的複雜程式碼
3、EL的特點
- 自動轉換型別
- EL得到某個資料時可以自動轉換型別
- 使用簡單
4、EL表示式語法
${ EL exprission }
- 使用變數名獲取值
- 獲取物件的屬性值
- 獲取集合
1、使用變數名獲取值
- ${變數名}
<% request.setAttribute("username","LiYang"); %>
姓名: ${username}
2、變數屬性範圍名稱
屬性範圍 |
EL中的名稱 |
說明 |
page |
pageScope |
${pageScope.username},表示在page範圍內查詢username變數,找不到返回Null |
request |
requstScope |
|
session |
sessionScope |
|
application |
applicationScope |
${requstScope.username}
3、獲取物件的屬性值
<%
User user = (User )request.getAttribute("user");
user.getName();
%>
- 點操作符
${user.name}
- [ ]操作符
${user["name"]}
使用EL表示式輸出姓名
<%
Map names = new HashMap();
names.put("one","LiYang");
names.put("two","WangHua");
request.setAttribute("names",names);
%>
姓名:${names.one}<br/>
姓名:${names["two"] }<br/>
- 關係操作符
關係操作符
說明
示例
結果
==(或eq)
等於
${23==5}或${23 eq 5}
${"a" =="a"}或${"a" eq "a"}
false
true
!=(或ne)
不等於
${23!=5}或${23 ne 5}
true
<(或lt)
小於
${23<5}或${23 lt 5}
false
>(或gt)
大於
${23>5}或${23 gt 5}
true
<=(或le)
小於等於
${23<=5}或${23 le 5}
false
>=(或ge)
大於等於
${23>=5}或${23 ge 5}
ture
- 邏輯操作符
邏輯操作符
說明
示例
結果
&&(或and)
邏輯與
如果A為true,B為false,則A&&B(或A and B)
false
||(或or)
邏輯或
如果A為true,B為false,則A||B(或A or B)
true
! (或not)
邏輯非
如果A為true,則!A (或not A)
false
- Empty操作符
變數 a不存在,則${empty a}返回的結果為true
${not empty a}或${!empty a}返回的結果為false
3、EL隱式物件
作用域訪問物件:pageScope、requestScope、sessionScope、applicationScope
引數訪問物件:param、paramValues
JSP隱式物件:pageContext
物件名稱 |
說 明 |
pageScope |
返回頁面範圍的變數名,這些名稱已對映至相應的值 |
requestScope |
返回請求範圍的變數名,這些名稱已對映至相應的值 |
sessionScope |
返回會話範圍的變數名,這些名稱已對映至相應的值 |
applicationScope |
返回應用範圍內的變數,並將變數名對映至相應的值 |
param |
返回客戶端的請求引數的字串值 |
paramValues |
返回對映至客戶端的請求引數的一組值 |
pageContext |
提供對使用者請求和頁面資訊的訪問 |
4、為什麼使用JSTL
雖然EL表示式可以訪問JavaBean的屬性,但是並不能實現在JSP中進行邏輯判斷,因而要使用JSTL標籤。
5、什麼是JSTL
什麼是JSTL JSP標準標籤庫(JavaServerPages Standard Tag Library)
JSTL通常會與EL表示式合作實現JSP頁面的編碼
6、JSTL 的優點
- 提供一組標準標籤
- 可用於編寫各種動態 JSP 頁面
7、JSTL的環境搭建
使用JSTL的步驟
- 在工程中引用JSTL的兩個jar包和標籤庫描述符檔案
- 在JSP頁面新增taglib指令
-
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
使用JSTL標籤
8、 JSTL標準標籤庫內的標籤
核心標籤庫
通用標籤:set、out、remove
條件標籤:if、choose
迭代標籤:forEach
1、set:設定指定範圍內的變數值
將value值儲存到範圍為scope的變數variable中
<c:set var="variable" value=" v " scope=" scope "/>
將value值設定到物件的屬性中
<c:set value="value" target="target" property="property" />
<%
User user = new User();
request.setAttribute("user", user);
%>
<c:set target="${user}" property="name" value="defaultName " />
2、out:計算表示式並將結果輸出顯示
不指定預設值
<c:out value="value" />
指定預設值
<c:out value="value" default="default" />
<%
User user = new User();
request.setAttribute("user", user);
%>
<c:set target="${user}" property="name" value="defaultName " />
<c:out value="${user.name}" default="noUserName" />
轉義特殊字元
<p>${"<a href='http://www.baidu.com'>百度</a>"}</p>
<p>
<c:out escapeXml="Y" value="<a href='http://www.baidu.com'>百度</a>"/>
</p>
<c:out value="<a href='http://www.baidu.com'>百度</a>"/>
3、remove:刪除指定範圍內的變數
<body>
<!-- 設定之前應該是空值 -->
設定變數之前的值是:msg=<c:out value="${msg}" default="null"/>
<!-- 給變數msg設值 使用set屬性進行賦值 -->
<c:set var="msg" value="Hello ACCP!" scope="page"></c:set>
<!-- 此時msg的值應該是上面設定的"已經不是空值了" 使用out屬性輸出顯示-->
設定新值以後:msg=<c:out value="${msg}"></c:out><br>
<!-- 把 msg變數從page範圍內移除 使用remove屬性移除-->
<c:remove var="msg" scope="page"/>
<!-- 此時msg的值應該顯示null -->
移除變數msg以後:msg=<c:out value="${msg}“ default="null">
</c:out>
</body>
通用標籤的使用:
引入使用核心標籤的指令
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<body>
set 標籤用於給變數設定值和作用範圍
scope= "page|request|session|application"
<c:set var= "example" value="${100+1}" scope="session" />
out 標籤在頁面上顯示資訊或變數值
<c:out value="${example}"/>
remove 標籤用於刪除作用域內的變數
<c:remove var= "example" scope="session"/>
</body>
4、if:實現Java語言中if語句的功能
<c:if test="codition" var="name" scope="applicationArea" >
…
</c:if>
判斷登入:
<body>
<c:set var="isLogin" value="${empty sessionScope.user}"/>
<c:if test="${isLogin}">
…登入表單
</c:if>
<c:if test="${! isLogin}">
已經登入!
</c:if>
</body>
5、choose:實現Java語言中if-else if-else語句的功能
<c:choose var="varName" scope="scope">
<c:when test="condition1">
主體內容
</c:when>
<c:when test="condition2">
主體內容
</c:when>
<c:otherwise>
主體內容
</c:otherwise>
</c:choose >
6、 forEach:實現對集合中物件的遍歷
通過迭代標籤顯示商品列表:
<%
List products = GoodsDao.getAllProducts();
request.setAttribute("products", products);
%>
…
<!-- 迴圈輸出商品資訊 -->
<c:forEach var="product" items="${requestScope.products}" varStatus="status">
<!-- 如果是偶數行,為該行換背景顏色 -->
<tr <c:if test="${status.index % 2 == 1 }">style="background-color:rgb(219,241,212);"</c:if>>
<td>${product.name }</td>
<td>${product.area }</td>
<td>${product.price }</td>
</tr>
</c:forEach>
通過迭代標籤遍歷Map:
<%
Map<String,String> map=new HashMap<String,String>();
map.put("tom", "美國");
map.put("lily", "英國");
map.put("jack","中國");
request.setAttribute("map", map);
%>
<c:forEach var="entry" items="${map}">
${entry.key}
${entry.value}<p>
</c:forEach>
forEach:指定迭代的次數
<c:forEach begin="start" end="end" step="count">
…迴圈體程式碼…
</c:forEach>
<c:forEach begin="1" end="5" step= "2">
<c:out value="*"></c:out>
</c:forEach>