一、JSTL簡介
1、什么是JSTL
JSTL是Java中的一個定制標記庫集。(這個標記庫集不需要自己編寫,可以直接使用)
2、為什么要使用JSTL
- 實現了JSP頁面中的代碼復用(基於標簽庫原理,重復率較高的代碼塊支持復用,提高效率)
- 書寫JSP頁面時可讀性更強(長得很像xml,方便前端查看和參與開發)
用事實告訴你為什么使用JSTL:
實現:
但是,使用JSTL效果如下:
3、JSTL環境搭建
JSTL的下載:
下載地址:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/
下載文件:jakarta-taglibs-standard-1.1.2.zip————2004-10-25 20:57 933K
解壓文件后,在lib文件夾會獲得兩個jar包: standard.jar和jstl.jar
需要把這兩個jar包導入到項目中,注意:
載入外來包,我們不介意采取:右擊項目——Build Path方式,因為這樣只是引入了一個jar包的link進來,如果把項目挪動位置或者把jar包刪除了,則報錯。所以我們推薦直接把要載入的文件復制到:項目——WebRoot\WEB-INF\lib里面,不要忘了把jar包選中——右鍵——Build Path----Add to Build Path。這樣做可以讓jar包隨着項目走,綁在了一起。
二、EL表達式配合使用JSTL
1、JSTL小程序
如果要使用JSTL,要先導入JSTL的標簽庫,如果要進行頁面的輸出的話,需要使用<c:out>輸出標簽。<c:out>是屬於JSTL核心標簽的一個。
導入核心標簽庫:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
Ps:在uri中之所以能找到該http,是因為導入了上面兩個jar,否則是找不到的。prefix="c",里面的名字可以自定義,一般為“c”。
<c:out value="輸出內容"></c:out>
具體如下:
2、JSTL標簽的四大分類及JSTL函數
JSTL標簽中Value中的值其實可以輸出變量和常量。其中常量可以直接輸出,變量需要通過EL表達式去獲取。
3、EL表達式
什么是EL表達式?
全名是Expression Language,常常配合jstl標簽庫使用,使得JSP頁面更直觀,寫法更簡單。
比如:普通寫法:
EL表達式寫法:
EL表達式的格式:
用美元符號“$”定界,內容包括在花括號“{}”中,即${表達式}。
注意“.”和“[]”運算符:
但是:以下兩種情況,兩者不通用。
4、EL變量
如:<c:out value="${temp}"></c:out>
如果沒有做范圍的限定,會依據默認從小到大開始搜索,如果還是找不到,則輸出空字符串。
5、EL自動類型轉換
普通情況:
如果是用EL表達式:
6、EL隱式對象
7、EL運算符
對empty舉例:
<% String username="null"; request.setAttribute("username", username); %> <c:out value="${empty username}"></c:out>
Ps:如果username為null或者"",則返回true;如果username為"有內容",則返回false。
el表達式中empty運算符對字符串為Null,及空字符串都返回 TRUE。
三、JSTL核心標簽的使用
1、out標簽(表達式控制標簽)
out標簽的作用:
2、set標簽(表達式控制標簽)
set的標簽的作用:
- 存值到scope中(page,request,session,application);
- 可以將值以變量形式存放在指定范圍內,有兩種方式:
- 存值到JavaBean的屬性中。
- 需要配合target屬性指定對象並通過property屬性指定要賦值給對象的哪個屬性。
Person類:
將Person類實例化
實例化話后的變量名叫person。那實例化后如何通過set標簽向person中賦值。
變量的賦值需要配合target屬性指定對象並通過property屬性指定要賦值給對象的哪個屬性。
3、remove標簽(表達式控制標簽)
remove標簽的用法:
- 只能remove掉某個變量(不能remove某個類對象的某個屬性);
- var屬性是必選;
- scope屬性是可選。
比如:
此時運行結果就輸出不了firstName的值了。
4、catch標簽(表達式控制標簽)
catch標簽的用法:
- catch標簽中可以包含那些容易出錯的JSTL標簽(邏輯)
輸出結果:
5、if標簽(流程控制標簽)
if標簽的用法:
- 同程序中的if作用相同,用來實現分支條件控制。
- test屬性用於存放判斷的條件,一般使用EL表達式來編寫。
- var指定名稱用來存放判斷的結果類型為true或false
- scope用來存放var屬性存放的范圍。
比如:根據用戶輸入的成績進行等級判斷
運行結果:
用戶什么都沒輸入的時候,默認進來是false
輸入90:
輸入80:
6、choose、when、otherwise(流程控制標簽)
choose、when、otherwise 標簽的作用:
- 通常這三個標簽被放在一起配合使用
- <c:choose>標簽嵌套在<c:when>和<c:otherwise>標簽的外面作為他們的父標簽來使用。
- 其中choose和when標簽也可以一起組合使用。
綜上所述通常有以下兩種語法結構:
比如:
<!-- choose、when、otherwise --> <c:choose> <c:when test="${param.score<=100 && param.score>=60 }"> <c:out value="及格"></c:out> </c:when> <c:when test="${param.score<60 && param.score>=0 }"> <c:out value="不及格"></c:out> </c:when> <c:otherwise> <c:out value="請檢查你的輸入!"></c:out> </c:otherwise> </c:choose>
ps:用法類似於switch——case——default。
比如:
7、forEach(循環控制標簽)
forEach標簽的作用:
常用用法1-全部遍歷:
例子:
常用用法2-部分遍歷:(begin end)
index值是從0開始的。
例子:
常用用法3-部分遍歷中指定步長(step)
例子:
<!-- 用法三:部分遍歷並帶步長 --> <c:forEach var="fruit" items="${fruits}" begin="1" end="3" step="2"> <c:out value="${fruit}"></c:out><br> </c:forEach>
Ps:step默認值:1。
常用用法4-部分遍歷時輸出元素的狀態(varStatus)
例子:
<!-- 用法四:部分遍歷並帶狀態 --> <c:forEach var="fruit" items="${fruits}" begin="1" end="3" varStatus="fru"> <c:out value="${fruit}——四個屬性:"></c:out><br> <c:out value="index屬性:${fru.index}"></c:out><br> <c:out value="count屬性:${fru.count}"></c:out><br> <c:out value="first屬性:${fru.first}"></c:out><br> <c:out value="last屬性:${fru.last}"></c:out><br> <c:out value="----------"></c:out><br> </c:forEach>
PS:index從0開始;count從1開始;first是否第一個(boolean);last是否最后一個(boolean)。
8、forTokens(循環控制標簽)
forTokens標簽的用法:
例子:
輸出:
注:forTokens還有如下屬性,與forEach的屬性相同。
9、import(URL操作標簽)
import標簽的用法:
impor各屬性含義:
例子:
1 <!-- import標簽用法 --> 2 <!-- 導入網絡上的絕對路徑 --> 3 <c:catch var="error0"> 4 <c:import url="http://www.imooc.com"></c:import> 5 </c:catch> 6 <c:out value="${error0}"></c:out> 7 <hr> 8 <!-- 導入相對路徑文件 --> 9 <c:catch var="error1"> 10 <c:import url="Test.txt" charEncoding="gbk"></c:import> 11 </c:catch> 12 <c:out value="${error1}"></c:out>
Ps:由於可能網絡中斷導致拋出異常,所以常常把import標簽放在catch標簽里。
1 <!-- var及scope用法 --> 2 <c:catch var="error2"> 3 <c:import url="Test.txt" var="test" scope="session" charEncoding="gbk"></c:import> 4 </c:catch> 5 <c:out value="${error2}"></c:out><br> 6 <c:out value="import標簽存儲的test字符串變量值:${sessionScope.test}"></c:out> 7 8 <!-- context屬性用法 --> 9 <c:catch var="error3"> 10 <c:import url="/index1.jsp" context="/Test1"></c:import> 11 </c:catch> 12 <c:out value="${error3}"></c:out><br>
Ps1:如果沒定義var,則可以直接輸出;如果定義了var,則用c:out標簽輸出。
Ps2:第一步:改eclipse中tomcat的部署路徑,如果是灰掉的,停掉tomcat,然后clean,就可以改為第二項了(如果想在webapps生成,記得在Deploy path選擇webapps)。第二步:改conf/context.xml中加上crossContext="true"。如:<Context crossContext="true"></Context>
注意:
10、redirect標簽(URL操作標簽詳解)
redirect標簽的用法:
注意:重定向的話瀏覽器的url都變為重定向的url,而import只是載入,瀏覽器url不變。
例子:
重定向把參數值都帶到URL中去了:
獲取值:
11、url標簽(URL操作標簽)
<!-- url標簽用法 --> <c:if test="${1<2}"> <c:set var="partUrl">temp.jsp</c:set> </c:if> <c:url value="http://localhost:8080/Test/${partUrl}" var="newUrl" scope="session"></c:url> <a href="${newUrl}">New URL</a>
四、JSTL函數的使用
1、contains函數、startsWith、endsWith
contains函數表示加入的字符串是否包含字串,返回一個boolean類型的值。
1 <!-- JSTL函數使用 --> 2 <c:out value="“Hello World”字符串中是否包含“Hello”?${fn:contains('Hello World','Hello')}"></c:out> 3 <hr> 4 <c:out value="“Hello World”字符串中是否包含“ABCD”?${fn:contains('Hello World','ABCD')}"></c:out> 5 <hr> 6 <c:out value="“Hello World”字符串中是否包含“hello”(忽略大小寫)?${fn:containsIgnoreCase('Hello World','hello')}"></c:out> 7 <hr> 8 <c:out value="“Hello”是否在“Hello World”字符串開頭?${fn:startsWith('Hello World','Hello')}"></c:out> 9 <hr> 10 <c:out value="“world”是否在“Hello World”字符串尾部?${fn:endsWith('Hello World','world')}"></c:out>
Ps1:配合使用:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
2、escapeXml、indexOf
1 <!-- 不會輸出<book>標簽 --> 2 <book>書</book> 3 <hr> 4 <!-- 可輸出標簽但會出現轉義問題 --> 5 <c:out value="${fn:escapeXml('<book>書</book>')}"></c:out> 6 <hr> 7 <!-- 可輸出標簽且不會出現轉義問題 --> 8 <c:out value="<book>書</book>"></c:out> 9 <hr> 10 <!-- indexOf函數用法 --> 11 <c:out value="“Hello World”字符串“llo”出現的index值:${fn:indexOf('Hello World','llo')}"></c:out>