標籤:傳遞 擷取 contain out sts container otherwise style 好的
JSTL和EL的使用
是簡化代碼,如果你以前用JAVA內嵌程式碼時會這麼做
<%names = request.getAttribute("name");%>
jsp代碼...
<%for(int i=0;i<names.length;i++){
String name=names.get(i);
%>
<tr>
<td>
<%=name%>
</td>
</tr>
<%}%>
如果你用JSTL+EL的話就不用這麼麻煩了,而且企業也不會像上面代碼一樣操作的,主要是代碼量巨大,如果用Jstl+El的話就好多了
<c:forEach var=‘name‘ items=‘${names}‘>//此句是Jstl運算式
<tr>
<td>
${name}//此句是El運算式
</td>
</tr>
//就可以觀看性來就肯定是JSTL+El容易理解,而且他能動擷取來自伺服器傳過來的值,與JSP實現高度耦合。
上述為對比
下述為舉例說明
使用JSTL前的準備
想要使用JSTL,首先需要給工程匯入JSTL的包(JSTL.jar和standard.jar).
JSTL標籤庫
在JSTL中分為以下五個標籤
- 核心標籤
- 格式化標籤
- SQL標籤
- XML標籤
- JSTL函數
使用不同的標籤的時候需要在JSP中引入不同的庫
核心標籤(Core):
引入標籤庫
1 |
<% @taglib prefix= "c" uri= "http://java.sun.com/jsp/jstl/core" %> |
<c:set>
<c:set> 等同於JSP中的 session的setAttribute() 方法
使用方法:
1.<c:set var=”名字” value=”值”/>
2.<c:set var=”名字”>值</c:set>
<c:out>
<c:out> 等同於 JSP中的 <%= %>
使用方法:
<c:out value=”需要輸出的值”>
在這裡可以用EL運算式來進行輸出session中的Attrbute
例:
<c:set var=”test” value=”這是一個測試”><c:out value=”${test}”>
輸出結果: 這是一個測試
<c:remove>
<c:remove> 和c:set標籤正好相反,c:set標籤是設定setAttrbute 這個標籤則是 刪除 Attrbute中設定的值 等同於 session中的removeAttrbute()方法
使用方法:
<c:remove var=”名字”/>
<c:if>
<c:if> 等同於 java 中的 if 語句
使用方法:
<c:if test=”條件”>滿足條件執行的JSP代碼</c:if>
<c:catch>
<c:catch> 類似於 java 中的 try
使用方法:
<c:catch var=”名字”>JSP代碼</c:catch>
如果在執行過程中,JSP代碼發生了錯誤,那麼將會複製給名字,因此我們可以通過判斷名字是否為NULL 來進行判斷是否有異常發生
例:
<c:catch var=”testException”><% int i = 5/0; %></c:catch><c:if test=”${testException != null}”>
上面的代碼有錯誤發生
</c:if>
輸出結果: 上面的代碼有錯誤發生
如果將 上面的 0 改為 3 則沒有任何輸出結果
<c:choose> 和 <c:when>
<c:choose> 和 <c:when> 類似於 java 中的 switch 和 case
使用方法:(c:choose中可以有多個c:when標籤)
<c:choose><c:when test=”條件”>處理</c:when><c:when test=”條件”>處理</c:when></c:choose>
例:
<c:set var=”test” value=”10”/><c:choose><c:when test=”${test > 5}”>test 大於5</c:when><c:when test=”${test < 5}”>test小於5</c:when></c:choose>
輸出結果: test大於5
<c:otherwise>
<c:otherwise> 等同於 java switch 中的 default
使用方法
<c:choose><c:otherwise>處理</c:otherwise></c:choose>
當choose 中的 when 沒有滿足條件的時候 會執行 otherwise 中的內容
注意: choose 和 when 和 otherwise 是一組 when 和 otherwise 必須寫在choose中
<c:import>
使用方法:
<c:import var=”date” url=”http://www.baidu.com” />
通過上面的寫法會將 百度 的原始碼返回到 date 變數中,使用
<c:out value=”${date}”>
輸出
<c:forEach> 和 <c:forTokens>
類似於JAVA中的 FOR迴圈 和 FOREACH迴圈
使用方法:
<c:forEach var=”名字(i)” begin=”開始數字(1)” end=”結束數字(5)”>${i}</c:forEach>
輸出結果是1 2 3 4 5
使用方法:
<c:forTokens items=”a,b,c,d,e” delims=”,” var=”name”>${name}</c:forTokens>
輸出結果 a b c d e
forEach類似於JAVA中 for 迴圈 設定一個開始數字 begin 設定一個結束數字 end 然後每次迴圈都會將值賦值給 var 另外還有個 setp參數 裡面可以設定值 意思是每次增加幾個數
forTokens類似於JAVA中的foreach 在items中放一個組 然後 delims設定以什麼分割 然後 將分割後迴圈的值賦值給 var 如果 items中存放的是一個集合 那麼可以不用寫delims 這樣每迴圈一次 就會取出集合中的一個放在 var中
<c:redirect>
類似於service中的重新導向
使用方法:
<c:redirect url=”http://www.baidu.com”/>
重新導向到百度去
另外還有<c:url> 和 <c:param>兩個標籤
EL運算式介紹:
EL運算式定義規則:以 $ 開頭 內容寫在 {} 中 例: ${test}
當然,因為EL運算式所有的代碼都是寫在{}中的,所以我們也可以在裡面寫運算
比如:
${test+100}
最終輸出的結果就是test這個變數加上數字100後的值了
再比如
${test != null}
最終輸出的結果就是一個true 通過這種方式 我們可以很好的和JSTL結合起來一起使用.
EL中的運算子分為 . 和 [] 兩種
如果要動態取值 可以使用[] 比如:
${session.user[date]}
其中的date是一個變數
上面代碼的意思是 取出 session.user這個數組裡面的第 date 個元素
需要注意的是,EL運算式限制了我們調用JAVA方法,如果想要調用,可以自訂一個TAG
EL運算式尋找順序(都是針對Attrbute()):
如果使用類似於 ${username} 的時候沒有在哪一個範圍尋找username 那麼它會以:
- Page
- Request
- Session
- Application
為順序來進行尋找,加入中途找到了 username 那麼就會傳回值 如果一路沒找到 返回 null
EL運算式的隱性變數:
從這裡開始就是介紹EL運算式的隱性變數,通過這些隱性變數可以讓我們簡便完成很多複雜的操作:
pageContext |
用來訪問JSP的隱性對象 |
pageScope |
page對象的MAP |
requestScope |
request對象的MAP |
requestScope |
request對象的MAP |
sessionScope |
session對象的MAP |
applicationScope |
application對象的MAP |
param |
包含請求參數字串的MAP |
paramValues |
包含請求參數字串數組的MAP |
header |
包含要求標頭字串的MAP |
headerValues |
包含要求標頭字串數組的MAP |
cookie |
按名稱儲存請求附帶的cookie的MAP |
例:假設我們是想要session中的name值 那麼我們可以使用:
${sessionScope.name}
再例:我們想要獲得GET或則POST傳遞過來的name參數,在以前我們只能使用:
request.getParameter(name);
使用EL運算式可代替為:
${param.name}
同樣,如果我們想要得到一個參數的數組,可以使用:
${paramValues.name}
當然,返回的是一個數組對象.
源自其他博主分析的jstl+el整理